شرح بنية ملف نموذج FBX
1. بنية ملف FBX
هذا ملف FBX نموذجي.
أول شيء يجب ملاحظته هو أن بعض الأسطر تبدأ بفاصلة منقوطة: هذه تعليقات ويجب تجاهلها عند قراءة الملف.
بعد التعليق الأولي، يتم العثور على المعرّف FBXHeaderExtension. هذه هي العقدة الرئيسية الأولى في بنية الملف. تنسيق ملف FBX هو في الواقع بنية شجرية تتبع المخطط التالي:

يمكن أن تحتوي كل عقدة أو عقدة فرعية على سماتها الخاصة. كما يمكن العثور على السمات خارج العقدة الرئيسية، ولكن عادةً ما يمكن تجاهلها. وبشكل عام، يكون الهيكل الأساسي للعقدة كما يلي:
اسم العقدة: eventual_properties {
Node_Property_1: القيمة
Node_Property_2: القيمة
العقدة الفرعية 1: {
Subnode_Property_1: القيمة
[...]
}
Node_Property_3: القيمة
[...]
}
هذه عقدة (الأولى) موجودة في ملف المثال:
FBXHeaderExtension: {
FBXHeaderVersion: 1003
إصدار FBX: 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 الخاصة به، ومواده. ويكون هيكلها كما يلي:
الكائنات: {
النموذج: 'اسم النموذج'، 'الشبكة' {
[...]
الرؤوس: [...]
فهرس رأس المضلع: [...]
LayerElementNormal: { }
LayerElementUV: { }
}
المادة: 'اسم المادة'، '' { }
[...]
}
3. رأس FBX
كما رأينا، يمكن العثور على الرؤوس في خاصية "Vertex" للعقد الفرعية للنموذج.
الصيغة كالتالي:
الرؤوس: v1_x، v1_y، v1_z، v2_x، v2_y، v2_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
ستكون الرؤوس التي تشكل النموذج كما يلي:
الإصدار 1 (0.000000،0.104800،39.291698)
v2(00.000000,0.043400,-44.424301)
الإصدار 3 (0.000000،38.654301،-41.818802)
الإصدار 4 (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 العادية
يمكن العثور على المتجهات العمودية ضمن العقدة الفرعية لخاصية المتجهات العمودية LayerElementNormal (والتي بدورها عقدة فرعية لـ Model). ويكون تركيبها مماثلاً لتركيب أحد الرؤوس، أي سلسلة من إحداثيات (x,y,z).
المتجهات العمودية: n1_x، n1_y، n1_z، n2_x، n2_y، n2_z، [...]
يجب الانتباه إلى خاصية MappingInformationType، والتي يمكن أن تحتوي على القيم التالية:
▪ ByPolygon: by polygon، مما يعني أن كل مضلع من مضلعات النموذج له متجه عمودي.
▪ معالجة رؤوس المضلعات: تتم المعالجة حسب رأس المضلع، ما يعني أن لكل رأس من رؤوس كل مضلع في النموذج متجهًا عموديًا. على سبيل المثال، إذا كان النموذج يحتوي على 8 رؤوس تُشكّل أربعة مربعات، فسيكون هناك 16 متجهًا عموديًا (متجه عمودي واحد × 4 مضلعات × 4 رؤوس مضلعات). تجدر الإشارة إلى أن محركات الألعاب عادةً ما تحتاج إلى رأس واحد فقط لتحديد متجه عمودي. لذا، إذا وجدت رأسًا له أكثر من متجه عمودي، يمكنك إما تجاهل المتجهات العمودية التي تلي المتجه الأول، أو حساب متوسط جميع المتجهات العمودية (تنعيم المتجهات العمودية).
▪ المعالجة حسب الرأس: معالجة كل رأس على حدة، ما يعني أن لكل رأس من رؤوس النموذج متجهًا عموديًا. تُسمى أحيانًا ByVertice، كما هو مكتوب في برنامج Blender. أعتقد أن المؤلف إسباني.
▪ ByEdge: تتم المعالجة حسب الحافة، وهذا يعني أن كل حافة من حواف النموذج لها متجه عادي (نادر).
▪ AllSame: هذا يعني أن كل رأس من رؤوس النموذج له نفس المتجه العمودي، وهو أمر نادر أو مستحيل بالنسبة لمعظم النماذج.
ومن الخصائص المهمة الأخرى خاصية ReferenceInformationType، والتي يمكن أن تأخذ القيم التالية:
▪ مباشر: يشير إلى أن التوزيعات الطبيعية مرتبة.
▪ IndexToDirect (أو index في الإصدارات القديمة من تنسيق FBX): يشير إلى أن ترتيب المتجهات العمودية يتم تحديده بواسطة خاصية NormalsIndex.
فيما يلي مثال بياني قد يكون أوضح من النص. النموذج الموضح عبارة عن مستوى على المحورين X و Y (لذا فإن جميع الرؤوس لها إحداثي Z يساوي صفرًا)، ويتكون من 9 رؤوس و 4 مضلعات (رباعيات). الصورة المعروضة هي منظر للمستوى من الأعلى.

6. إحداثيات UV لملف FBX
يمكن إيجاد إحداثيات UV في خاصية UV ضمن العقدة الفرعية LayerElementUV (وهي بدورها عقدة فرعية من Model). يشبه بناء الجملة بناء جملة الرؤوس والمتجهات العمودية، ولكن بالطبع سيكون هناك إحداثيان بدلاً من ثلاثة.
الأشعة فوق البنفسجية: u1، v1، u2، v2، [...]
لا يزال عليك الانتباه إلى خاصيتيّ MappingInformationType وReferenceInformationType! يمكن أن تأخذ هاتان الخاصيتان نفس قيم المتغيرات العادية، لذا تنطبق عليهما نفس القواعد. خاصية الفهرس (إن وُجدت، أي إذا تم تعريف IndexToDirect) هي UVIndex.
