是否可以从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::mat4
到glm::quat
的转换不正确?
之所以得到这些意想不到的值,是因为在某些角度,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::mat4
到glm::quat
的转换。我在做每件事〜好。这里要注意的重要一点是,变换矩阵中的[[如果使用缩放],则需要对四元数进行归一化!glm::quat rotation = glm::normalize(glm::quat_cast(matrix));
我发现的另一件事是GLM具有一个称为glm::extractEulerAngleXYZ
的功能。因此,如果您只想从变换矩阵中提取欧拉角,则实际上不需要进行任何四元数转换。
我仍然不完全满意,因为我没有找到将GLM的欧拉角值转换回用户提供的原始值的任何方法。