Mozilla et Khronos annoncent la création d'un standard ouvert pour définir une API 3D en javascript, sur l'élément canvas en particulier. (voir le billet de Tristan pour plus d'info).

Comme à l'époque de l'apparition de canvas, resurgissent les questionnements sur l'utilité d'une API[1] face à des formats existants comme SVG pour la 2D, et X3D/WRML pour la 3D. Pour quoi faire une API alors que des formats existent ?

Réponse : parce que ce n'est pas du tout fait pour le même usage.

Un document (SVG,X3D ou autre), c'est statique. Je peux le trimballer où je veux. D'ailleurs, je n'ai pas à le "programmer". Je sors un outils comme Inkscape pour faire un joli dessin ou logo avec ma souris, je l'enregistre au format SVG, et je peux alors le lier dans une page web, l'utiliser comme îcone d'un programme (dans le bureau KDE par ex). Comme c'est du vectoriel, je peux l'afficher en gros, en petit. Je peux l'envoyer par mail, le compresser, le détruire. Bref. C'est un document comme n'importe quel document, et c'est utilisable en dehors du contexte web.

Canvas, c'est comme si vous aviez un tableau blanc dans votre page web. Et avec son API 2D et bientôt 3D, c'est comme si vous disposiez de crayons de couleurs et autres outils de dessin.

Ainsi, avec canvas et ses API, je ne peux pas faire la même chose qu'avec un document. Ce que je dessine avec mes crayons de programmeur, je ne peux pas le trimballer où je veux. Je ne peux pas en faire un document.

Par contre je peux faire d'autres choses que je ne peux faire avec un document. Je peux faire des animations, sans être limité à la structure d'un format d'un document. Je dessine ce que je veux, d'une manière simple, et surtout dynamiquement. C'est donc idéal par exemple pour représenter à l'écran des choses qui bougent tout le temps. Il est impossible par exemple d'utiliser un document SVG pour dessiner une scène 3D dans laquelle le point de vue change tous le temps (comme dans un jeu comme Quake). Ce serait en tout cas absolument inefficace. Essayez donc de réaliser la même chose que cette démo 3D, avec du SVG ou X3D. Bon courage ! D'ailleurs, la future API 3D va être utile pour ce genre d'application : les performances seront bien meilleures qu'avec l'api 2D actuelle de canvas, et la programmation sera simplifiée.

Il n'y a pas, bien sûr, que les jeux où canvas est utile. Représenter des graphes de statistiques dynamiquement, manipuler le rendu d'autres éléments HTML, comme dans une des démos de Paul, faire des éditeurs de dessins, ou l'utiliser comme surface de rendu d'un éditeur de texte et j'en passe et des meilleurs... L'utilisation de canvas va bien au délà de ce qu'on peut faire avec un document SVG/X3D.

À contrario, utiliser canvas pour afficher simplement un logo, aussi complexe qu'il serait, est assez ridicule, vu le nombre de lignes de code qu'il faudrait taper. Utiliser un document SVG est plus pertinent. Mieux que du PNG d'ailleurs, puisqu'on peut utiliser le même document pour afficher le logo en taille différente, ce qui permet de diminuer les temps de téléchargement (le SVG est placé dans le cache du navigateur). C'est d'ailleurs je pense l'une des raisons de l'implémentation de SVG dans les navigateurs modernes destinés aux mobiles et cie...

Bref, les usages de SVG/X3D et de canvas ne sont pas les mêmes, et n'ont d'ailleurs pas les mêmes résultats. C'est comme si on comparait un 4x4 et une voiture de sport. Ces deux types de véhicules permettent tout deux de se déplacer. Ils ont 4 roues, un volant, un moteur. Mais on ne les utilisent pas forcement pour les mêmes raisons et de la même façon. Si on veut faire une course sur circuit, on utilisera une voiture de sport. Mais si on veut rouler sur des chemins accidentés, on utilisera un 4x4.

Notes

[1] API= Application Programming Interface; C'est un ensemble de fonctions à utiliser dans un programme pour réaliser diverses tâches