グラフィックプログラミングのコンテキストで従法線が何であるかを調べようとしていますが、手短に言えば、あるサイトで、従法線が法線と接線の間の外積として計算されているのを見ました (つまり、クロス(法線、接線) )、これは従法線を計算する正しい方法ですか?
5 に答える
それは完全に従法線の定義ではないことを指摘するだけです。これが Bi Tangentの定義です。Binormal は、曲面によって形成される「他の」法線に関連する、まったく異なるものです。
人々はその間違いを繰り返さないように学ぶ必要があります (法線マッピングの初期の頃に誰かが作ったものです)。
mathworld によると、従法cross(tangent,normal)
線ベクトルはwheretangent
およびnormal
が単位法線ベクトルとして定義されます。
厳密に言えば、外積を取るときは順序が重要であることに注意してください。cross(tangent,normal)
とは反対方向を指しcross(normal,tangent)
ます。アプリケーションによっては、問題になる場合と問題にならない場合があります。計算が内部的に一貫している限り、それは問題ではありません。
はい、BinormalまたはBitangentは、頂点の法線と接線の間のクロスです。これら3つのうち2つのベクトルがある場合は、もう1つを計算できます。
たとえば、接線と従法線(または双接線)がある場合は、法線を計算できます。
これは、GLSLで法線のみを持つ双法線と双角子を作成できるサンプルです。
varying vec3 normal;
varying vec4 vpos;
varying vec3 T,B;
void main()
{
gl_TexCoord[0] = gl_MultiTexCoord0;
normal = normalize(gl_NormalMatrix*gl_Normal);
gl_Position =gl_ProjectionMatrix*gl_ModelViewMatrix*gl_Vertex;
vpos = gl_ProjectionMatrix*gl_ModelViewMatrix*gl_Vertex;
T = cross(normal,vec3(-1,0,0));
B = cross(T,normal);
}
希望する結果が得られない場合もありますが、目的の場所に到達する場合があります。
法線、接線、および従法線ベクトルは、接空間を表す正規直交基底を形成します。接線空間(テクスチャ空間と呼ばれることもあります)は、法線マップを
使用したピクセル単位照明で使用され、表面の詳細をシミュレートします(壁やゴルフボールを想像してください)。
接線ベクトルと従法線ベクトルは、同等のテクスチャUV、つまり表面法線に平行なベクトルを表します。
つまり、技術的に言えば、正規直交基底を形成するため、正規直交=クロス(接線、法線)ですが、実際には、法線と接線は法線マップのUVから生成され、いくつかの頂点で平均化される可能性があるため、厳密には正規直交ではない可能性があります。
このテーマに関するいくつかの優れた記事については、 http://www.3dkingdoms.com/weekly/weekly.php?a=37
および
http://www.blacksmith-studios.dk/projects/downloads/bumpmapping_using_cg.phpをお読みください。
実際、そうでない場合もあります。少なくとも 3D グラフィックでは。
テクスチャが引き伸ばされた場合、従法線が法線と接線の両方に対して垂直にならない可能性があります (ただし、垂直である必要があります)。
エクスポーターが計算したものをそのまま使用してください。エクスポータが接線と従法線の両方を提供する場合は、それで問題ありません。接線しかない場合は、従法線を接線と法線に対する垂線として計算します。
接線と従法線の両方が計算された複雑なオブジェクトを取得し、従法線が外積として計算されたときに得られるライティングで提供された従法線を使用した場合のライティングを比較します。違いがあります。
とにかく、適切な方法は、exporter で計算された接線と従法線の両方を取得し、exporter が提供したものを使用することだと思います。