ساختار فایل مدل FBX توضیح داده شده است
۱. ساختار فایل FBX
این یک نمونه فایل FBX است.
اولین نکتهای که باید به آن توجه کنید این است که برخی از خطوط با نقطه ویرگول شروع میشوند: اینها توضیحات هستند و هنگام خواندن فایل باید نادیده گرفته شوند.
پس از کامنت اولیه، شناسه FBXHeaderExtension یافت میشود. این اولین گره اصلی ساختار فایل است. فرمت فایل FBX در واقع یک ساختار درختی است که از طرح زیر پیروی میکند:

هر گره یا گره فرزند میتواند ویژگیهای خاص خود را داشته باشد. ویژگیها را میتوان در خارج از گره اصلی نیز یافت، اما معمولاً میتوان آنها را نادیده گرفت. به طور کلی، ساختار اساسی یک گره به شرح زیر است:
نام گره: eventual_properties {
ویژگی_گره_۱: مقدار
ویژگی_گره_۲: مقدار
زیرگره ۱ : {
زیرگره_ویژگی_۱: مقدار
[…]
}
Node_Property_3: مقدار
[…]
}
این یک گره (اولین مورد) است که در فایل مثال یافت میشود:
FBXHeaderExtension: {
نسخه FBXHeader: 1003
نسخه FBX: ۶۱۰۰
CreationTimeStamp: {
نسخه: ۱۰۰۰
سال: ۲۰۱۴
ماه: ۰۳
روز: ۲۰
ساعت: ۱۷
دقیقه: ۳۸
دوم: ۲۹
میلی ثانیه: 0
}
سازنده: "افزونههای FBX SDK/FBX نسخه ۲۰۰۷۰۲۲۸"
OtherFlags: {
پرچمPLE: 0
}
}
درک ساختار، اساس نوشتن یک تجزیهگر کارآمد است.
در گره اول دو ویژگی (FBXHeaderVersion و FBXVersion) را مییابیم که مقادیر آنها نسخههای قالب هستند. در این مورد، نسخه ۶.۱ است. اطلاعات دیگر را میتوان نادیده گرفت، مگر اینکه بخواهیم تاریخ ایجاد (CreationTimeStamp) را نیز بخوانیم.
۲. گرههای شیء FBX
مهمترین گره قطعاً گره شیء است.
گره شیء شامل رئوس، شاخصها، نرمالها، مختصات UV و مواد مدل است. ساختار آن به شرح زیر است:
اشیاء: {
مدل: 'نام مدل'، 'مش' {
[...]
رئوس: [...]
PolygonVertexIndex: [...]
LayerElementNormal: { }
LayerElementUV: { }
}
جنس: 'نام جنس'، '' { }
[...]
}
۳. رأس 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)
۴. شاخص رأس چندضلعی FBX
این اندیس را میتوان در زیر ویژگی PolygonVertexIndex یافت.
فایلهای FBX میتوانند چندضلعیهای سهضلعی (مثلث) یا بیشتر را خروجی بگیرند. اکثر فایلها چندضلعیهای چهارضلعی (کوآد) را خروجی میدهند. سینتکس آنها مشابه رأسها است، اما یک نکته باید توجه داشت:
PolygonVertexIndex: i1، i2، -i3، i4، i5، -i6،[...]
PolygonVertexIndex: i1، i2، i3، -i4، i5، i6، i7، -i8، [...]
شاخصهایی که یک چندضلعی را تشکیل میدهند به ترتیب هستند، شاخص منفی به این معنی است که آخرین شاخص چندضلعی است. این شاخص باید روی یک عدد مثبت تنظیم شود و سپس باید ۱ را از آن کم کنید!
[اگر از خود میپرسید چرا، به این دلیل است که اندیس اصلی با عدد -۱ به صورت همه یا هیچ است. برای مثال اندیس ۳ به -۴ تبدیل میشود]
مثال به شرح زیر است:
شاخص رأس چندضلعی: ۸،۷،۳،-۷،۴،۸،۷،-۳،۰،۵،۸،-۵
چندضلعیهایی که مدل را تشکیل میدهند عبارتند از:
p1(8،7،3،6)
پی۲(۴،۸،۷،۲)
پ3(0،5،8،4)
توجه داشته باشید که اندیس نشان دهنده انتهای چندضلعی روی یک عدد مثبت تنظیم شده است، و سپس ۱ را از آن کم کنید.
یادآوری: کارتهای گرافیک چهارضلعیها را دوست ندارند، بنابراین هر چندضلعی با چهار ضلع باید قبل از نمایش مدل به دو مثلث تقسیم شود.
۵. نرمالهای FBX
نرمالها را میتوان در زیر گره فرزند ویژگی Normals، یعنی LayerElementNormal (که به نوبه خود یک گره فرزند از Model است) یافت. نحو آن همانند یکی از رئوس، یعنی مجموعهای از مختصات (x، y، z) است.
نرمالها: n1_x، n1_y، n1_z، n2_x، n2_y، n2_z، [...]
شما باید به ویژگی MappingInformationType توجه کنید که میتواند مقادیر زیر را داشته باشد:
▪ ByPolygon: توسط چندضلعی، به این معنی که هر چندضلعی از مدل دارای یک نرمال است.
▪ ByPolygonVertex: توسط رأس چندضلعی پردازش میشود، به این معنی که هر رأس از هر چندضلعی مدل دارای یک نرمال است. برای مثال، اگر مدل ۸ رأس داشته باشد که چهار چهارضلعی تشکیل میدهند، ۱۶ نرمال وجود خواهد داشت (۱ نرمال * ۴ چندضلعی * ۴ رأس چندضلعی). توجه داشته باشید که معمولاً موتورهای بازی برای تعریف فقط یک نرمال به رأس نیاز دارند. بنابراین اگر رأسی با بیش از یک نرمال پیدا کردید، میتوانید نرمالهای یافت شده پس از اولین نرمال را نادیده بگیرید، یا میانگین همه نرمالها را محاسبه کنید (هموارسازی نرمال).
▪ ByVertex: پردازش به ازای هر رأس، به این معنی که هر رأس از مدل یک نرمال دارد. گاهی اوقات ByVertice نامیده میشود، همانطور که در Exporter بلندر نوشته شده است. فکر میکنم نویسنده اسپانیایی باشد.
▪ ByEdge: پردازش شده توسط لبه، به این معنی که هر لبه مدل دارای یک مقدار نرمال (نادر) است.
▪ AllSame: این به این معنی است که هر رأس مدل دارای نرمال یکسانی است، که برای اکثر مدلها نادر یا غیرممکن است.
یکی دیگر از ویژگیهای مهم، ویژگی ReferenceInformationType است که میتواند مقادیر زیر را داشته باشد:
▪ مستقیم: نشان دهنده مرتب بودن نرمال ها است.
▪ IndexToDirect (یا index در نسخههای قدیمیتر فرمت FBX): نشان میدهد که ترتیب نرمالها توسط ویژگی NormalsIndex داده میشود.
در زیر یک مثال گرافیکی وجود دارد که ممکن است از متن واضحتر باشد. مدل نمونه، یک صفحه روی محورهای X و Y است (بنابراین همه رئوس دارای مختصات Z برابر با 0 خواهند بود) که شامل 9 رأس و 4 چندضلعی (چهارضلعی) است. تصویر نمونه، نمایی از صفحه از بالا است.

۶. مختصات UV FBX
مختصات UV را میتوان در ویژگی UV در زیر گره فرزند LayerElementUV (که به نوبه خود یک گره فرزند Model است) یافت. سینتکس آن مشابه رأسها و نرمالها است، اما البته به جای سه مختصات، دو مختصات وجود خواهد داشت.
فرابنفش: u1، v1، u2، v2، [...]
شما هنوز باید به ویژگیهای MappingInformationType و ReferenceInformationType توجه کنید! این دو ویژگی میتوانند مقادیر یکسانی با نرمالها داشته باشند، بنابراین همان قوانین اعمال میشوند. ویژگی شاخص (در صورت وجود، یعنی IndexToDirect تعریف شده باشد) UVIndex است.
