2017-09-19 4 views
2

Nehmen wir an, Sie haben ein 3D-Mesh mit normaler Karte zur Verfügung gestellt. Das Mesh besitzt sowohl Tangenten, Bitangents und Normalen.Normal Mapping und behalten Sie die Tangenten

Aus den Tangenten, Bitangens und Normalen können Sie die TBN-Matrix erstellen, die eine Matrix ist, die den Tangentialraum in den Welt- raum transformiert. Auf diese Weise zu bekommen die echte normalen Sie einfach so etwas zu tun haben:

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

Doch wie die echte Tangente und bitangent von diesem System zu bekommen?

+2

[Gramm-Schmidt Orthonormierung] (https://en.wikipedia.org/wiki/Gram%E2%80%93Schmidt_process) 't = normalisieren (tangential - realNormal * Punkt (tangential, realNormal));' – Rabbid76

+0

dass war offensichtlich ... danke –

Antwort

2

Sie müssen Orthogonalize die Vektoren. Ein üblicher Weg für die Orthogonalization ist die Gram–Schmidt Orthonormalization.

Dieser Algorithmus verwendet den Umstand, daß das Punkt Produkt von 2 Vektoren ist gleich der Kosinus des Winkels zwischen den Vektoren 2 durch die Größe (Länge) der beiden Vektoren multipliziert.

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

Dies ergibt sich, dass der Punkt Produkt von 2 Einheitsvektoren (normierte Vektoren), die gleich 1 ist Cosinus des Winkels zwischen den Vektoren 2, da die Länge eines Einheitsvektors gleich

uN = normalize(A) 
uT = normalize(B) 
cos(angle_T_N) == dot(uT, uN) 

enter image description here

Wenn realNormal ein normalisierter Vektor (seine Länge 1) und tangent und binormal orthogonal sind, dann ist die realTangent und die die realBinormal kann wie folgt berechnet werden:

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

Wenn tangent und binormal normalisierten Vektoren sind auch dann die normalize Funktion durch Division mit dem Skalarprodukt des Quellenvektors ersetzt werden kann und die echte Vektor:

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); 

sehen Sie weitere How to calculate Tangent and Binormal?.

+0

Sie müssen das Binormal auch nicht auf dem RealTangent projizieren? Denn im Graham-Schmidt-Prozess müssen Sie (n - 1) mal für den n-ten Vektor –

+0

@AntoineMorrier Guter Punkt projizieren. Ich habe die Antwort erweitert. – Rabbid76

+0

Eine letzte Frage, ist es das gleiche, wenn ich das Bi-Normal VOR der Tangente berechnen, oder ist es nicht das Gleiche? –

Verwandte Themen