接線ベクトル
2023年7月10日 (月) 02:04時点におけるAdministrator (トーク | 投稿記録)による版 (ページの作成:「'''接線ベクトル'''とは、2DのUV座標を3Dのローカル座標に変換したものです。 * U軸を3D変換したものは「Tangentベクトル」…」)
接線ベクトルとは、2DのUV座標を3Dのローカル座標に変換したものです。
- U軸を3D変換したものは「Tangentベクトル」
- V軸は3D変換したものは「Binormalベクトル」
- そしてZ軸は「Normalベクトル(法線ベクトル)」と呼ばれます。
TangentベクトルとBinormalベクトルの計算については、あらかじめUV座標と法線ベクトルはわかっている(頂点データとして保持している)前提となっているのが一般的です。
Tangentベクトルの計算
大雑把に1行で書くと以下のようになります。NormalベクトルとUpベクトルのクロス積を取ればTangentベクトルになります。
Vector3 tangent = Vector3.Cross(normal, Vector3.UnitY);
しかし、上記の計算式にはNormalベクトルとUpベクトルが完全一致する場合にゼロを返すという欠点があります。 この問題の回避策として2種類のUpベクトルで計算して都合の良さそうな方を採用するという方法があります。
Vector3 tangent; Vector3 c1 = Vector3.Cross(normal, Vector3.UnitY); Vector3 c2 = Vector3.Cross(normal, Vector3.UnitZ); if (Vector3.Length(c2) < Vector3.Length(c1)) tangent = Vector3.Normalize(c1); else tangent = Vector3.Normalize(c2);
Tangentベクトルの計算については、わりと重めの処理であり、かつ頻繁に変化する値でもないので、あらかじめCPU上で計算しておき、頂点データのひとつとして保持する方法が主流です。
Binormalの計算式
NormalベクトルとTangentベクトルの2つがわかっているならば、その2つのクロス積を取るだけです。
Vector3 binormal = Vector3.Normalize(Vector3.Cross(normal, tangent));
Binormalベクトルの計算については、わりと軽めの処理なので、頂点データを節約すべく、GPU上でリアルタイムに計算する方法が主流です。