2D变换矩阵乘法顺序咨询:L=S×R×T是否正确?
首先明确:矩阵乘法的顺序完全取决于你使用的向量表示方式(列向量/行向量),以及你想要的变换应用逻辑——核心原则是矩阵乘法不满足交换律,顺序错了结果必然不符合预期。
两种常见场景的正确顺序
1. 列向量(主流图形API默认,如OpenGL、Unity)
当使用列向量时,变换通过矩阵左乘向量实现(即 变换后向量 = 矩阵 × 原始向量),运算顺序是从右到左。
如果要实现常规局部变换(先缩放自身 → 再旋转自身 → 最后平移到目标位置),对应的矩阵乘法顺序应为:
最终局部变换矩阵 = T × R × S
其中T=平移矩阵,R=旋转矩阵,S=缩放矩阵。
原因是:(T×R×S) × v = T × (R × (S × v)),实际执行顺序是先缩放向量v,再旋转缩放后的向量,最后平移旋转后的向量,这才是符合直觉的局部变换(缩放、旋转不会干扰平移的偏移量)。
2. 行向量(自定义实现或小众场景)
当使用行向量时,变换通过向量左乘矩阵实现(即 变换后向量 = 原始向量 × 矩阵),运算顺序是从左到右。
同样实现常规局部变换,对应的矩阵乘法顺序就是你提到的:
最终局部变换矩阵 = S × R × T
原因是:v × (S×R×T) = ((v × S) × R) × T,执行顺序是先缩放,再旋转,最后平移,和预期的局部变换逻辑完全匹配。
关于你的疑问
你给出的 L = S × R × T 顺序,仅在行向量场景下是正确的;如果是列向量场景,这个顺序会导致平移先被旋转、再被缩放,最终物体的平移偏移量会被缩放倍数放大,得到完全不符合预期的结果。
其他可能的顺序
如果你的变换逻辑不是常规的「缩放→旋转→平移」,比如需要先旋转再缩放(不推荐,会导致物体沿旋转后的轴缩放,形态扭曲),或者先平移再旋转(相当于绕原点旋转平移后的物体,属于全局变换而非局部变换),那么矩阵顺序也要对应调整:
- 列向量场景下:先平移再旋转 →
R × T - 行向量场景下:先平移再旋转 →
T × R
但绝大多数局部变换场景,都遵循「缩放→旋转→平移」的逻辑,对应的矩阵顺序根据向量类型选择即可。
内容的提问来源于stack exchange,提问作者Naveen Hedalla Arachchi

