Eigen::Quaternion FromTwoVectors() 不是 return 有效的四元数

Eigen::Quaternion FromTwoVectors() does not return a valid quaternion

我有两个 3D 向量 space,我正在尝试使用 Eigen::Quaternion FromTwoVectors() 的函数来计算它们之间的旋转。尽管这个问题没有唯一的解决方案,但我得到了一个几乎有 4 个零值的四元数(可能只是数值错误),例如:6.95251e-310, 6.90758e-310, 9.88131e-324, 6.90758e-310。这当然不是一个有效的四元数。

Eigen::Vector3d normal1;
Eigen::Vector3d normal2;
Eigen::Quaterniond quat;
quat.FromTwoVectors(normal1, normal2);
std::cout << quat.x() << quat.y() << quat.z() << quat.w() << std::endl;

使用相同的向量计算 AngleAxis 然后转换为四元数给出有效值:

Eigen::Vector3d axis = normal1.cross(normal2);
axis.normalize()
double angle = acos(normal1.dot(normal2));
Eigen::AngleAxisd aa(angle,axis);
Eigen::Quaterniond quat(aa);
std::cout << quat.x() << quat.y() << quat.z() << quat.w() << std::endl;

0.000407447, 0.00621866, 0.0035146, 0.999974

这里出了什么问题?

请参阅 FromTwoVectors https://eigen.tuxfamily.org/dox/classEigen_1_1Quaternion.html#title13

的文档

FromTwoVectors 似乎是一个静态方法。因此,您需要查看 return 值。如果您尝试 Eigen::Quaterniond out = Eigen::Quaterniond::FromTwoVectors(normal1, normal2).

,您应该会得到正确答案