Woher weiß ich, ob eine perspektivische Matrix ein rechts- oder linkshändiges Koordinatensystem ist?

7

Zum Beispiel, wenn ich meine Perspektivmatrix wie folgt definiere:

m[0]  = 1.f / ( aspect * focalLength );
m[5]  = 1.f / focalLength;
m[10] = -zFar / (zFar - zNear);
m[11] = -1;
m[14] = -(zFar*zNear)/(zFar - zNear);

Wie kann ich feststellen, ob meine Perspektivmatrix ein rechts- oder linkshändiges Koordinatensystem ist?

Athena
quelle

Antworten:

7

Ich denke, Sie können den Unterschied erkennen, ob Sie 1 oder -1 in der Z-Linie haben (oder in der Spalte, abhängig von der Matrixausrichtung). Bestimmtes:

  • Linkshänder: 1
  • Rechtshänder: -1

Einen Vergleich finden Sie unter diesen beiden Links - D3DXMatrixPerspectiveLH und D3DXMatrixPerspectiveRH . Da DirectX Linkshänder ist, verwenden Sie normalerweise die Linkshänder-Version mit einer 1 in der vierten Spalte der dritten Zeile.

Auf der anderen Seite sind OpenGL und XNA beide Rechtshänder, und ich kann bestätigen, dass die von ihnen generierten perspektivischen Matrizen stattdessen -1 verwenden, obwohl OpenGL es in der dritten Spalte der dritten Zeile hat, während XNA es wie DirectX in der vierten Spalte der vierten Zeile hat (Spaltenhauptmatrizen gegenüber Zeilenhauptmatrizen).

David Gouveia
quelle
4
Es ist eigentlich nicht richtig, eine der APIs als eine bestimmte Händigkeit zu beschreiben. Die Händigkeit, die gewöhnlich jedem zugeschrieben wird, ist heutzutage eher eine historische Konvention als alles andere, und jeder ist perfekt in der Lage, die andere Händigkeit zu unterstützen, wenn dies erforderlich / gewünscht ist. Einige OpenGL-Hinweise: opengl.org/resources/faq/technical/transformations.htm (9.150).
Maximus Minimus
@ mh01 Sicher, das Konvertieren zwischen rechts- und linkshändigen Koordinatensystemen kann so einfach sein wie das Anwenden einer (1,1, -1) Skalentransformation vor allem anderen. Es ist jedoch klüger, mit den Konventionen der einzelnen APIs zu spielen, als die Konvertierung selbst durchführen zu müssen.
David Gouveia
2
D3D spezifiziert explizit überhaupt keine Konvention und hat seit mindestens D3D8 sowohl -RH- als auch -LH-Versionen aller seiner Projektionsmatrixfunktionen. In Bezug auf RM vs CM - D3D verwendet CM tatsächlich intern und die Matrix muss transponiert werden, wenn sie an den Shader gesendet wird. D3D9 erledigt das automatisch für Sie. in 10 und 11 musst du es selbst machen. Wir sind uns jedoch einig, dass beim Befolgen von Beispielcode eher etablierte Konventionen verwendet werden, sodass es klarer wird, wenn Sie diese selbst befolgen.
Maximus Minimus