Japanese
Leave Your Message

FBX-Modelldateistruktur erklärt

Das FBX-Format wird von nahezu allen 3D-Engines unterstützt und ist ein proprietäres Format für 3D-Modelle, das von Autodesk entwickelt wurde. Es unterstützt Eckpunkte, Indizes, Normalen, UV-Koordinaten, Materialien und Animationen.
Autodesk stellt offiziell das FBX SDK bereit, mit dem FBX-Dateien und andere Bibliotheken für denselben Zweck importiert und exportiert werden können. Das SDK bietet zwei Schnittstellen: eine in C++ und eine in Python.
Sie können auch eigene FBX-Parser schreiben, um Abhängigkeiten von anderen Bibliotheken zu vermeiden.
Die Struktur einer FBX-Datei wird in diesem Artikel beschrieben. Ihr Verständnis ermöglicht es uns, einen eigenen, schlanken FBX-Parser zu schreiben. Beispiele für solche Parser finden Sie im Blender-Plugin „FBX Importer/Exporter“.
Das FBX-Format ist in ASCII (Textdatei, für Menschen lesbar) oder Binär verfügbar.

    1. FBX-Dateistruktur

    Dies ist eine Beispiel-FBX-Datei.
    Als Erstes ist zu beachten, dass einige Zeilen mit einem Semikolon beginnen: Dies sind Kommentare und müssen beim Lesen der Datei ignoriert werden.
    Nach dem ersten Kommentar wird die Kennung FBXHeaderExtension gefunden. Dies ist der erste Hauptknoten der Dateistruktur. Das FBX-Dateiformat ist tatsächlich eine Baumstruktur, die folgendem Schema folgt:
    FBX-Modelldateistruktur erklärt (1)
    Jeder Knoten oder Kindknoten kann eigene spezifische Attribute besitzen. Attribute können auch außerhalb des Hauptknotens gefunden werden, sind aber in der Regel vernachlässigbar. Im Allgemeinen ist die Grundstruktur eines Knotens wie folgt:
    Knotenname: eventual_properties {
    Node_Property_1: Wert
    Node_Property_2: Wert
    Subnode1 : {
    Subnode_Property_1: Wert
    […]
    }
    Node_Property_3: Wert
    […]
    }
    Dies ist ein Knoten (der erste), der in der Beispieldatei gefunden wurde:
    FBXHeaderExtension: {
    FBXHeaderVersion: 1003
    FBXVersion: 6100
    Erstellungszeitstempel: {
    Version: 1000
    Jahr: 2014
    Monat: 03
    Tag: 20
    Stunde: 17
    Minute: 38
    Zweitens: 29
    Millisekunde: 0
    }
    Ersteller: „FBX SDK/FBX Plugins Build 20070228“
    Andere Flags: {
    FlagPLE: 0
    }
    }
    Das Verständnis von Struktur ist die Grundlage für das Schreiben eines effizienten Parsers.
    Im ersten Knoten finden wir zwei Attribute (FBXHeaderVersion und FBXVersion), deren Werte Formatversionen sind. In diesem Fall ist es Version 6.1. Die übrigen Informationen können ignoriert werden, es sei denn, man möchte auch das Erstellungsdatum (CreationTimeStamp) auslesen.

    2. FBX-Objektknoten

    Der wichtigste Knoten ist definitiv der Objektknoten.
    Der Objektknoten enthält die Eckpunkte, Indizes, Normalen, UV-Koordinaten und Materialien des Modells. Seine Struktur ist wie folgt:
    Objekte: {
    Modell: 'Modellname', 'Mesh' {
    [...]
    Eckpunkte: [...]
    PolygonVertexIndex: [...]
    LayerElementNormal: { }
    LayerElementUV: { }
    }
    Material: 'Materialname', '' { }
    [...]
    }

    3. FBX-Vertex

    Wie wir gesehen haben, können Eckpunkte in der 'Vertex'-Eigenschaft der Kindknoten des Modells gefunden werden.
    Die Syntax lautet wie folgt:
    Eckpunkte: v1_x, v1_y, v1_z, v2_x, v2_y, v2_z, [...]
    Jeder Eckpunkt besitzt drei räumliche Koordinaten (x, y, z), die durch Kommas getrennt sind (wodurch auch die Eckpunkte voneinander getrennt werden). Die Koordinaten werden selbstverständlich in Dezimalform mit Punkten angegeben.
    Ein Beispiel hierfür ist folgendes:
    Eckpunkte: 0,000000,0,104800,39,291698,0,000000,0,043400,-44,424301,0,000000,38,654301,-41,818802,-0,000000,39,455002,44,424400
    Die Eckpunkte, aus denen das Modell besteht, sind:
    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. Eckpunktindex des FBX-Polygons

    Der Index befindet sich unter der Eigenschaft PolygonVertexIndex.
    FBX-Dateien können Dreiecke oder größere Polygone exportieren. Die meisten Dateien exportieren Vierecke. Die Syntax ähnelt der von Eckpunkten, aber es gibt eine Sache zu beachten:
    PolygonVertexIndex: i1, i2,-i3, i4, i5,-i6,[...]
    PolygonVertexIndex: i1, i2, i3, -i4, i5, i6, i7, -i8, [...]
    Die Indizes eines Polygons sind der Reihe nach geordnet; ein negativer Index bedeutet, dass es sich um den letzten Index des Polygons handelt. Der Index muss auf eine positive Zahl gesetzt werden, von der dann 1 subtrahiert werden muss!
    [Falls Sie sich fragen, warum: Der ursprüngliche Index ist ein Alles-oder-Nichts-Index mit -1. Beispielsweise wird aus Index 3 der Wert -4.]
    Das Beispiel lautet wie folgt:
    PolygonVertexIndex: 8,7,3,-7,4,8,7,-3,0,5,8,-5
    Die Polygone, aus denen das Modell besteht, sind:
    p1(8,7,3,6)
    p2(4,8,7,2)
    p3(0,5,8,4)
    Beachten Sie, dass der Index, der das Ende des Polygons angibt, auf eine positive Zahl gesetzt wurde, und subtrahieren Sie dann 1 davon.
    Hinweis: Grafikkarten mögen keine Vierecke, daher muss jedes Polygon mit vier Seiten vor der Anzeige des Modells in zwei Dreiecke aufgeteilt werden.

    5. FBX-Normalen

    Die Normalenvektoren befinden sich im untergeordneten Knoten „LayerElementNormal“ der Eigenschaft „Normals“ (der wiederum ein untergeordneter Knoten von „Model“ ist). Die Syntax ist dieselbe wie für einen der Eckpunkte, d. h. eine Reihe von (x,y,z)-Koordinaten.
    Normalen: n1_x, n1_y, n1_z, n2_x, n2_y, n2_z, [...]
    Sie müssen die Eigenschaft „MappingInformationType“ beachten, die folgende Werte annehmen kann:
    ▪ ByPolygon: by polygon, was bedeutet, dass jedes Polygon des Modells eine Normale besitzt.
    ▪ ByPolygonVertex: Die Verarbeitung erfolgt polygonweise, d. h. jeder Eckpunkt jedes Polygons des Modells besitzt eine Normale. Hat das Modell beispielsweise 8 Eckpunkte, die vier Vierecke bilden, ergeben sich 16 Normalen (1 Normale * 4 Polygone * 4 Polygon-Eckpunkte). Beachten Sie, dass Spiel-Engines üblicherweise nur eine Normale pro Eckpunkt benötigen. Finden Sie einen Eckpunkt mit mehreren Normalen, können Sie entweder die nachfolgenden Normalen ignorieren oder den Durchschnitt aller Normalen berechnen (Normalenglättung).
    ▪ ByVertex: Vertex-basierte Verarbeitung, d. h. jeder Vertex des Modells besitzt eine Normale. Manchmal auch als „ByVertice“ bezeichnet, wie es im Blender-Exportprogramm steht. Ich glaube, der Autor ist Spanier.
    ▪ ByEdge: Verarbeitung pro Kante, das bedeutet, dass jede Kante des Modells eine Normale (selten) hat.
    ▪ AllSame: Dies bedeutet, dass jeder Eckpunkt des Modells die gleiche Normale hat, was bei den meisten Modellen selten oder unmöglich ist.
    Eine weitere wichtige Eigenschaft ist die ReferenceInformationType-Eigenschaft, die folgende Werte annehmen kann:
    ▪ Direkt: zeigt an, dass die Normalen geordnet sind.
    ▪ IndexToDirect (oder Index in älteren Versionen des FBX-Formats): Gibt an, dass die Reihenfolge der Normalen durch die Eigenschaft NormalsIndex bestimmt wird.
    Nachfolgend finden Sie ein grafisches Beispiel, das die Sachlage möglicherweise besser veranschaulicht als der Text. Das Beispielmodell ist eine Ebene auf der X- und Y-Achse (alle Eckpunkte haben also die Z-Koordinate 0) und besteht aus 9 Eckpunkten und 4 Polygonen (Vierecken). Die Abbildung zeigt die Ebene von oben.
    FBX-Modelldateistruktur erklärt (2)

    6. FBX UV-Koordinaten

    Die UV-Koordinaten befinden sich in der UV-Eigenschaft des untergeordneten Knotens LayerElementUV (der wiederum ein untergeordneter Knoten von Model ist). Die Syntax ähnelt der von Eckpunkten und Normalen, allerdings werden hier nur zwei statt drei Koordinaten angegeben.
    UV: u1, v1, u2, v2, [...]
    Beachten Sie weiterhin die Eigenschaften `MappingInformationType` und `ReferenceInformationType`! Diese beiden Eigenschaften können dieselben Werte wie die Normalen haben, daher gelten dieselben Regeln. Die Index-Eigenschaft (falls vorhanden, d. h. `IndexToDirect` definiert ist) ist `UVIndex`.