gpt4 book ai didi

c++ - 如何否定任何单个轴上的 GLM 四元数旋转?

转载 作者:行者123 更新时间:2023-11-28 07:30:54 35 4
gpt4 key购买 nike

我有一个从传感器派生的四元数,它在 OpenGL ES 场景中旋转“相机”。此外,我将这个四元数的倒数应用于场景中的某些对象,因此它们“面向”“相机” - 这按预期工作。问题是我需要取消这些对象在 Z 轴上的旋转。我如何得出在 Z 分量内没有旋转的四元数?

我的测试:我试图提取欧拉角,创建一个负四元数,并通过两个四元数的乘积为这些对象构建旋转矩阵 - 结果不正确。

glm::quat rMQ = cam->getCameraQuaternion();// retrieve camera quat
glm::vec3 a = glm::eulerAngles((rMQ))* 3.14159f / 180.f; // Euler angle set derived
glm::quat rMZ = glm::angleAxis(-a.z, vec3(0.0f, 0.0f, 1.0f)); // negating quaternion
glm::mat4 fM = glm::inverse(glm::mat4_cast(rMQ*rMZ)); //final mat4 for GL rotation

最佳答案

当您使用四元数时,没有“在 z 轴上旋转”,只有一个轴和一个角度。您需要转换为欧拉,翻转一个分量的符号,然后再转换回四元数。

对于欧拉角,由您定义旋转顺序。旋转不是可交换的,因此顺序很重要,这就是为什么没有将旋转分解为组件的一般方法。通常顺序是 xyz,但没有理由必须这样。在某些 API 中,您可以选择顺序。

关于c++ - 如何否定任何单个轴上的 GLM 四元数旋转?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17749241/

35 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com