Eigen 库中的 Transform::linear() return 是什么?

What does Transform::linear() return in the Eigen library?

使用 Eigen C++ 库时,我无法理解 Transform::linear() 函数。根据文档,它 returns the linear part of the transformation。但是,这是什么意思?肯定所有的矩阵变换都是线性的吧?

此外,从其他地方看到的一些示例来看,它的值 returns 似乎是一个 Eigen::Matrix3d (或者可以隐式转换为 this)。对我来说,这表明它可能只返回转换的旋转部分,长度为 3(x、y 和 z)。但是,还有一个 Transform::rotation() 函数,根据文档 returns the rotation part of the transformation.

有人可以向我解释一下 Transform::linear() 实际上 returns 是什么吗?

class Transform 表示使用齐次微积分的仿射变换或射影变换。例如,仿射变换 A 由线性部分 L 和平移 t 组成,因此通过 A 变换点 p 等同于:

 p' = L * p + t

使用齐次向量:

 [p'] = [L t] * [p] = A * [p]
 [1 ]   [0 1]   [1]       [1]

与:

 A = [L t]
     [0 1]

所以线性部分对应于齐次矩阵表示的左上角。它对应于旋转、缩放和剪切的混合。

遇到同样的问题,补充一下:

正如@ggael 所解释的那样,Transform::linear() 直接 return 变换矩阵中的线性部分。

Transform::rotation() returns 线性部分中的旋转分量。但由于线性部分包含not only rotation but also reflection, shear and scaling,因此提取旋转并不直接,需要使用奇异值分解(SVD)进行计算。

在已知 仿射矩阵仅包含旋转和平移的常见情况下 然后 Transform::linear() 可用于有效访问旋转部分。

最后,如果将 TransformMode 模板参数设置为 Isometry,Eigen 将只假设旋转和平移,并优化逆变换的计算。最新版本的 Eigen 也会在这种情况下优化 Transform::rotation(),并直接 return 线性部分。但是请注意,没有等距仿射矩阵的紧凑版本,其中最后一行未存储并假定为 [0 ... 0 1].