2017-09-19 5 views
2

ノーマルマップ付きの3Dメッシュがあるとします。メッシュは、接線、ビット線、法線も持っています。ノーマルマッピングと接線を維持する

接線、ビット線および法線から、接線空間をワールド空間に変換する行列であるTBN行列を作成できます。このシステムからリアル接線とbitangentを取得する方法を、しかし

mat3 TBN = mat3(tangent, bitangent, normal); 
vec3 realNormal = TBN * normalFromTheNormalMap; 

:通常本当あなたはちょうどそのような何かを持ってもらうためにそのように、?

+2

[グラムシュミットOrthonormalization](https://en.wikipedia.org/wiki/Gram%E2%80%93Schmidt_process) 't =正規化(正接 - 実数正規*ドット(タンジェント、実数正規)); ' – Rabbid76

+0

明らかだった...ありがとう –

答えて

2

あなたはベクターにOrthogonalizeする必要があります。 Orthogonalizationの一般的な方法はGram–Schmidt Orthonormalizationです。

このアルゴリズムは、2つのベクトルのドット製品は両方のベクトルの大きさ(な長さ)を乗じ2つのベクトル間の角度の余弦等しい状況を使用します。

dot(N, T) == length(N) * length(T) * cos(angle_N_T) 

これは単位ベクトルの長さが1

あるため、2つの単位ベクトル(正規化ベクトル)の ドット製品は、2つのベクトル間の角度の余弦 等しいことを、以下の
uN = normalize(A) 
uT = normalize(B) 
cos(angle_T_N) == dot(uT, uN) 

enter image description here

は、正規化ベクトルrealNormalである場合(その長さは1)とtangentbinormalは、次いでrealTangent直交しrealBinormalこのように計算することができる。tangentbinormalがあまりにも正規化ベクトルである場合

realTangent = normalize(tangent - realNormal * dot(tangent, realNormal)); 
realBinormal = binormal - realNormal * dot(binormal, realNormal); 
realBinormal = normalize(realBinormal - realTangent * dot(realBinormal, realTangent)); 

、次いでnormalize関数は、ソース・ベクトルのドット積で割ることによって置換することができますそして本当ベクトル:

realTangent = tangent - realNormal * dot(tangent, realNormal); 
realTangent /= dot(tangent, realTangent); 
realBinormal = binormal - realNormal * dot(binormal, realNormal); 
realBinormal = realBinormal - realTangent * dot(realBinormal, realTangent); 
realBinormal /= dot(binormal, realBinormal); 

はさらにHow to calculate Tangent and Binormal?を参照してください。

+0

あなたはrealTangentでもbinormalを投影する必要はありませんか?グラハムシュミットのプロセスでは、n番目のベクトルに(n-1)回投影する必要があります。 –

+0

@AntoineMorrier良い点。私は答えを広げた。 – Rabbid76

+0

最後の質問ですが、接線の前にbi法線を計算するか同じではないのですか? –

関連する問題