使用Eigen
C ++库,我无法理解Transform::linear()
函数。根据文档,它返回the linear part of the transformation
。但是,这是什么意思?当然所有的矩阵变换都是线性的?
此外,从其他地方看到一些例子,似乎它返回的值是Eigen::Matrix3d
(或者可以隐式转换为此值)。对我而言,这表明它可能只返回转换的旋转部分,其长度为3(x,y和z)。但是,还有一个Transform::rotation()
函数,根据文档返回the rotation part of the transformation
。
那么有人可以向我解释Transform::linear()
实际返回的内容吗?
答案 0 :(得分:1)
类Transform
表示使用同质微积分的仿射变换或投影变换。例如,仿射变换A
由线性部分L
和翻译t
组成,因此将p
转换为A
相当于:
p' = L * p + t
使用同源载体:
[p'] = [L t] * [p] = A * [p]
[1 ] [0 1] [1] [1]
使用:
A = [L t]
[0 1]
因此线性部分对应于同质矩阵表示的左上角。它对应于旋转,缩放和剪切的混合。
答案 1 :(得分:1)
遇到相同的问题,我想添加以下信息:
如@ggael所述,Transform::linear()
直接返回变换矩阵中的线性部分。
Transform::rotation()
返回线性部分的旋转分量 。但是由于线性部分包含not only rotation but also reflection, shear and scaling,因此提取旋转旋转并不是直接的,需要使用奇异值分解(SVD)进行计算。
在通常的情况下,已知仿射矩阵仅包含旋转和平移,那么Transform::linear()
可用于有效访问旋转部分。
最后,如果将Transform
的{{1}}模板参数设置为Mode
,则Eigen将仅假设旋转和平移,并优化逆变换的计算。在这种情况下,最新版本的Eigen还将优化Isometry
,并直接返回线性部分。但是请注意,没有等距仿射矩阵的紧凑版本,其中不存储最后一行并假定其为[0 ... 0 1]。