Τι είναι ένα αρχείο FBX;
Το FBX, FilmBox, είναι μια δημοφιλής μορφή αρχείου 3D που αναπτύχθηκε αρχικά από την Kaydara για το MotionBuilder. Εξαγοράστηκε από την Autodesk Inc το 2006 και τώρα είναι μία από τις κύριες μορφές ανταλλαγής 3D όπως χρησιμοποιείται από πολλά εργαλεία 3D. Το FBX είναι διαθέσιμο τόσο σε δυαδικό όσο και σε μορφή αρχείου ASCII. Η μορφή δημιουργήθηκε για να παρέχει διαλειτουργικότητα μεταξύ εφαρμογών δημιουργίας ψηφιακού περιεχομένου. Υπάρχουν πολλά διαθέσιμα εργαλεία για τη μετατροπή από/σε μορφή αρχείου FBX.
Μορφή αρχείου FBX - Περισσότερες πληροφορίες
Το FBX είναι μια ιδιόκτητη μορφή και οι προδιαγραφές για τη δυαδική μορφή του αρχείου δεν είναι επίσημα διαθέσιμες. Ένα C++ FBX SDK παρέχεται από την Autodesk για ανάγνωση, εγγραφή και μετατροπή σε/από αρχείο FBX. Ένα σενάριο εισαγωγής και εξαγωγής Python για FBX είναι επίσης διαθέσιμο στο λογισμικό Blender που δεν χρησιμοποιεί το FBX SDK.
Δομή αρχείου που βασίζεται σε κείμενο
Η δομή του αρχείου που βασίζεται σε κείμενο είναι μια δομή δέντρου τεκμηριωμένη με σαφώς ονομασμένα αναγνωριστικά. Αποτελείται από μια ένθετη λίστα κόμβων διατεταγμένων σε ιεραρχία όπου κάθε κόμβος έχει:
- Ένα αναγνωριστικό NodeType (όνομα τάξης)
- Μια πλειάδα ιδιοτήτων που σχετίζονται με αυτό, τα πλειάδα στοιχείων είναι οι συνήθεις πρωτόγονοι τύποι δεδομένων: ##float, integer, string## κ.λπ.
- Μια λίστα που περιέχει κόμβους στην ίδια μορφή (αναδρομικά).
Αυτά μπορούν να αναπαρασταθούν λογικά ως εξής:
NodeType: SomeProperty0a, SomeProperty0b, ... , {
NestedNodeType1 : SomeProperty1a, ...
NestedNodeType2 : SomeProperty2a, ... , {
... Sub-scope
}
...
}
Ορισμένοι από τους τυπικούς κόμβους ορίζονται ως σιωπηρή λίστα όπου κάθε στοιχείο αποτελείται από μια ένθετη λίστα. Οποιαδήποτε εφαρμογή, που σκοπεύει να αποκτήσει πρόσβαση στη γεωμετρία FBX, πρέπει να αναλύσει αυτά τα περιεχόμενα και να δώσει χρήσιμο νόημα σε αυτό. Ένα παράδειγμα αρχείου FBX που βασίζεται σε κείμενο είναι όπως δίνεται παρακάτω:
; FBX ...
; Copyright (C) 1997-2008 ...
; All rights reserved.
; ----------------------------------------------------
FBXHeaderExtension: {
FBXHeaderVersion: 1003
FBXVersion: 6000
CurrentCameraResolution: {
CameraName: "Model::Producer Perspective"
CameraResolutionMode: "Window Size"
CameraResolutionW: 1
CameraResolutionH: 1
}
CreationTimeStamp: {
...
}
}
;Object definitions
;------------------------------------------------------------------
Definitions: {
Count: 2
ObjectType: "Model" {
Count: 2
}
}
...
Δομή δυαδικού αρχείου αρχείων FBX
Όπως αναφέρθηκε προηγουμένως, οι προδιαγραφές μορφής αρχείου FBX δεν είναι διαθέσιμες δημόσια για το FBX. Εφόσον, το Blender Foundation εφαρμόζει τη μορφή αρχείου FBX χωρίς τη χρήση του SDK που παρέχει η εταιρεία, ορισμένες από τις λεπτομέρειες σχετικά με τη δυαδική μορφή αρχείου είναι διαθέσιμες ως μέρος της εφαρμογής του.
Η δομή των δυαδικών αρχείων ακολουθεί την ακόλουθη σειρά:
- Κεφαλίδα
- Καταγραφή αντικειμένου
- Υποσέλιδο
Κεφαλίδα FBX
Οι πληροφορίες κεφαλίδας αρχείου αποτελούνται από 27 byte.
- Byte 0 - 20: Kaydara FBX Binary \x00 (αρχείο-μαγικό, με 2 κενά στο τέλος και μετά τερματιστής NULL).
- Byte 21 - 22: [0x1A, 0x00]## (άγνωστο αλλά όλα τα παρατηρούμενα αρχεία εμφανίζουν αυτά τα byte).
- Byte 23 - 26: ανυπόγραφο int, ο αριθμός έκδοσης. 7300 για την έκδοση 7.3 για παράδειγμα.
Εγγραφή αντικειμένου
Η κεφαλίδα ακολουθείται από μια εγγραφή αντικειμένου που είναι μια πλήρης εγγραφή κόμβου με κενό όνομα και κενή λίστα ιδιοτήτων. Περιέχει αναδρομικά ολόκληρο τον σχηματισμό αρχείου.
Υποσέλιδο
Η ενότητα FBX Footer βρίσκεται στο τέλος του αρχείου του οποίου τα περιεχόμενα είναι άγνωστα.
Μορφές εγγραφής
Οι εγγραφές σε ένα αρχείο FBX κατηγοριοποιούνται ως:
- Εγγραφές κόμβων
- Μητρώα ιδιοκτησίας
Μορφή εγγραφής κόμβου
Κάθε μορφή εγγραφής κόμβου ονομάζεται και έχει την ακόλουθη διάταξη μνήμης.
Μέγεθος (Bytes) | Τύπος ημερομηνίας | Όνομα |
---|---|---|
4 | UIint32 | EndOffset |
4 | UInt32 | NumProperties |
4 | UIint32 | PropertyListLen |
1 | UIint8 | NameLen |
ΌνομαΜήκος | χαρ | Όνομα |
? | ? | Ιδιότητα[n], όπου n = 0:PropertyListLen |
Προαιρετικό | ||
? | ? | NestedList |
13 | uint8[] | Μηδενική εγγραφή |
όπου:
- Το «EndOffset» είναι η απόσταση από την αρχή του αρχείου μέχρι το τέλος της εγγραφής κόμβου (δηλαδή το πρώτο byte ό,τι ακολουθεί). Αυτό μπορεί να χρησιμοποιηθεί για την εύκολη παράβλεψη άγνωστων ή μη απαιτούμενων εγγραφών.
- Το “NumProperties” είναι ο αριθμός των ιδιοτήτων στην πλειάδα τιμών που σχετίζεται με τον κόμβο. Μια ένθετη λίστα ως τελευταίο στοιχείο δεν υπολογίζεται ως ιδιότητα.
- Το “PropertyListLen” είναι το μήκος της λίστας ιδιοτήτων. Αυτό είναι το μέγεθος που απαιτείται για την αποθήκευση των ιδιοτήτων ##NumProperties##, το οποίο εξαρτάται από τον τύπο δεδομένων των ιδιοτήτων.
- «NameLen» είναι το μήκος του ονόματος του αντικειμένου, σε χαρακτήρες. Η μόνη περίπτωση όπου αυτό είναι 0 φαίνεται να είναι οι λίστες ανώτατου επιπέδου.
- «Όνομα» είναι το όνομα του αντικειμένου. Δεν υπάρχει μηδενικός τερματισμός.
- Το “Property[n]” είναι η nη ιδιότητα. Για τη μορφή, δείτε την ιδιότητα ενότητας Μορφή εγγραφής. Οι ιδιότητες γράφονται διαδοχικά και χωρίς γέμιση.
- Το “NestedList” είναι η ένθετη λίστα, η παρουσία της οποίας υποδεικνύεται με μια εγγραφή NULL στο τέλος.
Η ύπαρξη μιας καταχώρησης ένθετης λίστας μπορεί να προσδιοριστεί ελέγχοντας εάν έχουν απομείνει byte μέχρι να επιτευχθεί το EndOffset. Εάν ναι, η επόμενη εγγραφή αντικειμένου θα πρέπει να διαβαστεί αμέσως μετά την τελευταία ιδιότητα. Στη συνέχεια, η εγγραφή αντικειμένου ακολουθεί 13 μηδενικά byte, τα οποία στη συνέχεια συνδυάζονται με το EndOffset. Ο σκοπός ή η απαίτηση της καταχώρησης NULL δεν είναι γνωστός και μπορεί να παραπέμπει σε κάποια δυνατότητα μορφής.
Μορφή εγγραφής ιδιοκτησίας
Μια εγγραφή ιδιοτήτων περιέχει λεπτομέρειες σχετικά με ιδιότητες που αποτελούν μέρος του Node. Μια εγγραφή ιδιότητας έχει την ακόλουθη διάταξη μνήμης:
Μέγεθος (Bytes) | Τύπος δεδομένων | Όνομα |
---|---|---|
1 | χαρ | Κωδικός τύπου |
? | ? | Δεδομένα |
Το TypeCode αντιπροσωπεύει κωδικούς χαρακτήρων που ταξινομούνται σε ομάδες που απαιτούν παρόμοιο χειρισμό. Οι TypeCodes μπορούν να κατηγοριοποιηθούν στους ακόλουθους τύπους και το TypeCode μπορεί να είναι ένας από τους κωδικούς χαρακτήρων μεταξύ αυτών των τύπων.
Πρωτόγονοι τύποι
Y: 2 byte signed Integer
C: 1 bit boolean (1: true, 0: false) encoded as the LSB of a 1 Byte value.
I: 4 byte signed Integer
F: 4 byte single-precision IEEE 754 number
D: 8 byte double-precision IEEE 754 number
L: 8 byte signed Integer
Τα δεδομένα στην πρωτόγονη εγγραφή βαθμωτών τύπων είναι ακριβώς η δυαδική αναπαράσταση της τιμής, σε σειρά byte ελάχιστα endian.
Τύποι πίνακα
f: Array of 4 byte single-precision IEEE 754 number
d: Array of 8 byte double-precision IEEE 754 number
l: Array of 8 byte signed Integer
i: Array of 4 byte signed Integer
b: Array of 1 byte Booleans (always 0 or 1)
Τα δεδομένα για τον τύπο πίνακα είναι πιο περίπλοκα και έχουν την ακόλουθη δομή.
Μέγεθος (Bytes) | Τύπος δεδομένων | Όνομα |
---|---|---|
4 | Uint32 | Μήκος πίνακα |
4 | Uint32 | Κωδικοποίηση |
4 | Uint32 | CompressedLength |
? | ? | Περιεχόμενα |
Ειδικοί τύποι
Ακολουθούν οι Ειδικοί Τύποι Κωδικοί Τύπου.
S: String
R: raw binary data
Και οι δύο αυτοί TypeCodes αντιπροσωπεύονται ως εξής:
Μέγεθος (Bytes) | Τύπος δεδομένων | Όνομα |
---|---|---|
4 | Uin32 | Μήκος |
Μήκος |
Η συμβολοσειρά δεν τερματίζεται με μηδέν και μπορεί να περιέχει \0 χαρακτήρες (αυτός στην πραγματικότητα χρησιμοποιείται σε ορισμένες ιδιότητες FBX).