Penjelasan Struktur File Model FBX
1. Struktur file FBX
Ini adalah contoh file FBX.
Hal pertama yang perlu diperhatikan adalah beberapa baris diawali dengan titik koma: ini adalah komentar dan harus diabaikan saat membaca file.
Setelah komentar awal, ditemukan pengidentifikasi FBXHeaderExtension. Ini adalah node utama pertama dari struktur file. Format file FBX memang merupakan struktur pohon yang mengikuti skema berikut:

Setiap node atau node anak dapat memiliki atribut spesifiknya sendiri. Atribut juga dapat ditemukan di luar node utama, tetapi biasanya dapat diabaikan. Secara umum, struktur dasar sebuah node adalah sebagai berikut:
nama node: eventual_properties {
Node_Property_1: nilai
Node_Property_2: nilai
Subnode1 : {
Subnode_Property_1: nilai
[…]
}
Node_Property_3: nilai
[…]
}
Ini adalah sebuah node (yang pertama) yang ditemukan dalam file contoh:
FBXHeaderExtension: {
FBXHeaderVersion: 1003
Versi FBX: 6100
CreationTimeStamp: {
Versi: 1000
Tahun: 2014
Bulan: 03
Hari: 20
Jam: 17
Menit: 38
Kedua: 29
Milidetik: 0
}
Pembuat: "FBX SDK/FBX Plugins build 20070228"
OtherFlags: {
FlagPLE: 0
}
}
Memahami struktur adalah dasar untuk menulis parser yang efisien.
Pada node pertama kita menemukan dua atribut (FBXHeaderVersion dan FBXVersion) yang nilainya adalah versi format. Dalam hal ini, versinya adalah 6.1. Informasi lainnya dapat diabaikan kecuali jika kita juga ingin membaca tanggal pembuatan (CreationTimeStamp).
2. Node objek FBX
Node yang paling penting sudah pasti adalah node objek.
Node objek berisi titik sudut, indeks, normal, koordinat UV, dan material model. Strukturnya adalah sebagai berikut:
Objek: {
Model: 'nama model', 'Mesh' {
[...]
Titik sudut: [...]
Indeks Titik Sudut Poligon: [...]
LayerElementNormal: { }
LayerElementUV: { }
}
Material: 'nama material', '' { }
[...]
}
3. FBX Vertex
Seperti yang telah kita lihat, titik sudut dapat ditemukan di properti 'Vertex' dari node anak model.
Sintaksnya adalah sebagai berikut:
Titik sudut: v1_x, v1_y, v1_z, v2_x, v2_y, v2_z, [...]
Setiap titik sudut memiliki tiga koordinat spasial (x, y, z), dipisahkan oleh koma (yang juga memisahkan satu titik sudut dari yang lain). Koordinat tersebut jelas dinyatakan dalam bentuk desimal dengan titik.
Contohnya adalah sebagai berikut:
Titik sudut: 0.000000,0.104800,39.291698,0.000000,0.043400,-44.424301,0.000000,38.654301,-41.818802,-0.000000,39.455002,44.424400
Titik-titik sudut yang membentuk model tersebut adalah:
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 titik sudut poligon FBX
Indeks tersebut dapat ditemukan di bawah properti PolygonVertexIndex.
File FBX dapat mengekspor poligon segitiga atau lebih. Sebagian besar file mengekspor poligon segi empat. Sintaksnya mirip dengan simpul, tetapi ada satu hal yang perlu diperhatikan:
Indeks Titik Poligon: i1, i2,-i3, i4, i5,-i6,[...]
Indeks Titik Poligon: i1, i2, i3, -i4, i5, i6, i7, -i8, [...]
Indeks yang membentuk poligon tersusun secara berurutan, indeks negatif berarti indeks tersebut adalah indeks terakhir dari poligon. Indeks tersebut perlu diubah menjadi angka positif, lalu dikurangi 1!
[Jika Anda bertanya-tanya mengapa, itu karena indeks aslinya adalah "semua atau tidak sama sekali" dengan -1. Misalnya, indeks 3 menjadi -4]
Contohnya adalah sebagai berikut:
Indeks Titik Poligon: 8,7,3,-7,4,8,7,-3,0,5,8,-5
Poligon-poligon yang membentuk model tersebut adalah:
p1(8,7,3,6)
p2(4,8,7,2)
p3(0,5,8,4)
Perhatikan bahwa indeks yang menunjukkan ujung poligon telah diatur ke angka positif, lalu kurangi 1 dari angka tersebut.
Pengingat: Kartu grafis tidak menyukai bentuk segi empat, jadi setiap poligon dengan empat sisi harus dibagi menjadi dua segitiga sebelum menampilkan modelnya.
5. Normal FBX
Normal dapat ditemukan di node anak properti Normals, yaitu LayerElementNormal (yang pada gilirannya merupakan node anak dari Model). Sintaksnya sama seperti untuk salah satu verteks, yaitu serangkaian koordinat (x,y,z).
Normal: n1_x, n1_y, n1_z, n2_x, n2_y, n2_z, [...]
Anda perlu memperhatikan properti MappingInformationType, yang dapat memiliki nilai-nilai berikut:
▪ ByPolygon: berdasarkan poligon, yang berarti setiap poligon pada model memiliki normal.
▪ ByPolygonVertex: diproses berdasarkan titik sudut poligon, yang berarti setiap titik sudut dari setiap poligon pada model memiliki normal. Misalnya, jika model memiliki 8 titik sudut yang membentuk empat segi empat, maka akan ada 16 normal (1 normal * 4 poligon * 4 titik sudut poligon). Perhatikan bahwa biasanya mesin game hanya membutuhkan satu normal untuk setiap titik sudut. Jadi, jika Anda menemukan titik sudut dengan lebih dari satu normal, Anda dapat mengabaikan normal yang ditemukan setelah yang pertama, atau menghitung rata-rata dari semua normal (penghalusan normal).
▪ ByVertex: pemrosesan per-vertex, yang berarti setiap vertex model memiliki normal. Terkadang disebut ByVertice, seperti yang tertulis di eksportir Blender. Saya rasa penulisnya orang Spanyol.
▪ ByEdge: diproses berdasarkan tepi, artinya setiap tepi model memiliki normal (jarang)
▪ AllSame: ini berarti bahwa setiap titik sudut model memiliki normal yang sama, yang jarang atau tidak mungkin terjadi pada sebagian besar model.
Properti penting lainnya adalah properti ReferenceInformationType, yang dapat memiliki nilai-nilai berikut:
▪ Langsung: menunjukkan bahwa vektor normal diurutkan.
▪ IndexToDirect (atau index dalam versi format FBX yang lebih lama): menunjukkan bahwa urutan normal ditentukan oleh properti NormalsIndex.
Berikut adalah contoh grafis yang mungkin lebih jelas daripada teks. Model contohnya adalah bidang pada sumbu X dan Y (sehingga semua titik sudut akan memiliki koordinat Z 0), terdiri dari 9 titik sudut dan 4 poligon (segi empat). Gambar contoh adalah tampilan bidang dari atas.

6. Koordinat UV FBX
Koordinat UV dapat ditemukan di properti UV di bawah node anak LayerElementUV (yang merupakan node anak dari Model). Sintaksnya mirip dengan verteks dan normal, tetapi tentu saja akan ada dua koordinat, bukan tiga.
UV: u1, v1, u2, v2, [...]
Anda tetap perlu memperhatikan properti MappingInformationType dan ReferenceInformationType! Kedua properti ini dapat memiliki nilai yang sama dengan normal, jadi aturan yang sama berlaku. Properti indeks (jika ada, misalnya IndexToDirect didefinisikan) adalah UVIndex.
