Japanese
Leave Your Message

Wyjaśnienie struktury pliku modelu FBX

Format FBX jest obsługiwany przez niemal wszystkie silniki 3D i jest zastrzeżonym formatem modeli 3D opracowanym przez firmę Autodesk. Obsługuje wierzchołki, indeksy, normalne, współrzędne UV, materiały i animacje.
Autodesk oficjalnie udostępnia pakiet FBX SDK, który umożliwia importowanie i eksportowanie plików FBX lub innych bibliotek o podobnym przeznaczeniu. Pakiet SDK udostępnia dwa interfejsy: jeden w C++, a drugi w Pythonie.
Można również pisać własne parsery FBX, aby uniknąć zależności od innych bibliotek.
W tym artykule opisano strukturę pliku FBX. Jej zrozumienie pozwala na napisanie własnego, lekkiego parsera FBX. Przykłady własnych parserów FBX można znaleźć we wtyczce Blendera do importowania/eksportowania plików FBX.
Format FBX jest dostępny w formacie ASCII (plik tekstowy, czytelny dla człowieka) lub binarnym.

    1. Struktura pliku FBX

    Oto przykładowy plik FBX.
    Pierwszą rzeczą, na którą należy zwrócić uwagę, jest fakt, że niektóre wiersze zaczynają się od średnika: są to komentarze, które należy zignorować podczas czytania pliku.
    Po początkowym komentarzu znajduje się identyfikator FBXHeaderExtension. Jest to pierwszy główny węzeł struktury pliku. Format pliku FBX to w istocie struktura drzewa, która przebiega według następującego schematu:
    Wyjaśnienie struktury pliku modelu FBX (1)
    Każdy węzeł lub węzeł podrzędny może mieć własne, specyficzne atrybuty. Atrybuty można również znaleźć poza węzłem głównym, ale zazwyczaj można je zignorować. Ogólnie rzecz biorąc, podstawowa struktura węzła wygląda następująco:
    nazwa węzła: eventual_properties {
    Node_Property_1: wartość
    Node_Property_2: wartość
    Podwęzeł1: {
    Subnode_Property_1: wartość
    […]
    }
    Node_Property_3: wartość
    […]
    }
    Oto węzeł (pierwszy) znaleziony w pliku przykładowym:
    FBXHeaderExtension: {
    FBXHeaderVersion: 1003
    Wersja FBX: 6100
    CreationTimeStamp: {
    Wersja: 1000
    Rok: 2014
    Miesiąc: 03
    Dzień: 20
    Godzina: 17
    Minuta: 38
    Drugi: 29
    Milisekunda: 0
    }
    Twórca: „FBX SDK/FBX Plugins build 20070228”
    OtherFlags: {
    Flaga: 0
    }
    }
    Zrozumienie struktury stanowi podstawę napisania wydajnego parsera.
    W pierwszym węźle znajdują się dwa atrybuty (FBXHeaderVersion i FBXVersion), których wartościami są wersje formatu. W tym przypadku jest to wersja 6.1. Pozostałe informacje można zignorować, chyba że chcemy również odczytać datę utworzenia (CreationTimeStamp).

    2. Węzły obiektów FBX

    Najważniejszym węzłem jest bez wątpienia węzeł obiektu.
    Węzeł obiektu zawiera wierzchołki, indeksy, normalne, współrzędne UV i materiały modelu. Jego struktura jest następująca:
    Obiekty: {
    Model: 'nazwa modelu', 'Siatka' {
    [...]
    Wierzchołki: [...]
    PolygonVertexIndex: [...]
    LayerElementNormal: { }
    ElementWarstwyUV: { }
    }
    Materiał: 'nazwa materiału', '' { }
    [...]
    }

    3. Wierzchołek FBX

    Jak widzieliśmy, wierzchołki można znaleźć we właściwości „Wierzchołek” węzłów podrzędnych modelu.
    Składnia jest następująca:
    Wierzchołki: v1_x, v1_y, v1_z, v2_x, v2_y, v2_z, [...]
    Każdy wierzchołek ma trzy współrzędne przestrzenne (x, y, z), rozdzielone przecinkami (oddzielającymi również poszczególne wierzchołki). Współrzędne są oczywiście wyrażone w postaci dziesiętnej za pomocą kropek.
    Przykładem jest:
    Wierzchołki: 0,000000,0,104800,39,291698,0,000000,0,043400,-44,424301,0,000000,38,654301,-41,818802,-0,000000,39,455002,44,424400
    Wierzchołki tworzące model to:
    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. Indeks wierzchołków wielokąta FBX

    Indeks można znaleźć pod właściwością PolygonVertexIndex.
    Pliki FBX mogą eksportować wielokąty trójboczne (trójkąty) i więcej. Większość plików eksportuje wielokąty czworoboczne (czworokąty). Składnia jest podobna do składni wierzchołków, ale jest jedna rzecz, na którą należy zwrócić uwagę:
    PolygonVertexIndex: i1, i2,-i3, i4, i5,-i6,[...]
    PolygonVertexIndex: i1, i2, i3, -i4, i5, i6, i7, -i8, [...]
    Indeksy tworzące wielokąt są uporządkowane. Indeks ujemny oznacza, że ​​jest to ostatni indeks wielokąta. Indeks należy ustawić na liczbę dodatnią, a następnie odjąć od niego 1!
    [Jeśli zastanawiasz się dlaczego, to dlatego, że oryginalny indeks to wszystko albo nic z wartością -1. Na przykład indeks 3 staje się -4]
    Przykład jest następujący:
    PolygonVertexIndex: 8,7,3,-7,4,8,7,-3,0,5,8,-5
    Wielokąty tworzące model to:
    p1(8,7,3,6)
    p2(4,8,7,2)
    p3(0,5,8,4)
    Należy zwrócić uwagę, że indeks oznaczający koniec wielokąta został ustawiony na liczbę dodatnią, a następnie należy od niego odjąć 1.
    Przypomnienie: Karty graficzne nie lubią czworokątów, dlatego każdy wielokąt mający cztery boki musi zostać podzielony na dwa trójkąty przed wyświetleniem modelu.

    5. Normalne FBX

    Wartości normalne można znaleźć w węźle podrzędnym LayerElementNormal właściwości Normals (który z kolei jest węzłem podrzędnym Modelu). Składnia jest taka sama jak dla jednego z wierzchołków, tj. serii współrzędnych (x, y, z).
    Normalne: n1_x, n1_y, n1_z, n2_x, n2_y, n2_z, [...]
    Należy zwrócić uwagę na właściwość MappingInformationType, która może przyjmować następujące wartości:
    ▪ ByPolygon: według wielokąta, co oznacza, że ​​każdy wielokąt modelu ma normalną.
    ▪ ByPolygonVertex: przetwarzane przez wierzchołek wielokąta, co oznacza, że ​​każdy wierzchołek każdego wielokąta modelu ma normalną. Na przykład, jeśli model ma 8 wierzchołków tworzących cztery czworokąty, będzie 16 normalnych (1 normalna * 4 wielokąty * 4 wierzchołki wielokąta). Należy pamiętać, że zazwyczaj silniki gier potrzebują wierzchołków, aby zdefiniować tylko jedną normalną. Jeśli więc znajdziesz wierzchołek z więcej niż jedną normalną, możesz zignorować normalne znalezione po pierwszej lub obliczyć średnią wszystkich normalnych (wygładzanie normalne).
    ▪ ByVertex: przetwarzanie per-vertex, co oznacza, że ​​każdy wierzchołek modelu ma normalną. Czasami nazywane ByVertice, jak opisano w programie eksportującym Blender. Wydaje mi się, że autor jest Hiszpanem.
    ▪ ByEdge: przetwarzanie według krawędzi, oznacza to, że każda krawędź modelu ma normalną (rzadką)
    ▪ AllSame: oznacza to, że każdy wierzchołek modelu ma taką samą normalną, co jest rzadkie lub niemożliwe w przypadku większości modeli.
    Kolejną ważną właściwością jest właściwość ReferenceInformationType, która może przyjmować następujące wartości:
    ▪ Bezpośredni: oznacza, że ​​normalne są uporządkowane.
    ▪ IndexToDirect (lub index w starszych wersjach formatu FBX): wskazuje, że kolejność wektorów normalnych jest określona przez właściwość NormalsIndex.
    Poniżej znajduje się przykład graficzny, który może być bardziej zrozumiały niż tekst. Przykładowy model to płaszczyzna na osiach X i Y (więc wszystkie wierzchołki będą miały współrzędną Z równą 0), składająca się z 9 wierzchołków i 4 wielokątów (czworokątów). Przykładowy obraz przedstawia widok płaszczyzny z góry.
    Wyjaśnienie struktury pliku modelu FBX (2)

    6. Współrzędne UV FBX

    Współrzędne UV można znaleźć we właściwości UV pod węzłem potomnym LayerElementUV (który z kolei jest węzłem potomnym Modelu). Składnia jest podobna do składni wierzchołków i normalnych, ale oczywiście będą dwie współrzędne zamiast trzech.
    UV: u1, v1, u2, v2, [...]
    Nadal należy zwrócić uwagę na właściwości MappingInformationType i ReferenceInformationType! Te dwie właściwości mogą mieć takie same wartości jak wartości normalne, więc obowiązują te same zasady. Właściwość indeksu (jeśli istnieje, np. IndexToDirect jest zdefiniowany) to UVIndex.