Plan :
- Introduction
- Présentation de la library Assimp
- Fonctionnement de la library Assimp
- Fichiers .obj et .mtl
- Exemple
Introduction :
Il est très complexe, voire impossible, de dessiner des objets complexes (corps humain, ...) avec du code seulement(complexité). En plus le code produit dépendera du langage avec lequel il est codé (portabilité).Chez les éditeurs de jeux, le grahisme du jeu est réalisé par un graphiste qui , en général, n'y connait rien en programmation, il réalise ses scènes à l'aide des logiciels de modélisation 3D, comme Blender, Maya, ... Ensuite ces modèles sont importés dans le programme qui est le jeu.
Les modèles sont générés suivant un format ou extension qui dépend du logiciel de modélisation 3D, par exemple pour blender c'est un fichier .blend .
pour importer ces modèles on a besoin d'un parser, pour l'instant il n'y a pas de parser standard, les développeurs de jeux, en général, codent leurs propres parsers.
Présentation de la librairie Assimp :
Assimp (Open Asset import ) est une librairie open source, conçue pour faciliter la vie aux développeurs de jeux en C/C++, en se chargeant d'importer aisément les modèles 3D des graphistes.
- Elle supporte plusieurs formats : .blend, .obj, ...
- Importe les armatures.
- bien structurée.
- facilement configurable.
pour plus d'informations : Assimp .
aiNode : ce noeud contient les objets de la scène .
aiMesh : ce noeud contient le maillage(vertices, faces, ...) des objets (aiNodes) .
aiMaterial : ce noeud contient les matériaux afféctés aux maillages des objets de la scène.
aiTexture : contient les textures qui sont incluses dans le fichier modèle. mais généralement les textures sont des fichiers images à part qui ne sont pas forcèment incluses dans le fichier modèle, dans ce cas ce n'est pas Assimp qui les charge .
aiAnimation : contient les séquences de keyframe .
aiBone : contient les armatures des objets .
Comment Assimp orechestre toutes ses structures ?
Imaginons une scène simple de 2 objets simples, pas de texture, chaque objet se référe à 2 meshes, un matériau est appliqué à tous les meshes de l'objet .
Après le chargement du modèle avec Assimp nous aurons ceci (image ci-dessous) dans le noeuds aiScene.
Figure 2 : La logique de Assimp
les meshes de l'objet 1 sont stockés dans le noeud aiMesh, objet 1 contient un tableau ou sont stockés des indices, ces indices sont les indices de meshes dans le tableau des meshes stockés dans le noeud aiMesh .
De la même façon, un mesh a l'indice du matériau utilisé pour ce mesh. (l'indice de son matériau dans le tableau de matériaux du noeud aiMaterial) .
1) Maillage :
Encapsule le maillage du pion : les vertices, les indices, ainsi que l'indice du matériau.
2) Materiau :
c'est le matériau utilisé pour le pion, c'est la représentation des différents paramètres du fichier pion.mtl : Ka : lumière ambiante, Ks : Lumière spéculaire, etc.
elle utilise la fonction ReadFile() de la classe Importer d'Assimp, la méthode ReadFile() admet comme paramètre le nom du fichier à importer et des flags .
flags ?
ce sont des constantes définies dans le fichier postprocess.h de la librairie Assimp, et qui permettent de configurer le chargements du modèle, et parfois optimiser le rendement.
exemple : Parfois les faces d'un maillage contiennent plus de 3 indices, cependant pour avoir un rendement optimal on a besoin qu'une face ait 3 indices pas plus, le flag aiProcess_Triangulate divise toutes les faces (qui ont plus de 3 indices) en triangles lors du chargement .
le nom de la clé respecte cette convention de nommage : AI_MATKEY_NOMPROPRIETE.
par exemple pour une colour ambiente : AI_MATKEY_COLOR_AMBIENT.
pour récupérer un matériau on utilise la fonction Get(key) de la classe aiMaterial .
Vous pouvez télécharger le code à partir de Github : https://github.com/hlYassine/assimpTest.git
Figure 3 : l'exécution du programme
Fonctionnement de la librarie Assimp:
La libraire Assimp analyse le fichier à importer, si il est d'un format compatible avec Assimp, ses données seront structurées suivant une arborescence (voir l'image ci-dessous) propre à la librairie .
Figure 1 : La structure arborescente de Assimp
aiScene : est le root de l'arbre. Représente toute la scène du modèle, on peut accéder à n'importe quel noeud de l'arbre à partir du root.Figure 1 : La structure arborescente de Assimp
aiNode : ce noeud contient les objets de la scène .
aiMesh : ce noeud contient le maillage(vertices, faces, ...) des objets (aiNodes) .
aiMaterial : ce noeud contient les matériaux afféctés aux maillages des objets de la scène.
aiTexture : contient les textures qui sont incluses dans le fichier modèle. mais généralement les textures sont des fichiers images à part qui ne sont pas forcèment incluses dans le fichier modèle, dans ce cas ce n'est pas Assimp qui les charge .
aiAnimation : contient les séquences de keyframe .
aiBone : contient les armatures des objets .
Comment Assimp orechestre toutes ses structures ?
Imaginons une scène simple de 2 objets simples, pas de texture, chaque objet se référe à 2 meshes, un matériau est appliqué à tous les meshes de l'objet .
Après le chargement du modèle avec Assimp nous aurons ceci (image ci-dessous) dans le noeuds aiScene.
Figure 2 : La logique de Assimp
les meshes de l'objet 1 sont stockés dans le noeud aiMesh, objet 1 contient un tableau ou sont stockés des indices, ces indices sont les indices de meshes dans le tableau des meshes stockés dans le noeud aiMesh .
De la même façon, un mesh a l'indice du matériau utilisé pour ce mesh. (l'indice de son matériau dans le tableau de matériaux du noeud aiMaterial) .
Fichiers .obj et .mtl :
Le paragraphe suivant (Exemple) est une petite démonstration de la librairie Assimp, dans laquelle je vais charger un fichier .obj qui décrit la géométrie du pion réalisé dans l'artcile "Le pion" du même blog .
un fichier .obj est un fichier qui contient la description d'une géométrie 3D (vertices, faces, normales, ...) .
un fichier .obj est un fichier qui contient la description d'une géométrie 3D (vertices, faces, normales, ...) .
un fichier .mtl est un fichier sur lequel se base le fichier .obj pour affecter un matériau à l'objet du modèle .(lumière ambiante, lumière spéculaire, ....)
pour plus d'informations : http://people.sc.fsu.edu/~jburkardt/data/data.html
Exemple:
Ceci est une petite démonstration de la librairie Assimp.
le dossier objets contient les fichiers pion.obj et pion.mtl généré via Blender .Outils :
- Langage C++
- SDL2
- openGL 3.1
- GLSL 1.4
- Assimp
Code :
Je vais me contenter d'expliquer la classe Objet qui cache la logique de la librairie Assimp .Structure de la classe:
La classe Objet contient 2 classes imbriquées :1) Maillage :
Encapsule le maillage du pion : les vertices, les indices, ainsi que l'indice du matériau.
2) Materiau :
c'est le matériau utilisé pour le pion, c'est la représentation des différents paramètres du fichier pion.mtl : Ka : lumière ambiante, Ks : Lumière spéculaire, etc.
Méthodes :
chargerModele() :
comme son nom l'indique c'est la méthode qui charge le fichier pion.obj.elle utilise la fonction ReadFile() de la classe Importer d'Assimp, la méthode ReadFile() admet comme paramètre le nom du fichier à importer et des flags .
flags ?
ce sont des constantes définies dans le fichier postprocess.h de la librairie Assimp, et qui permettent de configurer le chargements du modèle, et parfois optimiser le rendement.
exemple : Parfois les faces d'un maillage contiennent plus de 3 indices, cependant pour avoir un rendement optimal on a besoin qu'une face ait 3 indices pas plus, le flag aiProcess_Triangulate divise toutes les faces (qui ont plus de 3 indices) en triangles lors du chargement .
initFromScene() :
Cette méthode récupère le maillage du pion et l'indice du matériau puis fait appel à initObjet() et initMateriau() .initObjet() :
Le noeud aiMesh ne contient pas seulement l'indice du matériau mais principalement : les vertices et les indices. la méthode initObjet() récupère ces vertices et leurs indices qu'on va mettre après dans les buffers d'openGL pour l'affichage du pion .initMateriau() :
cette méthode initialise le matériau du pion, un matériau est défini par un ensemble de propriété accessible par leurs clés définies dans le fichier material.h d'Assimp.le nom de la clé respecte cette convention de nommage : AI_MATKEY_NOMPROPRIETE.
par exemple pour une colour ambiente : AI_MATKEY_COLOR_AMBIENT.
pour récupérer un matériau on utilise la fonction Get(key) de la classe aiMaterial .
Vous pouvez télécharger le code à partir de Github : https://github.com/hlYassine/assimpTest.git
Figure 3 : l'exécution du programme


