Giải thích cấu trúc tệp mô hình FBX
1. Cấu trúc tập tin FBX
Đây là một tập tin FBX mẫu.
Điều đầu tiên cần lưu ý là một số dòng bắt đầu bằng dấu chấm phẩy: đây là các chú thích và phải được bỏ qua khi đọc tệp.
Sau phần bình luận ban đầu, ta tìm thấy định danh FBXHeaderExtension. Đây là nút chính đầu tiên của cấu trúc tập tin. Định dạng tập tin FBX thực sự là một cấu trúc cây tuân theo sơ đồ sau:

Mỗi nút hoặc nút con có thể có các thuộc tính riêng biệt. Các thuộc tính cũng có thể được tìm thấy bên ngoài nút chính, nhưng thường có thể bỏ qua. Nhìn chung, cấu trúc cơ bản của một nút như sau:
Tên nút: eventual_properties {
Thuộc tính nút_1: giá trị
Thuộc tính nút_2: giá trị
Subnode1 : {
Subnode_Property_1: giá trị
[…]
}
Node_Property_3: giá trị
[…]
}
Đây là một nút (nút đầu tiên) được tìm thấy trong tệp ví dụ:
FBXHeaderExtension: {
FBXHeaderVersion: 1003
Phiên bản FBX: 6100
CreationTimeStamp: {
Phiên bản: 1000
Năm: 2014
Tháng: 03
Ngày: 20
Giờ: 17
Phút: 38
Thứ hai: 29
Mili giây: 0
}
Người tạo: "FBX SDK/FBX Plugins build 20070228"
Các cờ khác: {
FlagPLE: 0
}
}
Hiểu rõ cấu trúc là nền tảng để viết một trình phân tích cú pháp hiệu quả.
Trong nút đầu tiên, chúng ta tìm thấy hai thuộc tính (FBXHeaderVersion và FBXVersion) có giá trị là phiên bản định dạng. Trong trường hợp này, đó là phiên bản 6.1. Các thông tin khác có thể bỏ qua trừ khi bạn cũng muốn đọc ngày tạo (CreationTimeStamp).
2. Các nút đối tượng FBX
Nút quan trọng nhất chắc chắn là nút đối tượng.
Nút đối tượng chứa các đỉnh, chỉ số, pháp tuyến, tọa độ UV và vật liệu của mô hình. Cấu trúc của nó như sau:
Đối tượng: {
Mô hình: 'tên mô hình', 'Lưới' {
[...]
Đỉnh: [...]
Chỉ số đỉnh đa giác: [...]
LayerElementNormal: { }
LayerElementUV: { }
}
Vật liệu: 'tên vật liệu', '' { }
[...]
}
3. Đỉnh FBX
Như chúng ta đã thấy, các đỉnh có thể được tìm thấy trong thuộc tính 'Vertex' của các nút con của mô hình.
Cú pháp như sau:
Các đỉnh: v1_x, v1_y, v1_z, v2_x, v2_y, v2_z, [...]
Mỗi đỉnh có ba tọa độ không gian (x, y, z), được phân tách bằng dấu phẩy (cũng dùng để phân tách các đỉnh với nhau). Các tọa độ được biểu thị rõ ràng dưới dạng thập phân với dấu chấm.
Ví dụ như sau:
Đỉnh: 0.000000,0.104800,39.291698,0.000000,0.043400,-44.424301,0.000000,38.654301,-41.818802,-0.000000,39.455002,44.424400
Các đỉnh tạo nên mô hình sẽ là:
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. Chỉ số đỉnh của đa giác FBX
Chỉ số này có thể được tìm thấy trong thuộc tính PolygonVertexIndex.
Tệp FBX có thể xuất các đa giác ba cạnh (tam giác) hoặc nhiều hơn. Hầu hết các tệp xuất các đa giác bốn cạnh (hình tứ giác). Cú pháp tương tự như các đỉnh, nhưng có một điều cần lưu ý:
PolygonVertexIndex: i1, i2,-i3, i4, i5,-i6,[...]
PolygonVertexIndex: i1, i2, i3, -i4, i5, i6, i7, -i8, [...]
Các chỉ số tạo nên một đa giác được sắp xếp theo thứ tự, chỉ số âm có nghĩa là đó là chỉ số cuối cùng của đa giác. Chỉ số cần được đặt thành một số dương, sau đó bạn phải trừ đi 1!
[Nếu bạn thắc mắc tại sao, đó là vì chỉ số ban đầu là tất cả hoặc không có gì với -1. Ví dụ, chỉ số 3 trở thành -4]
Ví dụ như sau:
Chỉ số đỉnh đa giác: 8,7,3,-7,4,8,7,-3,0,5,8,-5
Các đa giác tạo nên mô hình sẽ là:
p1(8,7,3,6)
p2(4,8,7,2)
p3(0,5,8,4)
Lưu ý rằng chỉ số biểu thị điểm cuối của đa giác đã được đặt thành một số dương, sau đó trừ đi 1.
Lưu ý: Card đồ họa không thích hình tứ giác, vì vậy mỗi đa giác có bốn cạnh phải được chia thành hai tam giác trước khi hiển thị mô hình.
5. FBX Normals
Các vectơ pháp tuyến có thể được tìm thấy trong nút con của thuộc tính Normals là LayerElementNormal (mà bản thân nó lại là nút con của Model). Cú pháp tương tự như đối với một trong các đỉnh, tức là một chuỗi tọa độ (x, y, z).
Các vectơ pháp tuyến: n1_x, n1_y, n1_z, n2_x, n2_y, n2_z, [...]
Bạn cần chú ý đến thuộc tính MappingInformationType, thuộc tính này có thể có các giá trị sau:
▪ ByPolygon: theo đa giác, có nghĩa là mỗi đa giác của mô hình đều có một pháp tuyến.
▪ ByPolygonVertex: được xử lý theo đỉnh của đa giác, có nghĩa là mỗi đỉnh của mỗi đa giác trong mô hình đều có một pháp tuyến. Ví dụ, nếu mô hình có 8 đỉnh tạo thành bốn hình tứ giác, sẽ có 16 pháp tuyến (1 pháp tuyến * 4 đa giác * 4 đỉnh đa giác). Lưu ý rằng thông thường các công cụ game chỉ cần các đỉnh xác định một pháp tuyến. Vì vậy, nếu bạn tìm thấy một đỉnh có nhiều hơn một pháp tuyến, bạn có thể bỏ qua các pháp tuyến được tìm thấy sau pháp tuyến đầu tiên, hoặc tính toán giá trị trung bình của tất cả các pháp tuyến (làm mịn pháp tuyến).
▪ ByVertex: xử lý trên từng đỉnh, nghĩa là mỗi đỉnh của mô hình có một pháp tuyến riêng. Đôi khi được gọi là ByVertice, như được viết trong trình xuất Blender. Tôi nghĩ tác giả là người Tây Ban Nha.
▪ ByEdge: được xử lý theo cạnh, điều này có nghĩa là mỗi cạnh của mô hình có một giá trị bình thường (hiếm gặp)
▪ AllSame: điều này có nghĩa là mọi đỉnh của mô hình đều có cùng vectơ pháp tuyến, điều này hiếm hoặc không thể thực hiện được đối với hầu hết các mô hình.
Một thuộc tính quan trọng khác là thuộc tính ReferenceInformationType, có thể có các giá trị sau:
▪ Trực tiếp: cho biết các vectơ pháp tuyến được sắp xếp theo thứ tự.
▪ IndexToDirect (hoặc index trong các phiên bản cũ hơn của định dạng FBX): cho biết thứ tự của các vectơ pháp tuyến được xác định bởi thuộc tính NormalsIndex.
Dưới đây là một ví dụ đồ họa có thể rõ ràng hơn so với văn bản. Mô hình ví dụ là một mặt phẳng trên trục X và Y (do đó tất cả các đỉnh sẽ có tọa độ Z bằng 0), bao gồm 9 đỉnh và 4 đa giác (hình tứ giác). Hình ảnh ví dụ là hình chiếu của mặt phẳng từ trên xuống.

6. Tọa độ UV của FBX
Tọa độ UV có thể được tìm thấy trong thuộc tính UV dưới nút con LayerElementUV (mà bản thân nó lại là nút con của Model). Cú pháp tương tự như đối với đỉnh và pháp tuyến, nhưng tất nhiên sẽ có hai tọa độ thay vì ba.
UV: u1, v1, u2, v2, [...]
Bạn vẫn cần chú ý đến các thuộc tính MappingInformationType và ReferenceInformationType! Hai thuộc tính này có thể có cùng giá trị với các vectơ pháp tuyến, vì vậy các quy tắc tương tự được áp dụng. Thuộc tính chỉ mục (nếu có, tức là IndexToDirect được định nghĩa) là UVIndex.
