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

时间:2013-07-19 14:54:44

标签: c++ opengl-es quaternions glm-math

我有一个衍生自传感器的四元数,可以在OpenGL ES场景中旋转“相机”。 此外,我将此四元数的逆应用于场景中的某些对象,因此它们“面向”“相机” - 这可以按预期工作。 问题是我需要否定这些对象在Z轴上的旋转。 如何在Z分量中提出无旋转的四元数?

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

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

2 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:0)

尝试简单地清零四元数的'z'组件,然后重新规范化。

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