我正在向Eigen移植一个程序。
现在我必须重写一个方法,将三维变换矩阵从一个坐标系A(由其原点和两个轴定义)返回到第二个坐标系,仍然由原点和两个轴定义。
我想知道在Eigen中是否有找到该矩阵的方法。我浏览了参考指南,但我还没有找到任何有用的方法...
更多细节:
我移植到Eigen的方法接受6个点(向量)(fr0,fr1,fr2,to0,to1,to2)。 “fr0”是CS1(坐标系1)的原点,“fr1”是定义CS1的轴的点,“fr2”是定义CS1的第二轴的点; “to0”是CS2的起源,依此类推......
答案 0 :(得分:4)
不需要特殊功能,只需使用逗号初始化程序:
Matrix4f M;
M << X, Y, X.cross(Y), O,
0, 0, 0, 1;
这假设两个轴X和Y是单一的和正交的。 O是起源。
您还可以查看几何module以获得更高级的空间转换类和函数,例如Transform&lt;&gt;类。以下是使用Affine3f typedef而不是原始矩阵的相同示例:
Affine3f M;
M.linear() << X, Y, X.cross(Y);
M.translation(O);
答案 1 :(得分:4)
好的,我找到了解决方案,我在这里发布以供参考。我希望它对其他人也有用。
实际上ggael的回答引发了正确的解决方案,所以非常感谢他和+1给他。
#include <Eigen/Geometry>
typedef Eigen::Affine3d Transformation;
typedef Eigen::Vector3d Point;
typedef Eigen::Vector3d Vector;
typedef Eigen::Translation<double,3> Translation;
Transformation findTransformBetween2CS(Point fr0,Point fr1,Point fr2,Point to0,Point to1,Point to2) {
Transformation T, T2, T3 = Transformation::Identity();
Vector3d x1,y1,z1, x2,y2,z2;
// Axes of the coordinate system "fr"
x1 = (fr1 - fr0).normalized(); // the versor (unitary vector) of the (fr1-fr0) axis vector
y1 = (fr2 - fr0).normalized();
// Axes of the coordinate system "to"
x2 = (to1 - to0).normalized();
y2 = (to2 - to0).normalized();
// transform from CS1 to CS2
// Note: if fr0==(0,0,0) --> CS1==CS2 --> T2=Identity
T2.linear() << x1, y1, x1.cross(y1);
// transform from CS1 to CS3
T3.linear() << x2, y2, x2.cross(y2);
// T = transform to CS2 to CS3
// Note: if CS1==CS2 --> T = T3
T.linear() = T3.linear() * T2.linear().inverse();
T.translation() = t0;
return T;
}
灵感也来自这篇文章: