混合矩陣約定時出現的問題
行向量、列向量、行主和座標系
該部落格上撰寫的文章是出於教學目的而創建的。 另外,文章中的資訊可能不正確,請謹慎。
有時矩陣碼移動了,但物件卻向相反方向旋轉,或移動變得奇怪。 當行向量、列向量、儲存順序和座標系約定混合時,通常會發生這種情況。
行向量和列向量
行向量約定
v' = vM
列向量約定
v' = Mv
即使是相同的變換,矩陣形狀和組合順序也會根據向量在哪一側相乘而有所不同。
行優先與乘法規則不同。
行優先和列優先是指行或列在記憶體中是否連續儲存。 使用行向量和使用行優先儲存並不意味著同一件事。
遊行
[ a b ]
[ c d ]
行主記憶體:a b c d
列主記憶體:a c b d
轉置矩陣
轉置交換行和列。
[ a b c ]T [ a d ]
[ d e f ] = [ b e ]
[ c f ]
如果CPU庫和Shader的預期佈局不同,上傳前可能會調換位置。 但如果在不知道原因的情況下無條件插入Transpose,與其他程式碼結合時又會反過來。
也要檢查座標系
左手和右手座標系影響 Z 軸方向、旋轉方向和投影矩陣。 DirectX 函數名稱LH, RH代表了這種差異。
當遇到矩陣錯誤時,最好先寫下以下內容,而不是只看數字。
向量是行還是列?
乘法往哪個方向進行?
記憶體存儲是行優先嗎?
座標係是LH還是RH?
在著色器中轉置?
每條規則並不難。 問題是在沒有解釋的情況下混合來自不同協議的程式碼。