付録: 低レベルメッシュ

低レベルメッシュのメモリレイアウト例を見る。

メッシュバッファの例

メッシュデータは、バッファを通じて、ARDKのコアライブラリからUnity C#の世界に公開されます。このようなバッファのレイアウトの概要については、 IARMesh を参照してください。ここでは、別の例として、これらのバッファのメモリレイアウトを紹介します。

メッシュバッファはブロック単位でインデックスが付けられています。頂点とインデックスのバッファは、指定された1つのブロックに対して連続的です。

バッファを説明するために、2つのブロックにまたがるシンプルな平面メッシュを使用してみましょう。

../../../_images/meshing_image_0.png

1つ目の黄色いブロックには2つの面と4つの頂点で構成される正方形、2つ目の青いブロックには1つの面と3つの頂点で構成される三角形が1つずつあります。

このメッシュには全部で2つのブロックが含まれているため、ブロックバッファのサイズは12intということになります。

ブロックバッファは次のようになります。2つのブロックは、異なる座標を指し、それぞれの内容に対応する頂点数と面数を示しています。

../../../_images/meshing_image_1.png

実際、ブロックにはそれぞれ数百の頂点と面が含まれています。ブロックを順に処理し、メッシュをサブメッシュに分割することは、不要な更新やコストのかかる再計算を避ける上で優れた戦略と言えます。

メッシュには全部で7つの頂点があるため、頂点バッファのサイズは42floatになります。頂点バッファは2つの部分で構成されており、1つ目の部分はすべての位置が(x, y, z)の3次元座標で、2つ目の部分は法線ベクトルを(nx, ny, nz)ベクトルとして同じ順序で構成されています。

この場合、最初の4つの頂点は1つ目の黄色いブロックに、次の3つの頂点は2つ目の青いブロックに属します。すべての位置が順に示され、続いて法線が示されています。

../../../_images/meshing_image_2.png

この例では、すべての頂点で同じ法線ベクトルが上向きに共有されており、水平面のジオメトリと一致しています。

頂点2と4、3と5は同一ですが、ブロックは異なる点に注意してください。

最後に、このメッシュには全体で3つの面があるため、面のバッファサイズは9intということになります。1つ目の黄色いブロックの2つの面を先、青いブロックの面を後として、すべての面が頂点順に反時計回りで示されています。

../../../_images/meshing_image_3.png

各int値は、頂点バッファの頂点インデックスを指します。なお、新しいブロックでは、インデックスは0にリセットされないことに注意してください。