die inverse transponierte
angenommen wir haben eine (nicht unbedingt orthogonale) transformationsmatrix M.
der seitenvektor v eines dreiecks als differenz zweier dreieckspunkte kann mit der matrix M korrekt transformiert werden.
der normalvektor n des dreiecks jedoch nicht (stell dir vor die matrix würde z.b. entlang der y achse skalieren, der normalvektor steht dann nicht mehr wirklich normal).
wir wissen aber, dass das punktprodukt von seiten und normalvektor 0 sein muss. also n dot v = 0.
wir wollen nun eine matrix A finden, so dass gilt
(A*n) dot (M*v) = 0
betrachten wir die vektoren als 3x1 matrizen, so kann man das punktprodukt ja auch schreiben als (^ steht für transponiert)
n^ * v
damit gilt:
(A*n)^ * (M*v) = 0
das ist gleichbedeutend mit
n^ * A^ * M * v = 0
da n^ * v = 0, ist die gleichung erfüllt wenn A^ * M = I
und dies gilt eben genau dann, wenn A die inverse transponierte von M ist.
eine matrix gilt als orthogonal, wenn die inverse gleich der transponierten ist, und da jede rotationsmatrix orthogonal ist, kann man normalvektoren mit rotationsmatrizen immer direkt transformieren.
merke: ich hab oben verwendet was man oft als "operatorschreibweise" bezeichnet, also vektoren werden als 3x1 matrix dargestellt und mit einer matrix M transformiert indem man matrix * vektor rechnet.
das is die variante die z.b. opengl verwendet. directx machts umgekehrt.
dort sind vektoren 1x3 matrizen und man rechnet vektor * matrix.
ist eine frage von geschmack/konvention, ändert aber am ergebnis nichts:
n dot v = n * v^
(n*A) * (v*M)^ = 0
n * A * M^ * v^ = 0
...
ich hoffe ein wenig licht ins dunkel gebracht zu haben