是否可以从偏航、音调和滚信息中提取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
的转换是不正确的?
发布于 2020-12-25 13:23:46
我想补充一件事。GLM的偏航度实际上介于−90°~90°之间。这是因为GLM从正弦波中得到偏航角,而−90°~90°是通常可以得到的主值范围。
在这里,您可以看到GLM,https://github.com/g-truc/glm/blob/master/glm/gtc/quaternion.inl#L41的github中的代码片段
发布于 2020-02-27 14:41:29
我之所以得到这些意料之外的值,是因为在某些角度,GLM在内部应用它自己的角度。指:
输入 yawDeg=60, pitchDeg=0, rollDeg=0
我们将得到yaw: 60.0, pitch: 0.0, roll: 0.0
-作为预期的。
并用于:
输入 yawDeg=92, pitchDeg=0, rollDeg=0
我们会得到yaw: 88.0, pitch: 180.0, roll: 180.0
-修改的!
如果你用这些转换来直观地观察3D对象--即使GLM在内部修改了这些值,所有的旋转都应该看起来很好。
我注意到的另一件事是,GLM返回的欧拉角在所有轴的-180度范围内。
关于glm::mat4
到glm::quat
的转换。我什么都做好了。这里需要注意的是,--如果在转换矩阵中使用缩放--您需要规范化您的四元数!
glm::quat rotation = glm::normalize(glm::quat_cast(matrix));
我发现的另一件事是GLM有一个名为glm::extractEulerAngleXYZ
的函数。所以,如果你只想从你的变换矩阵中提取欧拉角,你真的不需要做任何转换到四元数。
我仍然不完全满意,因为我没有找到任何方法将GLM的Euler角值转换回用户提供的原始值。
https://stackoverflow.com/questions/60345547
复制相似问题