「接線ベクトル」の版間の差分
Administrator (トーク | 投稿記録) |
Administrator (トーク | 投稿記録) |
||
| (同じ利用者による、間の1版が非表示) | |||
| 8行目: | 8行目: | ||
TangentベクトルとBinormalベクトルの計算については、あらかじめUV座標と法線ベクトルはわかっている(頂点データとして保持している)前提となっているのが一般的です。 | TangentベクトルとBinormalベクトルの計算については、あらかじめUV座標と法線ベクトルはわかっている(頂点データとして保持している)前提となっているのが一般的です。 | ||
=== | === Tangentベクトルの計算:Normalベクトルを使う方法 === | ||
大雑把に1行で書くと以下のようになります。NormalベクトルとUpベクトルのクロス積を取ればTangentベクトルになります。 | 大雑把に1行で書くと以下のようになります。NormalベクトルとUpベクトルのクロス積を取ればTangentベクトルになります。 | ||
Vector3 tangent = Vector3.Cross(normal, Vector3.UnitY); | Vector3 tangent = Vector3.Cross(normal, Vector3.UnitY); | ||
| 23行目: | 23行目: | ||
Tangentベクトルの計算については、わりと重めの処理であり、かつ頻繁に変化する値でもないので、あらかじめCPU上で計算しておき、頂点データのひとつとして保持する方法が主流です。 | Tangentベクトルの計算については、わりと重めの処理であり、かつ頻繁に変化する値でもないので、あらかじめCPU上で計算しておき、頂点データのひとつとして保持する方法が主流です。 | ||
=== Tangentベクトルの計算:頂点座標とUV座標を使う方法 === | |||
// 頂点エッジ | |||
Vector3 edge1 = v1 - v0; | |||
Vector3 edge2 = v2 - v1; | |||
// UVエッジ | |||
Vector2 delta1 = u1 - u0; | |||
Vector2 delta2 = u2 - u0; | |||
// 接線ベクトル | |||
Vector3 tangent = normalize( (delta2.Y * edge1 - delta1.Y * edge2) / (delta1.X * delta2.Y - delta2.X * delta1.Y) ); | |||
=== Binormalの計算式 === | === Binormalの計算式 === | ||
| 28行目: | 38行目: | ||
Vector3 binormal = Vector3.Normalize(Vector3.Cross(normal, tangent)); | Vector3 binormal = Vector3.Normalize(Vector3.Cross(normal, tangent)); | ||
Binormalベクトルの計算については、わりと軽めの処理なので、頂点データを節約すべく、GPU上でリアルタイムに計算する方法が主流です。 | |||
ただGPUが貧弱なモバイル環境などではTangentベクトルと同様に事前にCPU上で計算しておいても良いと思います。モバイル向けの[[ローポリゴン]]で頂点データのサイズが問題になることはまずないと思います。 | |||