04 January 2009

Développement d'une API 3D en C++

Après avoir acquis les bases nécessaires à la modélisation d'objets et de scènes 3D sous Blender, je me suis tout naturellement tourné vers le développement. En effet, mon apprentissage de Blender n'a pour seul but de concrétiser la création de mes propres personnages, objets et niveaux en 3D en vue de les inclure dans un jeu vidéo ou toute autre application en trois dimensions. Il m'était donc indispensable d'appréhender le développement d'applications 3D. Pour ne pas commencer par un trop gros projet, j'ai entrepris la programmation d'une API (Application Programming Interface) me permettant de lire et charger facilement en mémoire des objets 3D, tout en fournissant bien entendu la possibilité d'afficher ceux-ci à l'écran, sous diverses coutures et en appliquant moults fonctionnalités.

Constat: cela faisait longtemps que je ne m'étais pas autant amusé à programmer ! J'ai sélectionné une arme de premier choix: le C++, version orientée objet et optimisée du très célèbre langage C. J'avais déjà fait un peu de C++ par le passé, mais j'étais rouillé. Aujourd'hui, grâce à mes travaux, j'ai pu réapprendre à programmer avec ce langage, et même à améliorer mes connaissances et compétences. A l'heure actuelle, je n'ai rencontré aucun obstacle que je n'ai pu franchir en m'appliquant correctement tout en lisant didacticiels et références. En ce qui concerne les aspects 3D, j'utilise l'API OpenGL, bien sûr, vu qu'il est libre et qu'il se marie très bien avec le C++. Mais c'est aussi parceque j'avais déjà un peu d'expérience dans le domaine, je dois bien l'avouer. Mes études universitaires n'y sont pas pour rien.

Alors, cette interface de programmation, que diable fait-elle? Le fait est qu'OpenGL fournit un ensemble de fonctionnalités et routines procédurales et pas vraiment orientées objet. Or, ce dernier paradigme est crucial pour tout bon développeur qui se respecte (et pour tout bon logiciel, soit dit en passant). Dès lors, je me suis attellé à la création d'une API fournissant diverses classes d'objet C++ permettant de gérer les aspects 3D d'un programme. Ainsi, j'ai conçu des objets Vertex, des Face, des VertexNormal, des ShadedFace ou encore des WFObject (objets 3D chargés à partir d'un fichier Wavefront, d'extension .obj). Concrètement, il est ainsi possible de représenter un mesh 3D à partir de ces objets. Chaque mesh est composé d'un nombre défini de points dans l'espace, appellés vertices (le pluriel de vertex). Quatre vertices peuvent représenter une face, et un grand nombre de faces assemblées les unes aux autres forment un objet en trois dimensions. Plus il y a de faces, plus l'objet possède une géométrie agréable à regarder et proche de la réalité. L'API que j'ai développée permet ainsi de mettre facilement en musique tout ces concepts, de lire toutes les données requises pour la création d'un objet dans un fichier, et d'afficher l'objet en 3D à l'écran par le simple appel d'une méthode nommée draw().

Suite à de nombreuses lignes de code (et de nombreuses heures), j'ai pu représenter des objets 3D construits à partir de faces à 3 ou 4 points. Ces faces possèdent également des normales (vecteurs directeurs) permettant de définir correctement la diffusion de la lumière sur l'objet (cf la photo de cet article). Je peux donc désormais charger dans une application 3D de ma création, tout objet 3D conçu par mes soins via Blender. Voici déjà un premier pas franchi vers la création de logiciels 3D avancés, comme par exemple... des jeux vidéo!

Les prochaines étapes du développement de cette API sont la prise en charge des matériaux associés à l'objet (couleur diffuse, spéculaire, degré de brillance, etc.) ainsi que des textures et leurs coordonnées. Ensuite, je compte définir des bounding boxes sur mes objets afin de définir les limites de leur volume dans l'espace, ce qui permet d'appliquer un algorithme de détection de collisions !

Stay tuned, comme on dit.


No comments: