我正在开发一个应用程序,它从 3D Slicer 读取 3x3 旋转矩阵,并通过乘以“神奇”向量 (0,0,1) 来计算方向向量。选择这个神奇向量是因为切片器中的初始非旋转向量直接向下。它有效,我可以在我的应用程序中显示向量。
现在我想做相反的事情。我想让用户旋转向量,然后输出一个可以由 Slicer 导入的 3x3 旋转矩阵。
我看过:
https://eigen.tuxfamily.org/dox/group__TutorialLinearAlgebra.html
给定 A 和 b,他们对 x 求解 Ax=b。给定 x 和 b 是否可以求解 A?在这种情况下,x 将是我的“魔法”向量 (0,0,1),b 将是我的对象的方向向量。
我认为可以使用欧拉角获得旋转矩阵,但这似乎令人困惑。
如果我理解正确的话,你想要的大致是这样的:
Quaternion::FromTwoVectors
为此返回一个四元数,表示两个任意向量 a 和 b 之间的旋转。换句话说,构建的旋转表示将a方向的线发送到b方向的线的旋转,两条线都经过原点
#include <Eigen/Geometry>
Eigen::Vector3d magic = Eigen::Vector3d::UnitZ();
Eigen::Vector3d direction {1., 2., 3.};
Eigen::Matrix3d rotation =
Eigen::Quaterniond::FromTwoVectors(magic, direction).toRotationMatrix();