Japanese
Leave Your Message

FBX Model Dosya Yapısı Açıklaması

FBX formatı neredeyse tüm 3D motorları tarafından desteklenir ve Autodesk tarafından geliştirilen, 3D modeller için özel bir formattır. Köşe noktalarını, indeksleri, normalleri, UV koordinatlarını, malzemeleri ve animasyonları destekler.
Autodesk, FBX dosyalarını veya aynı amaca hizmet eden diğer kütüphaneleri içe ve dışa aktarmaya olanak sağlayan FBX SDK'sını resmi olarak sunmaktadır. SDK, biri C++ diğeri Python olmak üzere iki arayüz sunmaktadır.
Diğer kütüphanelere olan bağımlılıktan kaçınmak için özel FBX ayrıştırıcıları da yazabilirsiniz.
Bu makalede FBX dosyasının yapısı açıklanmaktadır. Bunu anlamak, özel, hafif bir FBX ayrıştırıcı yazmamızı sağlar. Özel FBX ayrıştırıcı örnekleri için Blender'ın FBX İçe Aktarıcı/Dışa Aktarıcı eklentisine bakabilirsiniz.
FBX formatı ASCII (metin dosyası, insan tarafından okunabilir) veya ikili formatta mevcuttur.

    1. FBX dosya yapısı

    Bu, örnek bir FBX dosyasıdır.
    Öncelikle belirtmek gerekir ki, bazı satırlar noktalı virgülle başlar: bunlar yorum satırlarıdır ve dosyayı okurken dikkate alınmamalıdır.
    İlk yorumdan sonra, FBXHeaderExtension tanımlayıcısı bulunur. Bu, dosya yapısının ilk ana düğümüdür. FBX dosya formatı, aşağıdaki şemayı izleyen bir ağaç yapısıdır:
    FBX Model Dosya Yapısı Açıklaması (1)
    Her düğüm veya alt düğümün kendine özgü nitelikleri olabilir. Nitelikler ana düğümün dışında da bulunabilir, ancak genellikle göz ardı edilebilir. Genel olarak, bir düğümün temel yapısı şu şekildedir:
    düğüm adı: eventual_properties {
    Düğüm_Özelliği_1: değer
    Düğüm_Özelliği_2: değer
    Alt düğüm1 : {
    Altdüğüm_Özelliği_1: değer
    […]
    }
    Düğüm_Özelliği_3: değer
    […]
    }
    Bu, örnek dosyada bulunan bir düğümdür (ilk düğüm):
    FBXHeaderExtension: {
    FBXHeaderVersion: 1003
    FBXVersion: 6100
    CreationTimeStamp: {
    Sürüm: 1000
    Yıl: 2014
    Ay: 03
    Gün: 20
    Saat: 17
    Dakika: 38
    İkinci: 29
    Milisaniye: 0
    }
    Oluşturan: "FBX SDK/FBX Eklentileri derleme 20070228"
    DiğerBayraklar: {
    FlagPLE: 0
    }
    }
    Yapıyı anlamak, verimli bir ayrıştırıcı yazmanın temelidir.
    İlk düğümde, değerleri format sürümlerini gösteren iki öznitelik (FBXHeaderVersion ve FBXVersion) buluyoruz. Bu durumda sürüm 6.1'dir. Oluşturma tarihini (CreationTimeStamp) de okumak istemediğiniz sürece diğer bilgiler göz ardı edilebilir.

    2. FBX nesne düğümleri

    En önemli düğüm kesinlikle nesne düğümüdür.
    Nesne düğümü, modelin köşe noktalarını, indekslerini, normal vektörlerini, UV koordinatlarını ve malzemelerini içerir. Yapısı şu şekildedir:
    Nesneler: {
    Model: 'model adı', 'Mesh' {
    [...]
    Köşeler: [...]
    PolygonVertexIndex: [...]
    LayerElementNormal: { }
    LayerElementUV: { }
    }
    Malzeme: 'malzeme adı', '' { }
    [...]
    }

    3. FBX Köşesi

    Gördüğümüz gibi, köşeler modelin alt düğümlerinin 'Vertex' özelliğinde bulunabilir.
    Sözdizimi şu şekildedir:
    Köşeler: v1_x, v1_y, v1_z, v2_x, v2_y, v2_z, [...]
    Her bir köşe noktasının virgülle ayrılmış (ve bir köşe noktasını diğerinden ayıran) üç uzamsal koordinatı (x, y, z) vardır. Koordinatlar elbette noktalı ondalık biçimde ifade edilir.
    Örnek olarak şunları verebiliriz:
    Köşeler: 0.000000,0.104800,39.291698,0.000000,0.043400,-44.424301,0.000000,38.654301,-41.818802,-0.000000,39.455002,44.424400
    Modeli oluşturan köşeler şunlar olacaktır:
    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 çokgeninin köşe indeksi

    İndeks, PolygonVertexIndex özelliği altında bulunabilir.
    FBX dosyaları üçgen veya daha fazla sayıda çokgen (üçgen) dışa aktarabilir. Çoğu dosya dörtgen (dörtgen) dışa aktarır. Sözdizimi köşelere benzer, ancak dikkat edilmesi gereken bir nokta var:
    PolygonVertexIndex: i1, i2,-i3, i4, i5,-i6,[...]
    PolygonVertexIndex: i1, i2, i3, -i4, i5, i6, i7, -i8, [...]
    Bir çokgeni oluşturan indisler sıralıdır; negatif bir indis, çokgenin son indisi anlamına gelir. İndeks pozitif bir sayıya ayarlanmalı ve ardından bu sayıdan 1 çıkarılmalıdır!
    [Bunun nedenini merak ediyorsanız, orijinal indeksin -1 değeriyle ya hep ya hiç prensibine göre çalışmasından kaynaklanıyor. Örneğin, 3. indeks -4 oluyor.]
    Örnek şu şekildedir:
    PolygonVertexIndex: 8,7,3,-7,4,8,7,-3,0,5,8,-5
    Modeli oluşturan çokgenler şunlardır:
    p1(8,7,3,6)
    p2(4,8,7,2)
    p3(0,5,8,4)
    Poligonun sonunu gösteren indeksin pozitif bir sayıya ayarlandığını ve ardından bu sayıdan 1 çıkarıldığını unutmayın.
    Hatırlatma: Grafik kartları dörtgenleri sevmez, bu nedenle dört kenarlı her çokgen, modeli görüntülemeden önce iki üçgene bölünmelidir.

    5. FBX Normalleri

    Normaller, Normals özelliğinin alt düğümü olan LayerElementNormal (ki bu da Model'in alt düğümüdür) altında bulunabilir. Sözdizimi, köşelerden biri için kullanılanla aynıdır, yani bir dizi (x,y,z) koordinatıdır.
    Normaller: n1_x, n1_y, n1_z, n2_x, n2_y, n2_z, [...]
    MappingInformationType özelliğine dikkat etmeniz gerekiyor; bu özellik aşağıdaki değerlere sahip olabilir:
    ▪ ByPolygon: Çokgen tabanlıdır; yani modelin her çokgeninin bir normali vardır.
    ▪ ByPolygonVertex: Poligon köşelerine göre işlenir; bu, modelin her poligonunun her köşesinin bir normali olduğu anlamına gelir. Örneğin, model dört dörtgen oluşturan 8 köşeye sahipse, 16 normal olacaktır (1 normal * 4 poligon * 4 poligon köşesi). Genellikle oyun motorlarının köşelerin yalnızca bir normal tanımlamasını gerektirdiğini unutmayın. Bu nedenle, birden fazla normali olan bir köşe bulursanız, ilk normalden sonra bulunan normalleri yok sayabilir veya tüm normallerin ortalamasını hesaplayabilirsiniz (normal yumuşatma).
    ▪ ByVertex: Köşe başına işlem, yani modelin her köşesinin bir normali vardır. Blender dışa aktarıcısında yazıldığı gibi bazen ByVertice olarak da adlandırılır. Sanırım yazar İspanyol.
    ▪ ByEdge: Kenara göre işlenir, bu da modelin her kenarının normal (nadir) bir işleme sahip olduğu anlamına gelir.
    ▪ AllSame: Bu, modelin her köşesinin aynı normal vektöre sahip olduğu anlamına gelir; bu durum çoğu model için nadir veya imkansızdır.
    Bir diğer önemli özellik ise ReferenceInformationType özelliğidir ve aşağıdaki değerlere sahip olabilir:
    ▪ Doğrudan: Normallerin sıralı olduğunu gösterir.
    ▪ IndexToDirect (veya FBX formatının eski sürümlerinde index): Normal vektörlerin sırasının NormalsIndex özelliği tarafından belirlendiğini gösterir.
    Aşağıda metinden daha açık olabilecek grafiksel bir örnek bulunmaktadır. Örnek model, X ve Y eksenleri üzerinde (bu nedenle tüm köşelerin Z koordinatı 0 olacaktır) 9 köşe ve 4 çokgenden (dörtgen) oluşan bir düzlemdir. Örnek görüntü, düzlemin yukarıdan görünümüdür.
    FBX Model Dosya Yapısı Açıklaması (2)

    6. FBX UV koordinatları

    UV koordinatları, LayerElementUV (ki bu da Model düğümünün bir alt düğümüdür) alt düğümü altındaki UV özelliğinde bulunabilir. Sözdizimi, köşeler ve normallerinkine benzer, ancak elbette üç yerine iki koordinat olacaktır.
    UV: u1, v1, u2, v2, [...]
    MappingInformationType ve ReferenceInformationType özelliklerine hala dikkat etmeniz gerekiyor! Bu iki özellik normal değerlerle aynı değerlere sahip olabilir, bu nedenle aynı kurallar geçerlidir. İndeks özelliği (varsa, yani IndexToDirect tanımlanmışsa) UVIndex'tir.