Probleme, die beim Mischen von Matrixkonventionen auftreten
Zeilenvektor, Spaltenvektor, Zeilenhaupt- und Koordinatensystem
Die in diesem Blog verfassten Artikel wurden mit dem Ziel erstellt, zu unterrichten. Außerdem können die Informationen im Artikel falsch sein, also seien Sie bitte vorsichtig.
Es gibt Fälle, in denen der Matrixcode bewegt wird, sich das Objekt jedoch in die entgegengesetzte Richtung dreht oder die Bewegung seltsam wird. Dies tritt normalerweise auf, wenn Zeilenvektor-, Spaltenvektor-, Speicherreihenfolge- und Koordinatensystemkonventionen gemischt werden.
Zeilen- und Spaltenvektoren
Zeilenvektorkonvention
v' = vM
Spaltenvektorkonvention
v' = Mv
Auch wenn es sich um dieselbe Transformation handelt, variieren die Matrixform und die Kombinationsreihenfolge je nachdem, auf welcher Seite der Vektor multipliziert wird.
Row-Major unterscheidet sich von der Multiplikationsregel.
Row-Major und Column-Major beziehen sich darauf, ob Zeilen oder Spalten nacheinander im Speicher gespeichert werden. Die Verwendung von Zeilenvektoren und die Verwendung von Row-Major-Speicher bedeuten nicht dasselbe.
Prozession
[ a b ]
[ c d ]
Zeilenhauptspeicher: a b c d
Spaltenhauptspeicher: a c b d
transponierte Matrix
Transponieren vertauscht Zeilen und Spalten.
[ a b c ]T [ a d ]
[ d e f ] = [ b e ]
[ c f ]
Wenn das erwartete Layout der CPU-Bibliothek und des Shaders unterschiedlich sind, können sie vor dem Hochladen transponiert werden. Wenn Sie Transpose jedoch bedingungslos einfügen, ohne den Grund zu kennen, wird es bei der Kombination mit anderem Code wieder rückgängig gemacht.
Überprüfen Sie auch das Koordinatensystem
Linkshändige und rechtshändige Koordinatensysteme wirken sich auf die Richtung der Z-Achse, die Drehrichtung und die Projektionsmatrix aus. DirectX-FunktionsnameLH, RHstellt diesen Unterschied dar.
Wenn Sie auf einen Matrixfehler stoßen, ist es besser, zuerst Folgendes aufzuschreiben, als nur auf die Zahlen zu schauen.
Sind Vektoren Zeilen oder Spalten?
In welche Richtung geht die Multiplikation?
Ist der Speicher Row-Major?
Ist das Koordinatensystem LH oder RH?
Im Shader transponieren?
Jede der Regeln ist nicht schwierig. Das Problem besteht darin, Code aus verschiedenen Protokollen ohne Erklärung zu vermischen.