c – 四元组 – >欧拉角 – >旋转矩阵故障(GLM)

c – 四元组 – >欧拉角 – >旋转矩阵故障(GLM),第1张

概述我正在编写一个加载包含场景描述的文件的程序,然后使用OpenGL显示它.我正在使用GLM进行我所有的数学 *** 作.场景文件中的旋转以四元数格式存储.我的场景管理系统以欧式角度的形式对对象进行旋转,这些角度在绘制时可以转换为旋转矩阵. 我的加载过程因此采用四元数旋转,将其转换为欧拉角以存储在我的对象类中,然后将这些欧拉角转换为用于绘制的旋转矩阵.我使用glm :: eulerAngles和glm :: 我正在编写一个加载包含场景描述的文件的程序,然后使用OpenGL显示它.我正在使用GLM进行我所有的数学 *** 作.场景文件中的旋转以四元数格式存储.我的场景管理系统以欧式角度的形式对对象进行旋转,这些角度在绘制时可以转换为旋转矩阵.

我的加载过程因此采用四元数旋转,将其转换为欧拉角以存储在我的对象类中,然后将这些欧拉角转换为用于绘制的旋转矩阵.我使用glm :: eulerAngles和glm :: eulerAngleYXZ函数(分别)来执行这两个 *** 作.

但是,我得到的结果不正确.例如,如果我正确理解,四元数{0.500 -0.500 0.500 0.500}(即W X Y Z)应该描述从Z轴到Y轴的箭头旋转.然而,当我运行程序时,我会沿X轴指向箭头.

我会假设我对四元数的理解有一些缺陷,但是我可以通过跳过中间的欧拉角度来获得预期的结果.通过使用glm :: toMat4将四元数直接转换为旋转矩阵,我得到一个将Z箭头指向Y的旋转.

考虑到这两种方法似乎既简单又正确,我无法协调这两种不同的输出.为了简化我的问题,为什么这两个看似相同的方法产生不同的结果:

glm::quat q(.5,-.5,.5,.5);glm::vec3 euler = glm::eulerAngles(q) * 3.14159f / 180.f; // eulerAngleYXZ takes radians but eulerAngles returns degreesglm::mat4 transform1 = glm::eulerAngleYXZ(euler.y,euler.x,euler.z);// transform1 rotates a +Z arrow so that it points at +Xglm::quat q(.5,.5);glm::mat4 transform2 = glm::toMat4(q);// transform2 rotates a +Z arrow so that it points at +Y
解决方法 你现在可能已经弄清楚了…但是

什么eulerAngle序列功能:

glm::vec3 euler = glm::eulerAngles(q) * 3.14159f / 180.f;

返回?如果没有明确地返回“YXZ”序列,则无法正确使用下一个功能:

glm::mat4 transform1 = glm::eulerAngleYXZ(euler.y,euler.z);

您的变量“欧拉”必须与您指定的将其转换为旋转矩阵的函数相同的序列类型.

看到here后,它看起来像函数“glm :: eulerAngles”返回“XYZ”作为俯仰,偏航和滚动.因此,假设它们是“YXZ”,或偏航,俯仰,滚动不正确.

如前所述,欧拉角度和旋转矩阵,顺序重要!

总结

以上是内存溢出为你收集整理的c – 四元组 – >欧拉角 – >旋转矩阵故障(GLM)全部内容,希望文章能够帮你解决c – 四元组 – >欧拉角 – >旋转矩阵故障(GLM)所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/langs/1234339.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-06-06
下一篇2022-06-06

发表评论

登录后才能评论

评论列表(0条)

    保存