小编ion*_*une的帖子

四元数 - >欧拉角 - >旋转矩阵故障(GLM)

我正在编写一个程序来加载包含场景描述的文件,然后使用OpenGL显示它.我正在使用GLM进行所有数学运算.场景文件中的旋转以四元数格式存储.我的场景管理系统以欧拉角的形式对物体进行旋转,然后在绘制时将这些角度转换为旋转矩阵.

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

但是,我的结果不正确.例如,如果我理解正确,四元数{0.500 -0.500 0.500 0.500}(即WXYZ)应该描述从+ 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 degrees
glm::mat4 transform1 = glm::eulerAngleYXZ(euler.y, euler.x, euler.z);
// transform1 rotates a +Z arrow so that it points at +X

glm::quat q(.5, -.5, .5, .5);
glm::mat4 transform2 = glm::toMat4(q);
// transform2 rotates a +Z arrow so that it points at +Y
Run Code Online (Sandbox Code Playgroud)

c++ math quaternions euler-angles glm-math

12
推荐指数
2
解决办法
1万
查看次数

标签 统计

c++ ×1

euler-angles ×1

glm-math ×1

math ×1

quaternions ×1