如何从glm :: quat和glm :: mat4中提取偏航桨距倾角

问题描述 投票:0回答:1

是否可以从glm::mat4中提取偏航俯仰横滚信息?(这是已应用平移,旋转和缩放的世界变换矩阵]

这是我正在尝试的一些代码:

    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的转换不正确?

matrix glm quaternions glm-math
1个回答
0
投票

之所以得到这些意想不到的值,是因为在某些角度,GLM在内部应用了自己的角度。即:

输入 yawDeg=60, pitchDeg=0, rollDeg=0,我们将获得yaw: 60.0, pitch: 0.0, roll: 0.0-按预期

并用于:

Input yawDeg=92, pitchDeg=0, rollDeg=0我们将获得yaw: 88.0, pitch: 180.0, roll: 180.0-modified

如果您在视觉上看一下应用了这些转换的3D对象-即使GLM在内部修改了这些值,所有旋转也应该正常。

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

关于glm::mat4glm::quat的转换。我在做每件事〜好。这里要注意的重要一点是,变换矩阵中的[[如果使用缩放],则需要对四元数进行归一化!glm::quat rotation = glm::normalize(glm::quat_cast(matrix));

我发现的另一件事是GLM具有一个称为glm::extractEulerAngleXYZ的功能。因此,如果您只想从变换矩阵中提取欧拉角,则实际上不需要进行任何四元数转换。

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

© www.soinside.com 2019 - 2024. All rights reserved.