首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何从glm::quat和glm::mat4中提取偏航俯仰辊

如何从glm::quat和glm::mat4中提取偏航俯仰辊
EN

Stack Overflow用户
提问于 2020-02-21 20:05:31
回答 2查看 2.4K关注 0票数 0

是否可以从偏航音调信息中提取glm::mat4信息?(这是一个已应用平移、旋转和缩放的世界转换矩阵)

下面是我正在实验的一些代码:

代码语言:javascript
运行
复制
    float yawDeg = 0;
    float pitchDeg = 20;
    float rollDeg = 80;

    glm::mat4 transform = glm::eulerAngleYXZ(glm::radians(yawDeg), glm::radians(pitchDeg), glm::radians(rollDeg));

    glm::quat rotation(transform); // Is this a correct way?
 // glm::quat rotation(glm::quat_cast(transform)); // Gives the same results.

    printf("pitch: %f\n", glm::degrees(glm::pitch(rotation))); // Output:   3.616443
    printf("yaw:   %f\n", glm::degrees(glm::yaw(rotation)));   // Output: -19.683496
    printf("roll:  %f\n", glm::degrees(glm::roll(rotation)));  // Output:  79.372414

但我得到了一些奇怪的结果,以下是一些价值:

yawDeg=92, pitchDeg=0, rollDeg=0结果yaw: 88.0, pitch: 180.0, roll: 180.0

yawDeg=0, pitchDeg=92, rollDeg=0结果yaw: 0.0, pitch: 92.0, roll: 0.0 -看上去没问题。

yawDeg=0, pitchDeg=0, rollDeg=92结果yaw: 0.0, pitch: 0.0, roll: 92.0 -看上去没问题。

yawDeg=0, pitchDeg=10, rollDeg=92结果yaw: -9.993845, pitch: -0.352578, roll: 92.030830

我想也许我的glm::mat4glm::quat的转换是不正确的?

EN

回答 2

Stack Overflow用户

发布于 2020-12-25 13:23:46

我想补充一件事。GLM的偏航度实际上介于−90°~90°之间。这是因为GLM从正弦波中得到偏航角,而−90°~90°是通常可以得到的主值范围。

在这里,您可以看到GLM,https://github.com/g-truc/glm/blob/master/glm/gtc/quaternion.inl#L41的github中的代码片段

票数 1
EN

Stack Overflow用户

发布于 2020-02-27 14:41:29

我之所以得到这些意料之外的值,是因为在某些角度,GLM在内部应用它自己的角度。指:

输入 yawDeg=60, pitchDeg=0, rollDeg=0我们将得到yaw: 60.0, pitch: 0.0, roll: 0.0 -作为预期的

并用于:

输入 yawDeg=92, pitchDeg=0, rollDeg=0我们会得到yaw: 88.0, pitch: 180.0, roll: 180.0 -修改的

如果你用这些转换来直观地观察3D对象--即使GLM在内部修改了这些值,所有的旋转都应该看起来很好。

我注意到的另一件事是,GLM返回的欧拉角在所有轴的-180度范围内。

关于glm::mat4glm::quat的转换。我什么都做好了。这里需要注意的是,--如果在转换矩阵中使用缩放--您需要规范化您的四元数!

代码语言:javascript
运行
复制
glm::quat rotation = glm::normalize(glm::quat_cast(matrix));

我发现的另一件事是GLM有一个名为glm::extractEulerAngleXYZ的函数。所以,如果你只想从你的变换矩阵中提取欧拉角,你真的不需要做任何转换到四元数。

我仍然不完全满意,因为我没有找到任何方法将GLM的Euler角值转换回用户提供的原始值。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60345547

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档