Foolish_Genius
30-10-2004, 02:03
ich habe bsp 3a im prinzip fertig programmiert, nocheinmal die Angabeseite durchgelesen und ganz unten auf folgendes bezüglich Normalvektorberechnung bei nicht uniformen Skalierungen gestoßen:
-------------------------------------
...Die Transformationen von Normalvektoren ist allerdings im Fall von nicht uniformen Skalierungen nicht trivial, deshalb hier die richtige Erklärung:
Normalvektoren dürfen nicht mit der Transformationsmatrix multipliziert werden, sondern müssen mit ihrer transponierten Inversen multipliziert werden. Wenn also M die aktuelle Transformationsmatrix ist, dann ist (' steht für transponieren, _inv für die Inverse)
n_neu = (M_inv' * n)
Da in der Angabe aber sowieso eine eigene Matrix verwendet wird, um die Normalvektoren zu transformieren, und diese auch bei jeder Transformation aktualisiert wird, läßt sich das Problem leicht lösen:
In "CG1Object::scale(x,y,z)" muß transformNormalsMatrix einfach mit der inversen Skalierung multipliziert werden, also "modelMatrixVector.scale(1/x, 1/y, 1/z);", während die Punkt-Transformationsmatrix wie gewohnt mit der eigentlichen Skalierung transformiert wird ("modelMatrixPoint.scale(x,y,z);"). Bei den Viewing Matrizen in CG1Camera muß das nicht berücksichtigt werden, da wir hier ja keine Skalierung verwenden.
-----------------------------------------------
Meiner Meinung nach sind die Code-Angaben in dieser Erklärung falsch; modelMatrixVector.scale(1/x, 1/y, 1/z); wird bei unserem System nicht funktionieren...
Aber verstehe ich das richtig, dass ich im Fall einer nicht uniformen Skalierung die Skalierungsmatrix mit den Werten 1/x, 1/y, 1/z erstellen muss?
Also im prinzip:
modelMatrixVector.multLeft (new CG1Matrix3x3().setScale(1/sx, 1/sy, 1/sz)); (Ich hoffe ich bekomme keine Probleme wegen dieser einen Code-Zeile. die steht praktisch so bei den Tips auf der Website ;) )
Wäre dankbar wenn mir das jemand bestätigen könnte.... :D
-------------------------------------
...Die Transformationen von Normalvektoren ist allerdings im Fall von nicht uniformen Skalierungen nicht trivial, deshalb hier die richtige Erklärung:
Normalvektoren dürfen nicht mit der Transformationsmatrix multipliziert werden, sondern müssen mit ihrer transponierten Inversen multipliziert werden. Wenn also M die aktuelle Transformationsmatrix ist, dann ist (' steht für transponieren, _inv für die Inverse)
n_neu = (M_inv' * n)
Da in der Angabe aber sowieso eine eigene Matrix verwendet wird, um die Normalvektoren zu transformieren, und diese auch bei jeder Transformation aktualisiert wird, läßt sich das Problem leicht lösen:
In "CG1Object::scale(x,y,z)" muß transformNormalsMatrix einfach mit der inversen Skalierung multipliziert werden, also "modelMatrixVector.scale(1/x, 1/y, 1/z);", während die Punkt-Transformationsmatrix wie gewohnt mit der eigentlichen Skalierung transformiert wird ("modelMatrixPoint.scale(x,y,z);"). Bei den Viewing Matrizen in CG1Camera muß das nicht berücksichtigt werden, da wir hier ja keine Skalierung verwenden.
-----------------------------------------------
Meiner Meinung nach sind die Code-Angaben in dieser Erklärung falsch; modelMatrixVector.scale(1/x, 1/y, 1/z); wird bei unserem System nicht funktionieren...
Aber verstehe ich das richtig, dass ich im Fall einer nicht uniformen Skalierung die Skalierungsmatrix mit den Werten 1/x, 1/y, 1/z erstellen muss?
Also im prinzip:
modelMatrixVector.multLeft (new CG1Matrix3x3().setScale(1/sx, 1/sy, 1/sz)); (Ich hoffe ich bekomme keine Probleme wegen dieser einen Code-Zeile. die steht praktisch so bei den Tips auf der Website ;) )
Wäre dankbar wenn mir das jemand bestätigen könnte.... :D