行列規約を混ぜると起こる問題
行ベクトル、列ベクトル、Row-Majorと座標系
本ブログ作成文は、講義を目指して製作されました。 また、作成された文章の情報も間違っている可能性がありますので、ご注意ください。
行列コードを移動したところ、物体が反対方向に回転したり、移動が異常になる場合がある。 大部分はRow VectorとColumn Vector、保存順序、座標系規約を混ぜたときに発生する。
行ベクトルと列ベクトル
行ベクトル規約
v' = vM
列ベクトル規約
v' = Mv
同じ変換であっても、ベクトルをどちらに乗算するかによって、行列形状と結合順序が異なる。
Row-Majorは乗算規則とは別の言葉です
Row-MajorとColumn-Majorは、メモリに行と列のうちのどれを連続して格納するかについての言葉です。 行ベクトルを使用するという言葉とRow-Major保存を使用するという言葉は同じ意味ではありません。
行列
[ a b ]
[ c d ]
Row-Major メモリ: a b c d
Column-Major メモリ: a c b d
転置行列
Transposeは行と列を入れ替えます。
[ a b c ]T [ a d ]
[ d e f ] = [ b e ]
[ c f ]
CPUライブラリとShaderが期待する配置が異なると、Upload前に転置することもある。 しかし、理由がわからず、無条件にTransposeを入れると、他のコードと組み合わせると再び反転する。
座標系も確認する
Left-HandedとRight-Handedの座標系は、Z軸方向と回転方向、Projection行列に影響します。 DirectX関数名のLH, RHがこの違いを表します。
行列のバグに出会ったときに数字だけを見てはいけません。
ベクトルは行か列ですか?
乗算はどの方向ですか?
メモリの保存はRow-Majorですか?
座標系はLHかRHか?
ShaderでTransposeするか。
規約一つ一つは難しくない。 問題は、異なる規約のコードを説明せずに混ぜることです。