变换矩阵乘法顺序


21

我在尝试找出最终变换矩阵的正确乘法顺序时遇到了困难。我总是会感到奇怪的动作或扭曲的几何形状。我当前的模型解释如下:

对于单个节点,我的乘法顺序是:

L = S * R * T

哪里

L =局部变换矩阵

S =局部比例矩阵

R =局部旋转矩阵

T =本地翻译矩阵

对于节点的世界转换:

宽=宽*长

哪里

W =世界变换矩阵

PW =父世界转换矩阵

L =上面计算的局部变换矩阵

渲染时,我为每个节点计算矩阵:

MV = Inv(C)*净重

哪里

MV =特定节点的模型视图转换矩阵

Inv(C)=逆相机变换矩阵

NW =上面计算的节点的世界转换矩阵。

最后,在着色器中,我进行了以下转换:

TVP = PRP * MV * VP

哪里

TVP =最终变形的顶点位置

PRP =透视矩阵

MV =上面计算的节点的世界转换矩阵

VP =未变换的顶点位置。

在当前模型中,具有局部旋转的子节点在转换相机时会奇怪地旋转。乘法顺序哪里出问题了?

Answers:


37

顺序的任何组合S*R*T都会给出有效的转换矩阵。但是,首先缩放对象,然后旋转它,然后平移它是很常见的:

L = T * R * S

如果您不按此顺序进行操作,则非均匀缩放将受到先前旋转的影响,使您的对象看起来偏斜。旋转将受到平移的影响,使对象的最终位置与平移的值所期望的完全不同。


您能再解释一下吗?根据我的习惯,旋转不受平移影响,因为它是两个框架之间的方向差异,与位置无关。相反,平移会受到之前发生的旋转的影响,因为它会在新定义的旋转轴上平移。在L = TRS中,平移首先发生,因此它不受旋转创建的新矢量的影响。
user-2147482637

4
造成混淆的原因是您正在谈论局部变换(框架仍与对象保持链接),而此处描述的变换发生在世界空间(其中只有一个固定参考框架,即世界)中。从概念上讲,您看到事物的方式是有效的,并且等效于以相反顺序应用转换。
sam hocevar 2015年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.