Procedural Mesh Geometry (プロシージャル メッシュ ジオメトリ)
Mesh クラスの使用

メッシュの構造

メッシュは、立体のオブジェクトのように見せるために、3D空間に並べられた三角形から構成されています。三角形は3つの頂点により定義されます。Meshクラスでは、すべての頂点はひとつの配列に格納されていて、それぞれの三角形は頂点配列のインデックスにあたる3つの整数により指定されます。三角形はさらに一つの整数の配列として集められます。この整数は配列の最初から3つごとにグルーピングされるため、要素 0、1、2は最初の三角形を定義し、二つ目の三角形は3、4、5と続いていきます。任意の頂点は自由に三角形を定義するのに再利用できますが、後述するように、以下の点に注意が必要です。

ライティングと法線

すべてのオブジェクトの基本形状は三角形で定義できますが、大部分のケースではメッシュを表示するのには追加の情報が必要です。オブジェクトがライティングにより正しくシェーディングされるためには、法線ベクトルは各頂点ごとに定義する必要があります。法線は外向きに向かうベクトルであり、メッシュ表面に対して垂直に各頂点の位置から出ています。シェーディング計算において、各頂点の法線は入射するライトのベクトルの方向と比較されます。もし二つのベクトルが完全に平行である場合、平面はその点において真正面からライトを受け取り、ライトの明るさのすべてはシェーディングに適用されます。法線ベクトルに対して真横から入射する光の場合、平面はその点においてまったく照らされることがありません。一般的にライトは法線に対してある程度の角度をもって入射する(入射角)ことによって完全な明るさと完全な暗さとの間の値となります。

メッシュは三角形から構成されているため、角の法線は三角形の平面に対して垂直であるように感じるかもしれません。しかし、法線は実際には三角形に渡って補間されて、角の間の平面の中間位置に方向が割り当てられます。もし 3 つの法線がすべて同じ方向を指す場合、三角形は均等に全面がライティングされます。別の三角形を均等にシェーディングされる効果は、そのエッジがはっきり際立つことになります。これはキューブや、エッジの尖った固体のようなモデルにとっては必要なことですが、カーブのある表面を近似するようなスムーズなシェーディングを作成する場合には法線の補間が必要です。

きれいなエッジを表示するには、頂点を各エッジ付近で二重化することが必要です。隣接する二つの三角形はそれぞれ別の法線が必要だからです。 カーブのある表面では、頂点はエッジに沿って共有すればよいのですが、シェーディングされた法線の最適な向きを決定するのは難しいことです。法線は単に三角形を囲む表面の法線の平均であるかもしれません。しかし、球のようなオブジェクトでは、法線は球の中心から外向きに向かっていることが必要です。

Mesh.RecalculateNormalsメソッドで、自動的に法線の方向を算出できるようになります。ここでは、三角形により共有される頂点がスムーズな表面を表し、二重の頂点ははっきりしたエッジを示すと仮定します。これは多くのケースで悪い推定ではありませんが、表面がスムーズであるにも関わらず二重化する必要があるいくつかのテクスチャの状況では RecalculateNormals は失敗します。

テクスチャリング

ライティングに加えて、モデルは一般的にテクスチャを活用して、平面上にディテールを作成することができます。テクスチャは伸縮可能なゴムのシートにプリントしたイメージのようです。各三角形メッシュで、テクスチャイメージの三角形領域が定義されて、そのテクスチャ三角形は伸縮されてメッシュ三角形に合うように “ピン付け” されます。これを機能させるためには、各頂点はピン付けするイメージ位置の座標を格納する必要があります。これらの座標は二次元であり、0 - 1 の範囲でスケールされます( 0 はイメージの左/下を表し 1 は右/上を示します)。この座標を 3D 空間上のX,Y座標と混同しないために、座標をU,Vで指定し、UV 座標と呼びます。

法線と同じように、テクスチャ座標は頂点毎に一つですが、異なる UV 値を使うために、単純に頂点を二重化したい事があります。わかりやすい例としては、二つの隣接する三角形が連続しないテクスチャイメージを使用する場合などです(例えば顔テクスチャにある目など)。また、通常の完全に閉じたオブジェクトには、テクスチャ領域が一周して互いに繋がる部分である “シーム” が必要ですが、シームの片側の UV 値は、反対側とは異なる値になります。

関連項目

Procedural Mesh Geometry (プロシージャル メッシュ ジオメトリ)
Mesh クラスの使用