本文为入门笔记,详细请看大佬文章,写的非常具体。
关于矩阵的左乘右乘详情请看知乎大佬-Lpip Sam,和知乎大佬-小兔纸的大魔王很详细。
欧式变换也称为等距变换(Isometry Transform),可以看作是维持任意两点距离不变的仿射变换。
(
R
o
t
a
t
e
t
r
a
n
s
l
a
t
i
o
n
0
T
1
)
\left( \begin{matrix} Rotate &translation \\ 0^T & 1 \\ \end{matrix} \right)
(Rotate0Ttranslation1)
0.初始化
共两种方法,第一种使用较为频繁。
//设置旋转向量V
Eigen::AngleAxisd V(3.1415926 / 4, Eigen::Vector3d(1, 0, 1).normalized());
//设置平移向量
Eigen::Vector3d translation(1, 3, 4);
//将T初始化为单位阵,再做其他操作。
//虽然称为3D,实质上为4*4矩阵。
Eigen::Isometry3d T= Isometry3d::Identity();
1.两种求欧式变换矩阵
//设置欧式变换矩阵——方式1
//此种方式和下一种方式输出相同。
//a.translate(b)等价于aXb,描述的是在世界坐标系下的平移(虽然b在设置时为只含有3个元素列向量,猜想内部可能会有操作时其为下面这种形式)。
//形式为 0 0 0 1
// 0 0 0 3
// 0 0 0 4
// 0 0 0 0
//此操作相当于将translation中的数值放入欧式变换矩阵translation位置(注意!!!此种效果的前提T为单位矩阵)
//结果为 1 0 0 1
// 0 1 0 3
// 0 0 1 4
// 0 0 0 1
T.translate(translation);
//a.rotate(b)等价于aXb,描述的是在世界坐标系下的旋转。
T.rotate(V);
//结果为 0.853553 -0.5 0.146447 1
// 0.5 0.707 -0.5 3
// 0.146447 0.5 0.853553 4
// 0 0 0 1
//matrix()返回变换对应的矩阵,T输出时用此函数。
std::cout << T.matrix() << std::endl;
/*----------------------------------------------------------------------
------------------------------------------------------------------------*/
//设置欧式变换矩阵——方式2
//凡是前面带pre的函数,相当于右乘。
//a.rotate(b)等价于aXb,描述的是在世界坐标系下的旋转。
//结果为 0.853553 -0.5 0.146447 0
// 0.5 0.707 -0.5 0
// 0.146447 0.5 0.853553 0
// 0 0 0 1
T.rotate(V);
//我们的目的是为了形成文章开头欧式变换的矩阵,
//变换顺序必须是先平移,再旋转,也就是单位矩阵E X 平移矩阵T X 旋转矩阵R。
//按照R右乘T也就是T X R,实际和方式1相同T左乘R(T X R)这样理解就可以,
//但是根据查看源码,只有在mode==Projective时为右乘,否则为T+translation,
//然而translation为含有3个元素的列向量,这也印证了之前的猜想,有内部机制使translation转换成下面的形式
//形式为 0 0 0 1
// 0 0 0 3
// 0 0 0 4
// 0 0 0 0
T.pretranslate(translation);
//结果为 0.853553 -0.5 0.146447 1
// 0.5 0.707 -0.5 3
// 0.146447 0.5 0.853553 4
// 0 0 0 1
//matrix()返回变换对应的矩阵,T输出时用此函数。
std::cout << T.matrix() << std::endl;