Japanese
Leave Your Message

FBXモデルファイルの構造について解説します

FBX形式は、ほぼすべての3Dエンジンでサポートされており、Autodeskが開発した独自の3Dモデル形式です。頂点、インデックス、法線、UV座標、マテリアル、アニメーションをサポートしています。
オートデスクは、FBXファイルや同様の目的を持つ他のライブラリのインポートおよびエクスポートを可能にするFBX SDKを公式に提供しています。このSDKは、C++とPythonの2つのインターフェースを提供します。
他のライブラリへの依存を避けるために、独自のFBXパーサーを作成することもできます。
この記事では、FBXファイルの構造について説明します。構造を理解することで、軽量なカスタムFBXパーサーを作成できます。カスタムFBXパーサーの例については、BlenderのFBXインポーター/エクスポータープラグインを参照してください。
FBX形式は、ASCII(テキストファイル、人間が読める形式)またはバイナリ形式で利用可能です。

    1. FBXファイルの構造

    これはサンプルFBXファイルです。
    まず最初に注意すべき点は、一部の行がセミコロンで始まっていることです。これらはコメントであり、ファイルを読み込む際には無視する必要があります。
    最初のコメントの後、識別子FBXHeaderExtensionが見つかります。これはファイル構造の最初の主要ノードです。FBXファイル形式は、実際には以下のスキームに従うツリー構造です。
    FBXモデルファイルの構造解説(1)
    各ノードまたは子ノードは、それぞれ固有の属性を持つことができます。属性はメインノードの外部にも存在しますが、通常は無視できます。一般的に、ノードの基本的な構造は以下のとおりです。
    ノード名: eventual_properties {
    ノードプロパティ1:値
    ノードプロパティ2:値
    サブノード1 : {
    サブノードプロパティ1:値
    […]
    }
    ノードプロパティ3:値
    […]
    }
    これはサンプルファイル内で見つかったノード(最初のノード)です。
    FBXHeaderExtension: {
    FBXHeaderVersion: 1003
    FBXバージョン: 6100
    CreationTimeStamp: {
    バージョン: 1000
    年:2014年
    月: 3
    20日目
    時: 17
    分:38
    2位:29
    ミリ秒: 0
    }
    作成者:「FBX SDK/FBXプラグイン ビルド 20070228」
    OtherFlags: {
    FlagPLE: 0
    }
    }
    構造を理解することは、効率的な構文解析器を作成するための基礎となる。
    最初のノードには、フォーマットバージョンを表す2つの属性(FBXHeaderVersionとFBXVersion)があります。この例ではバージョン6.1です。作成日時(CreationTimeStamp)も読み取る必要がある場合を除き、その他の情報は無視して構いません。

    2. FBXオブジェクトノード

    最も重要なノードは間違いなくオブジェクトノードです。
    オブジェクトノードには、モデルの頂点、インデックス、法線、UV座標、およびマテリアルが含まれています。その構造は以下のとおりです。
    オブジェクト: {
    モデル: 'モデル名', 'メッシュ' {
    [...]
    頂点: [...]
    PolygonVertexIndex: [...]
    LayerElementNormal: { }
    LayerElementUV: { }
    }
    マテリアル: 'マテリアル名', '' { }
    [...]
    }

    3. FBX Vertex

    これまで見てきたように、頂点はモデルの子ノードの「Vertex」プロパティで見つけることができます。
    構文は以下のとおりです。
    頂点: v1_x、v1_y、v1_z、v2_x、v2_y、v2_z、[...]
    各頂点は、コンマで区切られた3つの空間座標(x、y、z)を持ちます(コンマは頂点同士の区切りにもなります)。座標は当然ながら、ドットを用いた10進数で表されます。
    例えば、以下のような例があります。
    頂点: 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)

    4. FBXポリゴンの頂点インデックス

    インデックスは、PolygonVertexIndex プロパティで確認できます。
    FBXファイルは、三角形(三角形)以上のポリゴンをエクスポートできます。ほとんどのファイルは四角形(四角形)をエクスポートします。構文は頂点と似ていますが、注意すべき点が1つあります。
    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を減算することに注意してください。
    注意:グラフィックカードは四角形を苦手とするため、4辺の多角形はモデルを表示する前に2つの三角形に分割する必要があります。

    5. FBX法線

    法線は、Normalsプロパティの子ノードであるLayerElementNormal(これはModelの子ノードです)で確認できます。構文は頂点の場合と同じで、(x,y,z)座標の羅列です。
    法線: n1_x、n1_y、n1_z、n2_x、n2_y、n2_z、[...]
    MappingInformationType プロパティには、以下の値が含まれるので注意が必要です。
    ▪ ByPolygon: ポリゴンによる指定。これは、モデルの各ポリゴンに法線があることを意味します。
    ▪ ByPolygonVertex: ポリゴンの頂点ごとに処理されます。つまり、モデルの各ポリゴンの各頂点には法線があります。たとえば、モデルに 8 つの頂点があり、4 つの四角形を形成している場合、16 個の法線 (1 つの法線 × 4 つのポリゴン × 4 つのポリゴンの頂点) が存在します。通常、ゲームエンジンでは、頂点ごとに 1 つの法線のみを定義する必要があることに注意してください。そのため、法線が複数ある頂点が見つかった場合は、最初の法線以降の法線を無視するか、すべての法線の平均 (法線平滑化) を計算することができます。
    ▪ ByVertex: 頂点ごとの処理。つまり、モデルの各頂点に法線が割り当てられます。BlenderのエクスポーターではByVerticeと表記されることもあります。作者はスペイン人だと思います。
    ▪ ByEdge: エッジごとに処理されるため、モデルの各エッジに法線 (まれ) があります
    ▪ AllSame: これは、モデルのすべての頂点が同じ法線を持つことを意味します。これは、ほとんどのモデルではまれであるか、不可能です。
    もう1つの重要なプロパティはReferenceInformationTypeプロパティで、以下の値をとることができます。
    ▪ 直接: 法線が順序付けられていることを示します。
    ▪ IndexToDirect(またはFBXフォーマットの旧バージョンではindex):法線の順序がNormalsIndexプロパティによって指定されることを示します。
    以下に、テキストよりも分かりやすい図解を示します。この図解モデルは、X軸とY軸上の平面(すべての頂点のZ座標は0)で、9つの頂点と4つの多角形(四角形)から構成されています。図は、平面を上から見た図です。
    FBXモデルファイルの構造解説(2)

    6. FBX UV座標

    UV座標は、子ノードLayerElementUV(さらにModelノードの子ノード)のUVプロパティで確認できます。構文は頂点と法線と同様ですが、もちろん座標は3つではなく2つになります。
    UV: u1、v1、u2、v2、[...]
    MappingInformationTypeとReferenceInformationTypeプロパティにも注意が必要です。これらの2つのプロパティは法線と同じ値を持つことができるため、同じルールが適用されます。インデックスプロパティ(IndexToDirectが定義されている場合)はUVIndexです。