我正在尝试通过使用boost的qvm库(尤其是四元数来旋转点)。尽管有很多文档here,但我找不到任何实际代码的有效示例。我目前正试图将点(1、0、0)绕y轴旋转90度,这会导致点(0,0,-1)。下面是我当前的工作示例:
const auto axis = boost::qvm::vec<double, 3>{{ 0.0, 1.0, 0.0}};
auto rotationAngle = (3.14159/2.0);
const boost::qvm::quat<double> q = boost::qvm::rot_quat(axis, rotationAngle);
const boost::qvm::vec<double, 3> rotateVec = q * (boost::qvm::conjugate(q) * boost::qvm::vec<double, 3>{{1.0, 0.0, 0.0}});
std::array<double, 3> rotatePos = {{boost::qvm::X(rotateVec), boost::qvm::Y(rotateVec), boost::qvm::Z(rotateVec)}};
std::array<double, 3> result = {{ 0.0, 0.0, -1.0 }};
EXPECT_EQ(result, rotatePos);
这里,我为四元数设置旋转轴和旋转角度,然后将矢量(1、0、0)乘以四元数的共轭数,再乘以四元数本身。然后,我获得新向量的xyz点,并将其与预期输出进行比较。
我得到的当前输出是(1、0、0)而不是(0、0,-1),我不确定这是由于错误使用函数还是因为数学错误。我知道操作顺序很重要,而且我还是四元数的新手,所以我不确定该怪什么。
我是否需要将四元数与另一个四元数而不是矢量相乘,如果是这样,该怎么做呢?
我非常感谢您提供的帮助或示例。
奇怪的是,如果您删除四元数共轭的乘法运算,它将返回预期的结果。
const boost::qvm::vec<double, 3> rotateVec = q * (boost::qvm::conjugate(q) * boost::qvm::vec<double, 3>{{1.0, 0.0, 0.0}});
更改为
const boost::qvm::vec<double, 3> rotateVec = q * boost::qvm::vec<double, 3>{{1.0, 0.0, 0.0}};
是内部共轭乘法的提升吗?