LoginSignup
1
3

More than 5 years have passed since last update.

FBX解読④ Mesh描画編

Last updated at Posted at 2017-07-31

http://qiita.com/gshirato/items/87a14ffd9844dd474b72
の続き

固定ハフマンで展開していく。

Verticesを順に読んでくと

0x00 0x00 (4,1) F0 3F (3,6) ...というように続いていく
ここでカッコは(一致長、自分からの距離)を表しており、
9 8 4 (2,3)9 8 4 *9 8*
また、一致長>自分からの距離の場合は一致長に達するまで同じところをくりかえす
3 5 2 1 (6,3)3 5 2 1 *5 2 1 5 2 1*

つまりVerticesのDataは

0x00 0x00 0x00 0x00  0x00 0x00 0xf0 0x3f
0x00 0x00 0x00 ...

と翻訳できる。
終了コード読み込んだ時点でそのブロックは終了して良い。
複数ブロックがある場合は最後にそれらを連結させる。

このように翻訳していくと最終的に192byte=(8*24)の配列を発見でき、これはDouble型の大きさが8bytesであることを考えると納得の行く数字。
あとは出てきた数字をDouble型と同じく倍精度浮動小数点数型として8byteずつよんでいくだけ。

Unityで表示

Meshクラスを使う

main
Mesh mesh = gameObject.AddComponent<MeshFilter>().mesh;
MeshRenderer renderer = gameObject.AddComponent<MeshRenderer>();

//配列から得た情報
Vector3[] vertices = new Vector3[]
    {
        new Vector3(1f, 1f, -1f),
        ... //上で得た頂点情報をそのまま使える
    }
Vector3[] normals = new Vector3[]{}
int[] verticesIndex = new int[]
    {
        0, 1, 2, 3,
       ....
    }

//meshのセットアップ
mesh.vertices = vertices;
mesh.triangles = verticesIndex;//四角ポリゴンなのでtriangleを使うべきなのかは謎。
mesh normals = normals;
GetComponent<MeshFilter>.mesh = mesh;
mesh.SetIndices(makeIndices(8), MeshTopology.Quads,0);

makeIndices()
int[] makeIndices(int n)
{
    int[] indices = new int[n];
    for(int i = 0; i<n;i++)
    {
        indices[i] = i;
    }
    return indices;

}

normalsはまだ手を付けてないのできれいには見えないはずだが立方体が見えるはず…

結果

tris.PNG
lines.PNG
LineStrip.PNG

WTF !!!

改善に向けて努めて行きます。決して遠くはない。

HoloLensアプリ開発記事一覧

http://qiita.com/gshirato/items/6c026f2c67dc332f829b から

1
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
3