c++ 四元数澄清

Posted

技术标签:

【中文标题】c++ 四元数澄清【英文标题】:c++ quaternion clarification 【发布时间】:2014-09-01 13:13:23 【问题描述】:

我正在开发飞行模拟器。我读过一篇关于四元数的教程(这个:http://www.opengl-tutorial.org/intermediate-tutorials/tutorial-17-quaternions/),所以它对我来说很新。

据我了解,四元数应该使用方向向量旋转对象并使对象的方向与方向匹配,并且旋转四元数不应该移动向量,而只是让他自己转身。我是真的吗?

如果是,这是我的代码:

void Plane::Update()

    m_matrix = GLM_GTX_quaternion::toMat4( GLM_GTX_quaternion::angleAxis( radians( m_angle ), normalize( m_planeDirection ) ) );

当我的平面模型指向 x 向量时,我的平面将围绕 x 向量正确旋转,角度等于 0,但如果我更改角度,它将无法正确旋转。那么如何找到角度呢?

【问题讨论】:

【参考方案1】:

是的,你是对的 - 四元数围绕方向向量旋转对象。在使用四元数时,您还应该使用 glm::quat typedef。

#include <glm/gtc/quaternion.hpp>
//...
glm::mat4 m = glm::mat4_cast(glm::angleAxis(glm::radians(m_angle), glm::normalize(m_planeDirection)));

glm::rotate 函数也适用于四元数

glm::mat4 m = glm::mat4_cast(glm::rotate(glm::quat(), 45.0f, glm::vec3(1.0f)));

【讨论】:

但是,为什么 angleAxis( 0.0f, vec3( 0.0f, 0.0f, -1.0f ) ) 将我的平面定向到 x 向量? 到 x 轴* 我的意思是。 我想我很难理解你的问题是什么。但是您确实在这里说“四元数应该使用方向向量旋转对象并使对象的方向与方向匹配。因此,您可能正在寻找 LookAt 函数(这很有意义,因为您使用的是飞机),它在您链接的文章中进行了讨论。 在理解了我试图理解的东西之后,我的问题似乎很混乱。事实上,我误解了角度轴旋转,与这个问题(***.com/questions/12430311/…)相同,并试图用它来确定我的平面方向......这不是正确的工具。感谢您指出lookAt 函数,以及教程中的部分,我什至没有看到它们...

以上是关于c++ 四元数澄清的主要内容,如果未能解决你的问题,请参考以下文章

使用 cv::Mat 的高效 C++ 四元数乘法

C++ 四元数旋转未按预期工作

基于四元数的 3D 相机应该累积四元数还是欧拉角?

四元数和归一化

欧拉角到四元数然后四元数到欧拉角

怎么把向量转化为四元数或欧拉角