TBN Matrix

Aus DGL Wiki
Version vom 21. September 2006, 14:03 Uhr von Flash (Diskussion | Beiträge) (Wie kann die TBN Matrix berechnet werden)

Wechseln zu: Navigation, Suche
Hinweis: Dieser Artikel wird gerade Offline bearbeitet!

Bitte haben Sie etwas Geduld und nehmen Sie keine Änderungen vor, bis der Artikel hochgeladen wurde.

(weitere Artikel)
WIP Offline.jpg


Warnung: Alles noch nicht überprüft

Was ist die TBN Matrix

Die TBN Matrix ist nach ihren Komponenten benannt, den Vektoren Normal, Bitangent (auch Binormal) und Tangent. Sie ist in der Lage Vektoren aus dem Worldspace in den Texturspace zu transformieren. Sie wird für alle Formen des Bumpmapping im Pixelshader benötigt um die Normal und Höhenmaps vom Texturespace in den Worldspace zu transformieren. In den meisten flällen tritt sie in normalisierter Form auf und entspricht einer reinen Drehmatrix.

Wie kann die TBN Matrix berechnet werden

Da die einzigsten Erklärungen, die mir bis jetzt bekannt sind auch Englisch sind und dazu mit sehr unverständlichen Formeln gewürzt sind, die auch noch unausprechliche Zeichen enthalten, versuch ich das ganze mal so zu beschreiben, dass es auch von normalen Programieren verstanden wird.

triangle im texturspace.png

Bekannt sind zum Berechnen der TBN Matrix nur die Textur und Weltkoordinaten des Dreiecks ABC, welches oben abgebildet ist. Die beiden blauen Vektoren, die auf das graue Kreutz gezeichnet sind spannen zusammen mit der grauen gestrichelten Linie die Textur auf. Der Horizontale Vektor repäsentiert Zugleich die U Achse der Textur, als auch den Tangentvektor. Der Vertikale entspricht der V Achse und Bitangent. Im Texturspace sieht es jetzt sehr leicht aus, das Problem ist jedoch, dass wir die TBN Matrix aus der Sicht des Worldspaces beschreiben müssen. Die einzigen Punkte, die wir aus dem Worldspace kennen sind jedoch nur AB und C.

Die Berechnung von Tangent und Bitangent ist fast gleich da nur andere Komponeten eingesetz werden müssen. Erst einmal nur Tangent:

Da unsere Vektoren 5 Komponenten haben xyzuv, werden einzelne komponenten durch u oder v makiert. Für die TBN Matrix an sich brauchen nur xyz berechnet werden.

Der Tangend entspricht dem Vektor (F-A), Da wir ih nicht direkt kennen müssen wir erst (E-A) berechnen. Um den Punkt E zu bekommen muss der Vektor (C-B) so weit verlänger werden, das er (E-B) ergibt. Um diesen Verlängerungsfakor zu Berechnen müssen wir die V Komonenten der Texturkoordinaten zu hilfe nehmen:

Da Av = Dv ist, muss (D-C)*(Cv-Bv) = (B-C)*(Cv-Av) sein. Das lösen wir Nach D auf:

D = C + (B-C)*((Cv-Av)/(Cv-Bv))

Da der Vektor (D-A) kleiner als 1.0 (im Texturspace!!!) ist. Müssen wir ihn noch durch Teilen von (Du-Au) auf die Richtige Länge bringen:

D = C + (B-C)*((Cv-Av)/(Cv-Bv))

Tangent = (D-A)/(Du-Au)

Bitantent lässt sich berechnen, in dem B;C, D;E, F;G und u;v getauscht werden:

E = B + (C-B)*((Bu-Au)/(Bu-Cu))

Bitangent = (E-A)/(Ev-Av)

Alternativ lässt sich für normalisierte TBN Matrizen folgendes schreiben:

Tangent = normalize(C - A + (B-C)*((Cv-Av)/(Cv-Bv)))

Bitangent = normalize(B - A + (C-B)*((Bu-Au)/Bu-Cu)))

Dabei sollte beachtet werden, das die Längenberechnung nicht so schnell ist wie die alternative Subtraktion.

Es könnte sein, dass (C-B) Parallel zu Tangent oder Bitangent ausgerichtet ist, die Division durch 0 sollte man umbedingt abfangen.

Die am einfachsten zu berechnende Komponente ist der Normalvektor, er ist quasi unabhängig von den Texturkoordinaten. Es gibt zwei Möglichkeiten ihn zu berechnen. Entweder das Kreutzprodukt der Verktoren (C-A)x(B-A) oder das Kreutzprodukt von Tangent x Bitangent.

Interpolation

Wie auch Normalverktoren, können auch die TBN Matrizen nur pro Triangle berechnet werden. Um runde Oberflächen zu erhalten, kann es sinvoll sein, die TBN Matrizen am gemitteltem Normalvektor auszurichten. Die die Ausrichtung von Tangent und Bitangent von den Texturkoordinaten abhängt, ist es nicht möglich, sie wie den Normalvektor zu interpolieren.

Um die TBN Matrizen zu drehen, sollte die Drehachse mit des Kreutzproduktes des nicht Interpoliertem Normalvektors und des Interpolierten Normalvektors gebildet werden. Den Winkel kann man über das Skalarprodukt berechnen. Abschließend müssen Tangent und Bitangent nur noch um die Drehachse mit dem erechnetem Winkel rotiert werden. Für Solid (nicht oth) gekennzeichnete Flächen kann dieser Schritt komplett entfallen.

Bitangent/Binormal

Es genügt Tangent oder Bitangent im Model zu speichern. Bitangent lässt sich auch nach durchgeführten Transformationen per Kreutzprodukt wiederherstellen. Im Vertexshader sollten zunächst Normal und Tangent mit der Normalmatrix rotiert werden (je 3 Skalarprodukte) und erst dann mit einem Kreutzprodukt ein passender Bitangentvektor berechnet werden. Das Kreutprodukt sollte sich schneller berechenen lassen als die 3 Skalarprodukte einer Vektor/Matrixmultiplikation. Zusätzlich wird eine Komponente bei den Atributen gespart.