Struktur Fail Model FBX Dijelaskan
1. Struktur fail FBX
Ini ialah contoh fail FBX.
Perkara pertama yang perlu diberi perhatian ialah sesetengah baris bermula dengan titik koma: ini adalah komen dan mesti diabaikan semasa membaca fail tersebut.
Selepas komen awal, pengecam FBXHeaderExtension ditemui. Ini merupakan nod utama pertama bagi struktur fail. Format fail FBX sememangnya merupakan struktur pokok yang mengikuti skema berikut:

Setiap nod atau nod anak boleh mempunyai atribut khususnya yang tersendiri. Atribut juga boleh ditemui di luar nod utama, tetapi biasanya boleh diabaikan. Secara amnya, struktur asas nod adalah seperti berikut:
nama nod: eventual_properties {
Nod_Property_1: nilai
Nod_Property_2: nilai
Subnod1 : {
Subnod_Properti_1: nilai
[…]
}
Nod_Property_3: nilai
[…]
}
Ini ialah nod (yang pertama) yang terdapat dalam fail contoh:
FBXHeaderExtension: {
FBXHeaderVersion: 1003
Versi FBX: 6100
CapMasaPenciptaan: {
Versi: 1000
Tahun: 2014
Bulan: 03
Hari: 20
Jam: 17
Minit: 38
Kedua: 29
Milisaat: 0
}
Pencipta: "Pemalam FBX SDK/FBX binaan 20070228"
Bendera Lain: {
BenderaPLE: 0
}
}
Memahami struktur adalah asas untuk menulis parser yang cekap.
Dalam nod pertama, kita dapati dua atribut (FBXHeaderVersion dan FBXVersion) yang nilainya merupakan versi format. Dalam kes ini, ia adalah versi 6.1. Maklumat lain boleh diabaikan melainkan seseorang juga ingin membaca tarikh penciptaan (CreationTimeStamp).
2. Nod objek FBX
Nod yang paling penting sudah tentu nod objek.
Nod objek mengandungi bucu, indeks, normal, koordinat UV dan bahan model. Strukturnya adalah seperti berikut:
Objek: {
Model: 'nama model', 'Mesh' {
[...]
Bucu: [...]
Indeks PoligonVertex: [...]
LayerElementNormal: { }
LayerElementUV: { }
}
Bahan: 'nama bahan', '' { }
[...]
}
3. FBX Vertex
Seperti yang telah kita lihat, bucu boleh ditemui dalam sifat 'Bucu' bagi nod anak model.
Sintaksnya adalah seperti berikut:
Bucu: v1_x, v1_y, v1_z, v2_x, v2_y, v2_z, [...]
Setiap bucu mempunyai tiga koordinat ruang (x,y,z), dipisahkan oleh koma (juga memisahkan satu bucu daripada bucu yang lain). Koordinat-koordinat tersebut jelas dinyatakan dalam bentuk perpuluhan dengan titik.
Contohnya adalah seperti berikut:
Bucu: 0.000000,0.104800,39.291698,0.000000,0.043400,-44.424301,0.000000,38.654301,-41.818802,-0.000000,39.455002,44.424400
Bucu-bucu yang membentuk model tersebut ialah:
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 bucu bagi poligon FBX
Indeks tersebut boleh didapati di bawah sifat PolygonVertexIndex.
Fail FBX boleh mengeksport poligon tiga sisi (segi tiga) atau lebih. Kebanyakan fail mengeksport poligon empat sisi (empat segi). Sintaksnya serupa dengan bucu, tetapi ada satu perkara yang perlu diberi perhatian:
IndeksVertexPolygon: i1, i2,-i3, i4, i5,-i6,[...]
Indeks PoligonVertex: i1, i2, i3, -i4, i5, i6, i7, -i8, [...]
Indeks yang membentuk poligon adalah mengikut susunan, indeks negatif bermaksud ia adalah indeks terakhir poligon. Indeks perlu ditetapkan kepada nombor positif, dan kemudian anda perlu menolak 1 daripadanya!
[Jika anda tertanya-tanya mengapa, itu kerana indeks asal adalah semua atau tiada langsung dengan -1. Contohnya indeks 3 menjadi -4]
Contohnya adalah seperti berikut:
IndeksPunggung Poligon: 8,7,3,-7,4,8,7,-3,0,5,8,-5
Poligon yang membentuk model tersebut ialah:
p1(8,7,3,6)
p2(4,8,7,2)
p3(0,5,8,4)
Perhatikan bahawa indeks yang menunjukkan hujung poligon telah ditetapkan kepada nombor positif, dan kemudian tolak 1 daripadanya.
Peringatan: Kad grafik tidak menyukai segi empat sama, jadi setiap poligon dengan empat sisi mesti dibahagikan kepada dua segi tiga sebelum memaparkan model.
5. FBX Normals
Normals boleh ditemui di bawah nod anak LayerElementNormal bagi sifat Normals (yang seterusnya merupakan nod anak Model). Sintaksnya adalah sama seperti untuk salah satu bucu, iaitu satu siri koordinat (x,y,z).
Normal: n1_x, n1_y, n1_z, n2_x, n2_y, n2_z, [...]
Anda perlu memberi perhatian kepada sifat MappingInformationType, yang boleh mempunyai nilai berikut:
▪ Mengikut Poligon: mengikut poligon, yang bermaksud setiap poligon model mempunyai normal.
▪ OlehPolygonVertex: diproses oleh bucu poligon, yang bermaksud setiap bucu bagi setiap poligon model mempunyai normal. Contohnya, jika model mempunyai 8 bucu yang membentuk empat kuad, akan terdapat 16 normal (1 normal * 4 poligon * 4 bucu poligon). Ambil perhatian bahawa biasanya enjin permainan memerlukan bucu untuk mentakrifkan hanya satu normal. Jadi, jika anda menemui bucu dengan lebih daripada satu normal, anda boleh mengabaikan normal yang ditemui selepas yang pertama atau mengira purata semua normal (pelicinan normal).
▪ ByVertex: pemprosesan setiap bucu, yang bermaksud setiap bucu model mempunyai normal. Kadangkala dipanggil ByVertice, seperti yang ditulis dalam pengeksport Blender. Saya rasa pengarangnya berbangsa Sepanyol.
▪ ByEdge: diproses mengikut tepi, ini bermakna setiap tepi model mempunyai normal (jarang berlaku)
▪ SemuaSama: ini bermakna setiap bucu model mempunyai normal yang sama, yang jarang berlaku atau mustahil bagi kebanyakan model.
Satu lagi sifat penting ialah sifat ReferenceInformationType, yang boleh mempunyai nilai berikut:
▪ Langsung: menunjukkan bahawa normals adalah tertib.
▪ IndexToDirect (atau indeks dalam versi format FBX yang lebih lama): menunjukkan bahawa susunan normals diberikan oleh sifat NormalsIndex.
Di bawah ialah contoh grafik yang mungkin lebih jelas daripada teks. Model contoh ialah satah pada paksi X dan Y (jadi semua bucu akan mempunyai koordinat-Z 0), yang terdiri daripada 9 bucu dan 4 poligon (kuad). Imej contoh ialah pandangan satah dari atas.

6. Koordinat UV FBX
Koordinat UV boleh ditemui dalam sifat UV di bawah nod anak LayerElementUV (yang seterusnya merupakan nod anak Model). Sintaksnya serupa dengan sintaks bucu dan normal, tetapi sudah tentu akan terdapat dua koordinat dan bukannya tiga.
UV: u1, v1, u2, v2, [...]
Anda masih perlu memberi perhatian kepada sifat MappingInformationType dan ReferenceInformationType! Kedua-dua sifat ini boleh mempunyai nilai yang sama seperti normal, jadi peraturan yang sama terpakai. Sifat indeks (jika ada, iaitu IndexToDirect ditakrifkan) ialah UVIndex.
