混合矩阵约定时出现的问题
行向量、列向量、行主和坐标系
该博客上撰写的文章是出于教学目的而创建的。 另外,文章中的信息可能不正确,请谨慎。
有时矩阵码移动了,但对象却向相反方向旋转,或者移动变得奇怪。 当行向量、列向量、存储顺序和坐标系约定混合时,通常会发生这种情况。
行向量和列向量
行向量约定
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?
在着色器中转置?
每条规则并不难。 问题是在没有解释的情况下混合来自不同协议的代码。