メッシュ

三角形メッシュ

細かい線分によって曲線を近似できるように、三角形によって曲面を近似することができる。

なぜ三角形?

三角形は、

だから。

テッセレーション

表面を個別のポリゴン(クワッドと呼ばれる四辺形か、三角形)の集まりに分割する処理。

問題点

テッセレーションのレベルが固定されると、特にオブジェクトがカメラに近いときには、輪郭のエッジが角ばって見える。

回転順序とカリング

三角形は、3つの頂点の位置ベクトルp1\bold{p}_1, p2\bold{p}_2, p3\bold{p}_3によって定義される。

三角形の辺は、それを挟む2つの頂点の位置ベクトルの差によって定義される。

e12=p2p1e23=p3p2e13=p1p3\bold{e}_{12} = \bold{p}_2 - \bold{p}_1 \\ \bold{e}_{23} = \bold{p}_3 - \bold{p}_2 \\ \bold{e}_{13} = \bold{p}_1 - \bold{p}_3

任意の2辺のクロス積を正規化することで、単位面法線ベクトルN\bold{N}が定義される。

N=e12×e13e12×e13\bold{N} = \frac{\bold{e}_{12} \times \bold{e}_{13}}{|\bold{e}_{12} \times \bold{e}_{13}|}

面法線ベクトルの向きを知るためには、三角形の前面と背面を定義する必要がある。

面法線ベクトルは外積なので、回転順序を指定すれば簡単に定義できる。

多くのグラフィックスAPIでは、回転順序に基づいて、背面側の三角形をカリングすることができる。 これにより、見えない三角形を描画せずに済む。

三角形リスト

頂点を3つのグループに分けて、その3つの組み合わせそれぞれが1つの三角形に対応するようにリスト化することで、簡単にメッシュを定義することができる。

インデックス付き三角形リスト

三角形リストの頂点の多くは何度も繰り返し使われている。これはメモリの浪費になる。

インデックス付き三角形リストでは、頂点のリストと三角形のリストを分けて管理することで、メモリの使用量を減らすことができる。

  1. 頂点を一度、重複がないようにリスト化
  2. 三角形を構成する3つの頂点の組(インデックス)を定義

ストリップとファン

インデックスバッファを使うことなく、頂点の重複をある程度減少させるデータ構造。

ストリップ

  1. 最初の3つの頂点が最初の三角形を定義する
  2. 以降の頂点はそれぞれ、直前の2つの頂点と新しい頂点で三角形を定義する

回転順序に一貫性を持たせるために、直前の隣接する2つの頂点は、新しい三角形を形成するたびに位置を入れ替える。

頂点がV0V_0, V1V_1, V2V_2, V3V_3, V4V_4, V5V_5の順に並んでいるとき、三角形は次のように定義される。

ファン

  1. 最初の3つの頂点が最初の三角形を定義する
  2. 以降の頂点は、直前の頂点とファンの最初の頂点で三角形を定義する

頂点がV0V_0, V1V_1, V2V_2, V3V_3, V4V_4の順に並んでいるとき、三角形は次のように定義される。

メッシュとマテリアル

マテリアルは、メッシュの視覚特性をすべて記述したもの。

頂点属性はメッシュに付随しているため、メッシュとマテリアルとの組み合わせ(レンダーパケット)で、オブジェクトのレンダリングに必要な情報はすべて揃うことになる。