MaxScript中Matrix3的scalerotationpart究竟是什么?
关于MaxScript中Matrix3的scalerotationpart属性的解惑
嘿,这个问题问到点子上了——毕竟咱都清楚四元数只能编码纯旋转,那Matrix3里这个带“scale”字样的scalerotationpart属性,咋看都有点矛盾对吧?其实它的名字确实有点误导人,本质上它还是个纯旋转四元数,和半毛钱缩放都没关系!
核心逻辑:从缩放+旋转的组合矩阵里提取纯旋转
Matrix3的左上角3x3子矩阵,是用来存储线性变换(旋转+缩放+可能的切变)的部分。scalerotationpart做的事情,就是对这个3x3矩阵做极分解(直白点说:把每一列向量归一化,消除缩放的影响),得到一个正交的纯旋转矩阵,再把这个矩阵转换成四元数——这就是它的真实身份。
举个简单的代码例子帮你理解:
-- 构造一个带缩放+旋转的矩阵 scale_mat = scaleMatrix [2, 1, 1] -- X轴放大2倍 rot_mat = rotateMatrix (eulerAngles 0 90 0) -- Y轴转90度 combined_mat = rot_mat * scale_mat -- 先缩放再旋转 -- 查看两个旋转属性 print combined_mat.rotationpart -- 输出原始的旋转四元数(对应Y轴90度) print combined_mat.scalerotationpart -- 输出从3x3矩阵分解出的纯旋转四元数,和上面结果一致
和rotationpart的区别
可能你会问,那它和rotationpart有啥不一样?
rotationpart是矩阵构建时的原始旋转参数,只有当矩阵是标准的TRS(平移→旋转→缩放)结构时,它才是准确的纯旋转值;如果矩阵是其他变换组合(比如先缩放后旋转、带切变),rotationpart可能和实际线性变换里的旋转不匹配。scalerotationpart是从当前矩阵的实际3x3线性变换部分实时分解出来的纯旋转,不管矩阵是怎么构造的,它都能准确提取出其中的旋转分量,完全不受缩放、切变的干扰。
名字为啥带scale?
这纯粹是命名的锅——它的名字里的“scalerotation”指的是它来源的那个3x3子矩阵是缩放+旋转的组合,但这个属性本身只提取了组合里的旋转部分,完全不包含缩放信息,确实容易让人误解。
内容的提问来源于stack exchange,提问作者matthias_buehlmann
相关产品推荐
相关产品推荐

