Japanese
Leave Your Message

Explication de la structure des fichiers de modèle FBX

Le format FBX est pris en charge par la quasi-totalité des moteurs 3D et est un format propriétaire pour les modèles 3D développés par Autodesk. Il prend en charge les sommets, les indices, les normales, les coordonnées UV, les matériaux et les animations.
Autodesk propose officiellement le kit de développement logiciel (SDK) FBX, qui permet d'importer et d'exporter des fichiers FBX ou d'autres bibliothèques ayant la même finalité. Ce SDK offre deux interfaces : l'une en C++ et l'autre en Python.
Vous pouvez également écrire des analyseurs FBX personnalisés pour éviter les dépendances vis-à-vis d'autres bibliothèques.
La structure d'un fichier FBX est décrite dans cet article. La comprendre permet de créer un analyseur FBX personnalisé et léger. Pour des exemples d'analyseurs FBX personnalisés, vous pouvez consulter le plugin Importer/Exporter FBX de Blender.
Le format FBX est disponible en ASCII (fichier texte, lisible par l'homme) ou en binaire.

    1. Structure du fichier FBX

    Ceci est un exemple de fichier FBX.
    La première chose à noter est que certaines lignes commencent par un point-virgule : ce sont des commentaires et il faut les ignorer lors de la lecture du fichier.
    Après le commentaire initial, on trouve l'identifiant FBXHeaderExtension. Il s'agit du premier nœud principal de la structure du fichier. Le format de fichier FBX est en effet une structure arborescente qui suit le schéma suivant :
    Explication de la structure des fichiers de modèle FBX (1)
    Chaque nœud ou nœud enfant peut avoir ses propres attributs spécifiques. Des attributs peuvent également se trouver en dehors du nœud principal, mais ils peuvent généralement être ignorés. En général, la structure de base d'un nœud est la suivante :
    Nom du nœud : eventual_properties {
    Node_Property_1 : valeur
    Node_Property_2 : valeur
    Sous-nœud1 : {
    Sous-nœud_Propriété_1 : valeur
    […]
    }
    Node_Property_3 : valeur
    […]
    }
    Voici un nœud (le premier) trouvé dans le fichier d'exemple :
    FBXHeaderExtension : {
    FBXHeaderVersion : 1003
    Version FBX : 6100
    CreationTimeStamp : {
    Version : 1000
    Année : 2014
    Mois : 03
    Jour : 20
    Heure : 17
    Minute : 38
    Deuxième : 29
    Milliseconde : 0
    }
    Créateur : « FBX SDK/FBX Plugins build 20070228 »
    Autres indicateurs : {
    Drapeau : 0
    }
    }
    La compréhension de la structure est la base de l'écriture d'un analyseur syntaxique efficace.
    Dans le premier nœud, on trouve deux attributs (FBXHeaderVersion et FBXVersion) dont les valeurs correspondent à des versions de format. Ici, il s'agit de la version 6.1. Les autres informations peuvent être ignorées, sauf si l'on souhaite également consulter la date de création (CreationTimeStamp).

    2. Nœuds d'objets FBX

    Le nœud le plus important est sans aucun doute le nœud objet.
    Le nœud objet contient les sommets, les indices, les normales, les coordonnées UV et les matériaux du modèle. Sa structure est la suivante :
    Objets : {
    Modèle : « nom du modèle », « Mesh » {
    [...]
    Sommets : [...]
    Index des sommets du polygone : [...]
    LayerElementNormal : { }
    LayerElementUV : { }
    }
    Matériau : « nom du matériau », « { } »
    [...]
    }

    3. Sommet FBX

    Comme nous l'avons vu, les sommets se trouvent dans la propriété « Vertex » des nœuds enfants du modèle.
    La syntaxe est la suivante :
    Sommets : v1_x, v1_y, v1_z, v2_x, v2_y, v2_z, [...]
    Chaque sommet possède trois coordonnées spatiales (x, y, z), séparées par des virgules (qui séparent également les sommets entre eux). Ces coordonnées sont exprimées sous forme décimale avec des points.
    Voici un exemple :
    Sommets : 0,000000,0,104800,39,291698,0,000000,0,043400,-44,424301,0,000000,38,654301,-41,818802,-0,000000,39,455002,44,424400
    Les sommets qui composent le modèle seront :
    v1(0,000000,0,104800,39,291698)
    v2(00.000000,0.043400,-44.424301)
    v3(0,000000,38,654301,-41,818802)
    v4(0,000000,39,455002,44,424400)

    4. Indice du sommet du polygone FBX

    L'index se trouve dans la propriété PolygonVertexIndex.
    Les fichiers FBX peuvent exporter des polygones trilatéraux (triangles) ou plus. La plupart des fichiers exportent des polygones quadrilatéraux (quadrilatères). La syntaxe est similaire à celle des sommets, mais il y a un point important à noter :
    Index des sommets du polygone : i1, i2, -i3, i4, i5, -i6, [...]
    Index des sommets du polygone : i1, i2, i3, -i4, i5, i6, i7, -i8, [...]
    Les indices qui composent un polygone sont séquentiels ; un indice négatif indique qu'il s'agit du dernier indice du polygone. L'indice doit être défini sur un nombre positif, puis il faut lui soustraire 1.
    [Si vous vous demandez pourquoi, c'est parce que l'indice d'origine est binaire (tout ou rien) avec -1. Par exemple, l'indice 3 devient -4.]
    Voici un exemple :
    Index des sommets du polygone : 8,7,3,-7,4,8,7,-3,0,5,8,-5
    Les polygones qui composent le modèle seront :
    p1(8,7,3,6)
    p2(4,8,7,2)
    p3(0,5,8,4)
    Notez que l'indice indiquant la fin du polygone a été défini sur un nombre positif, puis soustrayez 1 de ce nombre.
    Rappel : les cartes graphiques n'apprécient pas les quadrilatères ; par conséquent, chaque polygone à quatre côtés doit être divisé en deux triangles avant l'affichage du modèle.

    5. Normes FBX

    Les normales se trouvent dans le nœud enfant LayerElementNormal de la propriété Normals (qui est lui-même un nœud enfant de Model). La syntaxe est identique à celle d'un sommet, c'est-à-dire une série de coordonnées (x, y, z).
    Normales : n1_x, n1_y, n1_z, n2_x, n2_y, n2_z, [...]
    Vous devez prêter attention à la propriété MappingInformationType, qui peut prendre les valeurs suivantes :
    ▪ ByPolygon : par polygone, ce qui signifie que chaque polygone du modèle a une normale.
    ▪ Par sommet de polygone : ce traitement s’effectue par sommet de polygone, ce qui signifie que chaque sommet de chaque polygone du modèle possède une normale. Par exemple, si le modèle comporte 8 sommets formant quatre quadrilatères, il y aura 16 normales (1 normale × 4 polygones × 4 sommets de polygone). Notez que les moteurs de jeu n’ont généralement besoin que d’une seule normale par sommet. Par conséquent, si vous rencontrez un sommet avec plusieurs normales, vous pouvez soit ignorer les normales suivantes, soit calculer la moyenne de toutes les normales (lissage des normales).
    ▪ ByVertex : traitement par sommet, ce qui signifie que chaque sommet du modèle possède une normale. Parfois appelé ByVertice, comme indiqué dans l’exportateur Blender. Je crois que l’auteur est espagnol.
    ▪ ByEdge : traité par arête, ce qui signifie que chaque arête du modèle a une valeur normale (rare)
    ▪ AllSame : cela signifie que chaque sommet du modèle a la même normale, ce qui est rare ou impossible pour la plupart des modèles.
    Une autre propriété importante est la propriété ReferenceInformationType, qui peut prendre les valeurs suivantes :
    ▪ Direct : indique que les valeurs normales sont ordonnées.
    ▪ IndexToDirect (ou index dans les anciennes versions du format FBX) : indique que l’ordre des normales est donné par la propriété NormalsIndex.
    Vous trouverez ci-dessous un exemple graphique qui sera peut-être plus clair que le texte. Le modèle est un plan sur les axes X et Y (tous ses sommets ont donc une coordonnée Z de 0), composé de 9 sommets et de 4 polygones (quadrilatères). L'image d'exemple représente une vue de dessus du plan.
    Explication de la structure des fichiers de modèle FBX (2)

    6. Coordonnées UV FBX

    Les coordonnées UV se trouvent dans la propriété UV du nœud enfant LayerElementUV (lui-même enfant de Model). La syntaxe est similaire à celle des sommets et des normales, mais il y aura deux coordonnées au lieu de trois.
    UV : u1, v1, u2, v2, [...]
    Il est toujours important de prêter attention aux propriétés MappingInformationType et ReferenceInformationType ! Ces deux propriétés peuvent avoir les mêmes valeurs que les normales ; les mêmes règles s’appliquent donc. La propriété index (le cas échéant, c’est-à-dire si IndexToDirect est défini) est UVIndex.