0

我有一个从传感器派生的四元数,它在 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
4

2 回答 2

1

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

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

于 2013-07-26T06:56:21.200 回答
0

尝试简单地将四元数的“z”分量归零,然后重新归一化。

四元数,当用于表示旋转时,可以被认为是“轴角”表示。

于 2013-07-22T15:51:36.757 回答