คำอธิบายโครงสร้างไฟล์โมเดล FBX
1. โครงสร้างไฟล์ FBX
นี่คือไฟล์ FBX ตัวอย่าง
สิ่งแรกที่ควรสังเกตคือ บางบรรทัดขึ้นต้นด้วยเครื่องหมายเซมิโคลอน: บรรทัดเหล่านี้เป็นข้อความแสดงความคิดเห็นและต้องละเว้นเมื่ออ่านไฟล์
หลังจากข้อความแสดงความคิดเห็นเริ่มต้น จะพบตัวระบุ FBXHeaderExtension ซึ่งเป็นโหนดหลักแรกของโครงสร้างไฟล์ รูปแบบไฟล์ FBX นั้นมีโครงสร้างแบบต้นไม้ซึ่งเป็นไปตามรูปแบบดังต่อไปนี้:

แต่ละโหนดหรือโหนดลูกสามารถมีคุณลักษณะเฉพาะของตนเองได้ คุณลักษณะบางอย่างอาจพบได้นอกเหนือจากโหนดหลัก แต่โดยทั่วไปแล้วสามารถละเลยได้ โดยทั่วไปแล้ว โครงสร้างพื้นฐานของโหนดมีดังนี้:
ชื่อโหนด: eventual_properties {
คุณสมบัติของโหนด 1: ค่า
คุณสมบัติของโหนด 2: ค่า
ซับโหนด 1 : {
คุณสมบัติย่อยที่ 1: ค่า
[…]
}
คุณสมบัติของโหนด_3: ค่า
[…]
}
นี่คือโหนด (โหนดแรก) ที่พบในไฟล์ตัวอย่าง:
FBXHeaderExtension: {
FBXHeaderVersion: 1003
FBXVersion: 6100
CreationTimeStamp: {
เวอร์ชัน: 1000
ปี: 2014
เดือน: 03
วันที่: 20
เวลา: 17 น.
นาทีที่: 38
อันดับที่สอง: 29
มิลลิวินาที: 0
}
ผู้สร้าง: "FBX SDK/FBX Plugins build 20070228"
OtherFlags: {
FlagPLE: 0
}
}
การเข้าใจโครงสร้างเป็นพื้นฐานสำคัญในการเขียนตัวแยกวิเคราะห์ที่มีประสิทธิภาพ
ในโหนดแรก เราจะพบแอตทริบิวต์สองรายการ (FBXHeaderVersion และ FBXVersion) ซึ่งค่าของแอตทริบิวต์เหล่านี้คือเวอร์ชันของรูปแบบ ในกรณีนี้คือเวอร์ชัน 6.1 ข้อมูลอื่นๆ สามารถละเว้นได้ เว้นแต่ว่าต้องการอ่านวันที่สร้าง (CreationTimeStamp) ด้วย
2. โหนดวัตถุ FBX
โหนดที่สำคัญที่สุดคือโหนดวัตถุอย่างแน่นอน
โหนดวัตถุประกอบด้วยจุดยอด ดัชนี เวกเตอร์ตั้งฉาก พิกัด UV และวัสดุของโมเดล โครงสร้างของมันมีดังต่อไปนี้:
วัตถุ: {
โมเดล: 'ชื่อโมเดล', 'เมช' {
[...]
จุดยอด: [...]
PolygonVertexIndex: [...]
LayerElementNormal: { }
LayerElementUV: { }
}
วัสดุ: 'ชื่อวัสดุ', '' { }
[...]
}
3. จุดยอด FBX
ดังที่เราได้เห็นไปแล้ว จุดยอดสามารถพบได้ในคุณสมบัติ 'Vertex' ของโหนดลูกของโมเดล
รูปแบบการเขียนมีดังนี้:
จุดยอด: v1_x, v1_y, v1_z, v2_x, v2_y, v2_z, [...]
แต่ละจุดยอดมีพิกัดเชิงพื้นที่สามค่า (x, y, z) คั่นด้วยเครื่องหมายจุลภาค (ซึ่งใช้คั่นจุดยอดแต่ละจุดเช่นกัน) พิกัดเหล่านี้แสดงในรูปแบบทศนิยมโดยใช้จุด
ตัวอย่างเช่นดังนี้:
จุดยอด: 0.000000,0.104800,39.291698,0.000000,0.043400,-44.424301,0.000000,38.654301,-41.818802,-0.000000,39.455002,44.424400
จุดยอดที่ประกอบกันเป็นแบบจำลองได้แก่:
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. ดัชนีจุดยอดของรูปหลายเหลี่ยม FBX
สามารถดูดัชนีได้ในคุณสมบัติ PolygonVertexIndex
ไฟล์ FBX สามารถส่งออกรูปหลายเหลี่ยมสามเหลี่ยม (สามเหลี่ยม) หรือมากกว่านั้นได้ โดยส่วนใหญ่จะส่งออกรูปหลายเหลี่ยมสี่เหลี่ยม (สี่เหลี่ยม) รูปแบบการเขียนคล้ายกับจุดยอด แต่มีสิ่งหนึ่งที่ควรทราบ:
PolygonVertexIndex: i1, i2,-i3, i4, i5,-i6,[...]
PolygonVertexIndex: i1, i2, i3, -i4, i5, i6, i7, -i8, [...]
ดัชนีที่ประกอบกันเป็นรูปหลายเหลี่ยมนั้นเรียงลำดับกัน ดัชนีติดลบหมายความว่าเป็นดัชนีสุดท้ายของรูปหลายเหลี่ยม ดัชนีจะต้องถูกกำหนดให้เป็นจำนวนบวก จากนั้นคุณต้องลบ 1 ออกจากดัชนีนั้น!
[หากคุณสงสัยว่าทำไม นั่นเป็นเพราะดัชนีเดิมเป็นแบบ "ทั้งหมดหรือไม่มีเลย" โดยมีค่าเป็น -1 ตัวอย่างเช่น ดัชนี 3 จะกลายเป็น -4]
ตัวอย่างมีดังนี้:
ดัชนีจุดยอดรูปหลายเหลี่ยม: 8,7,3,-7,4,8,7,-3,0,5,8,-5
รูปหลายเหลี่ยมที่ประกอบกันเป็นแบบจำลองจะมีดังนี้:
p1(8,7,3,6)
p2(4,8,7,2)
p3(0,5,8,4)
โปรดสังเกตว่าดัชนีที่ระบุจุดสิ้นสุดของรูปหลายเหลี่ยมถูกกำหนดให้เป็นจำนวนบวก จากนั้นให้ลบ 1 ออกจากค่าดังกล่าว
ข้อควรจำ: การ์ดจอไม่รองรับรูปสี่เหลี่ยม ดังนั้นรูปหลายเหลี่ยมที่มีสี่ด้านแต่ละรูปจะต้องถูกแบ่งออกเป็นสองสามเหลี่ยมก่อนที่จะแสดงผลโมเดล
5. ค่าปกติของ FBX
ค่า Normal สามารถพบได้ในโหนดลูกของพร็อพเพอร์ตี้ Normal ที่ชื่อ LayerElementNormal (ซึ่งเป็นโหนดลูกของ Model อีกที) ไวยากรณ์จะเหมือนกับที่ใช้สำหรับจุดยอดจุดใดจุดหนึ่ง กล่าวคือ ชุดพิกัด (x,y,z)
ค่าปกติ: n1_x, n1_y, n1_z, n2_x, n2_y, n2_z, [...]
คุณต้องให้ความสนใจกับคุณสมบัติ MappingInformationType ซึ่งสามารถมีค่าได้ดังต่อไปนี้:
▪ ByPolygon: โดยรูปหลายเหลี่ยม ซึ่งหมายความว่ารูปหลายเหลี่ยมแต่ละรูปของโมเดลจะมีเวกเตอร์ตั้งฉาก
▪ ByPolygonVertex: ประมวลผลตามจุดยอดของรูปหลายเหลี่ยม ซึ่งหมายความว่าแต่ละจุดยอดของแต่ละรูปหลายเหลี่ยมในโมเดลจะมีเวกเตอร์ตั้งฉาก (normal vector) ตัวอย่างเช่น หากโมเดลมี 8 จุดยอดที่ประกอบกันเป็นรูปสี่เหลี่ยม 4 รูป จะมีเวกเตอร์ตั้งฉาก 16 ตัว (1 เวกเตอร์ตั้งฉาก * 4 รูปหลายเหลี่ยม * 4 จุดยอดของรูปหลายเหลี่ยม) โปรดทราบว่าโดยปกติแล้วเอนจิ้นเกมต้องการให้จุดยอดกำหนดเวกเตอร์ตั้งฉากเพียงตัวเดียว ดังนั้นหากคุณพบจุดยอดที่มีเวกเตอร์ตั้งฉากมากกว่าหนึ่งตัว คุณสามารถเลือกที่จะละเว้นเวกเตอร์ตั้งฉากที่พบหลังจากตัวแรก หรือคำนวณค่าเฉลี่ยของเวกเตอร์ตั้งฉากทั้งหมด (การปรับค่าเวกเตอร์ตั้งฉากให้เรียบ)
▪ ByVertex: การประมวลผลแบบต่อจุดยอด ซึ่งหมายความว่าแต่ละจุดยอดของโมเดลจะมีเวกเตอร์ตั้งฉาก บางครั้งเรียกว่า ByVertice ตามที่เขียนไว้ในโปรแกรมส่งออกของ Blender ฉันคิดว่าผู้เขียนเป็นชาวสเปน
▪ ByEdge: ประมวลผลตามขอบ หมายความว่าแต่ละขอบของโมเดลจะมีค่าปกติ (หายาก)
▪ AllSame: หมายความว่าทุกจุดยอดของโมเดลมีเวกเตอร์ตั้งฉากเดียวกัน ซึ่งเป็นเรื่องที่หายากหรือเป็นไปไม่ได้สำหรับโมเดลส่วนใหญ่
คุณสมบัติสำคัญอีกประการหนึ่งคือคุณสมบัติ ReferenceInformationType ซึ่งสามารถมีค่าดังต่อไปนี้:
▪ โดยตรง: แสดงว่าเวกเตอร์ปกติมีการเรียงลำดับ
▪ IndexToDirect (หรือ index ในเวอร์ชันเก่าของรูปแบบ FBX): ระบุว่าลำดับของเวกเตอร์ปกติถูกกำหนดโดยคุณสมบัติ NormalsIndex
ด้านล่างนี้เป็นตัวอย่างภาพประกอบที่อาจจะเข้าใจง่ายกว่าข้อความ ตัวอย่างแบบจำลองนี้เป็นระนาบบนแกน X และ Y (ดังนั้นจุดยอดทั้งหมดจะมีพิกัด Z เป็น 0) ประกอบด้วยจุดยอด 9 จุดและรูปหลายเหลี่ยม (สี่เหลี่ยม) 4 รูป ภาพตัวอย่างเป็นมุมมองของระนาบจากด้านบน

6. พิกัด UV ของไฟล์ FBX
พิกัด UV สามารถพบได้ในคุณสมบัติ UV ภายใต้โหนดลูก LayerElementUV (ซึ่งเป็นโหนดลูกของ Model อีกที) รูปแบบการเขียนคล้ายกับพิกัดจุดยอดและเวกเตอร์ตั้งฉาก แต่แน่นอนว่าจะมีพิกัดสองค่าแทนที่จะเป็นสามค่า
UV: u1, v1, u2, v2, [...]
คุณยังคงต้องให้ความสนใจกับคุณสมบัติ MappingInformationType และ ReferenceInformationType! คุณสมบัติทั้งสองนี้สามารถมีค่าเดียวกันกับค่าปกติได้ ดังนั้นจึงใช้กฎเดียวกัน คุณสมบัติดัชนี (ถ้ามี เช่น กำหนด IndexToDirect ไว้) คือ UVIndex
