在Eigen的Transform类的文档中,有两个具有几乎相同签名的成员函数:
void computeRotationScaling(RotationMatrixType*, ScalingMatrixType*) const
void computeScalingRotation(ScalingMatrixType*, RotationMatrixType*) const
两个函数都有相同的文档(两个函数的乘法顺序都是rotation * scaling
)。
将变换的线性部分分解为乘积旋转x缩放,缩放不一定是正的。
如果任意一个指针为零,则跳过相应的计算。
这在SVD模块中定义。
它们之间的区别是什么?
区别在于顺序。如果你仔细看,区别是:
// computeRotationScaling
if(scaling) scaling->lazyAssign(svd.matrixV() * sv.asDiagonal() * svd.matrixV().adjoint());
// computeScalingRotation
if(scaling) scaling->lazyAssign(svd.matrixU() * sv.asDiagonal() * svd.matrixU().adjoint());
// ^ ^