Japanese
Leave Your Message

คำอธิบายโครงสร้างไฟล์โมเดล FBX

ไฟล์ FBX เป็นไฟล์ที่รองรับโดยโปรแกรมสร้างโมเดล 3 มิติเกือบทั้งหมด และเป็นไฟล์เฉพาะของ Autodesk สำหรับโมเดล 3 มิติ ไฟล์นี้รองรับข้อมูลจุดยอด ดัชนี ค่าปกติ พิกัด UV วัสดุ และแอนิเมชัน
Autodesk ได้จัดเตรียม FBX SDK อย่างเป็นทางการ ซึ่งช่วยให้สามารถนำเข้าและส่งออกไฟล์ FBX หรือไลบรารีอื่นๆ ที่มีวัตถุประสงค์เดียวกันได้ SDK นี้มีอินเทอร์เฟซสองแบบ แบบหนึ่งเขียนด้วยภาษา C++ และอีกแบบเขียนด้วยภาษา Python
นอกจากนี้ คุณยังสามารถเขียนตัวแยกวิเคราะห์ FBX แบบกำหนดเองเพื่อหลีกเลี่ยงการพึ่งพาไลบรารีอื่นๆ ได้อีกด้วย
บทความนี้อธิบายโครงสร้างของไฟล์ FBX การเข้าใจโครงสร้างนี้จะช่วยให้เราสามารถเขียนตัวแยกวิเคราะห์ไฟล์ FBX ที่มีน้ำหนักเบาและปรับแต่งได้ สำหรับตัวอย่างของตัวแยกวิเคราะห์ไฟล์ FBX ที่กำหนดเอง คุณสามารถค้นหาได้จากปลั๊กอิน FBX Importer/Exporter ของ Blender
ไฟล์ FBX มีให้เลือกทั้งแบบ ASCII (ไฟล์ข้อความที่มนุษย์อ่านได้) หรือแบบไบนารี

    1. โครงสร้างไฟล์ FBX

    นี่คือไฟล์ FBX ตัวอย่าง
    สิ่งแรกที่ควรสังเกตคือ บางบรรทัดขึ้นต้นด้วยเครื่องหมายเซมิโคลอน: บรรทัดเหล่านี้เป็นข้อความแสดงความคิดเห็นและต้องละเว้นเมื่ออ่านไฟล์
    หลังจากข้อความแสดงความคิดเห็นเริ่มต้น จะพบตัวระบุ FBXHeaderExtension ซึ่งเป็นโหนดหลักแรกของโครงสร้างไฟล์ รูปแบบไฟล์ FBX นั้นมีโครงสร้างแบบต้นไม้ซึ่งเป็นไปตามรูปแบบดังต่อไปนี้:
    คำอธิบายโครงสร้างไฟล์โมเดล FBX (1)
    แต่ละโหนดหรือโหนดลูกสามารถมีคุณลักษณะเฉพาะของตนเองได้ คุณลักษณะบางอย่างอาจพบได้นอกเหนือจากโหนดหลัก แต่โดยทั่วไปแล้วสามารถละเลยได้ โดยทั่วไปแล้ว โครงสร้างพื้นฐานของโหนดมีดังนี้:
    ชื่อโหนด: 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 รูป ภาพตัวอย่างเป็นมุมมองของระนาบจากด้านบน
    คำอธิบายโครงสร้างไฟล์โมเดล FBX (2)

    6. พิกัด UV ของไฟล์ FBX

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