使用四元数增强QVM旋转

问题描述 投票:1回答:1

我正在尝试通过使用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),我不确定这是由于错误使用函数还是因为数学错误。我知道操作顺序很重要,而且我还是四元数的新手,所以我不确定该怪什么。

我是否需要将四元数与另一个四元数而不是矢量相乘,如果是这样,该怎么做呢?

我非常感谢您提供的帮助或示例。

c++ boost quaternions
1个回答
0
投票

奇怪的是,如果您删除四元数共轭的乘法运算,它将返回预期的结果。

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}};

是内部共轭乘法的提升吗?

© www.soinside.com 2019 - 2024. All rights reserved.