Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

1

22.11.2012, 20:44

Tangent-Space -> Camera-/View-Space

Hallo zusammen,

ich habe diesmal eine Frage mathematischer Natur. Ich habe bisher meine Lichtberechnung im Tangent-Space vollzogen.
Dazu habe ich die nötigen Vektoren in den Tangent-Space gebracht.

Dies geht bekanntlich mit Hilfe der TBN Matrix:

HLSL-Quelltext

1
2
float3 binormal = cross(normal,tangent);
float3x3 tbnMat= float3x3(tangent, binormal, normal);


Anschließend berechne ich bspw. :

HLSL-Quelltext

1
lightDir = mul(tbnMat, lightDir);


Ich verwende CG (kein HLSL!), d.h. diese Funktion: http://http.developer.nvidia.com/Cg/mul.html
Ich könnte also auch schreiben:

HLSL-Quelltext

1
2
3
lightDir.x = dot(tangent, lightDir);
lightDir.y = dot(binormal, lightDir);
lightDir.z = dot(normal, lightDir);

Nur um das bis hierher festzuhalten: Ich multipliziere die Matrix mit einem Spaltenvektor von rechts.

Nun muss ich aber aus Gründen meine Lichtberechnung ändern. Dafür möchte ich dir Normale aus der Map in den View-/Camera-Space überführen. Bisher war ich der Meinung, dass ich dafür einfach die Inverse der Matrix bilden müsste.

Ich habe aber jetzt schon öfters folgendes gesehn:

HLSL-Quelltext

1
2
3
4
float3 binormal = cross(normal,tangent); // Seien "normal" und "tangent" bereits im View-Space
float3x3 tbnMat= float3x3(tangent, binormal, normal);

texNormal = normalize(mul(texNormal,tbnMat)); // ich könnte auch schreiben: texNormal = normalize(mul(transpose(tbnMat),texNormal));


Ich multipliziere nun also meine Textur-Normale als Zeilenvektor von links mit der Matrix, bzw. von rechts mit der transponierten Matrix.

Ist die transponierte Matrix indem Fall identisch mit der Inversen oder warum wählt man diesen Weg?

Freue mich über Erklärungen.

Gruß Mark

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

2

22.11.2012, 22:26

Die Tangent Space Matrix transformiert vom Tangent Space in den Space, in dem die Basisvektoren sich befinden. Wenn du aus dem Space, in dem die Basisvektoren sich befinden, in den Tangent Space willst, musst du durch die Inverse der Tangent Space Matrix gehen. Man geht nun eben genau von der Annahme aus, dass die Tangent Space Matrix orthogonal ist, was äquivalent dazu ist, dass ihre Inverse ihrer Transponierten entspricht.

Genau das passiert hier:

HLSL-Quelltext

1
2
3
float3 binormal = cross(normal,tangent);
float3x3 tbnMat= float3x3(tangent, binormal, normal);
lightDir = mul(tbnMat, lightDir);

Das mul(tbnMat, lightDir) entspricht einer Multiplikation mit der Transponierten, da die Tangent Space Matrix mit den Basisvektoren in ihren Zeilen konstruiert wurde. Um einen Vektor v aus dem Tangent Space in den Space der Basisvektoren zu transformieren, machst du einfach nur mul(v, tbnMat).

Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von »dot« (22.11.2012, 22:35)


David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

3

22.11.2012, 23:45

Man geht nun eben genau von der Annahme aus, dass die Tangent Space Matrix orthogonal ist, was äquivalent dazu ist, dass ihre Inverse ihrer Transponierten entspricht.


Genau, auch z.B. hier nachzulesen.
@D13_Dreinig

4

24.11.2012, 01:15

Vielen Dank für den Link und für deine Erklärung @dot. Hat mir sehr beim Verständnis geholfen :) .

Werbeanzeige