我正在尝试将已存储为欧拉角glm::vec3
的OpenVR控制器方向转换为glm::fquat
,并进行反向转换,但结果差异很大,游戏中的行为是错误的(难以解释,但物体的方向在一小范围内表现正常,然后在奇怪的轴上翻转)。
这是我的转换代码:
// get `orientation` from OpenVR controller sensor data
const glm::vec3 eulerAnglesInDegrees{orientation[PITCH], orientation[YAW], orientation[ROLL]};
debugPrint(eulerAnglesInDegrees);
const glm::fquat quaternion{glm::radians(eulerAnglesInDegrees)};
const glm::vec3 result{glm::degrees(glm::eulerAngles(quaternion))};
debugPrint(result);
// `result` should represent the same orientation as `eulerAnglesInDegrees`
我期望eulerAnglesInDegrees
和result
应该是相同的,或者是同一方向的等效表示,但事实并非如此。以下是我得到的一些示例值:
39.3851 5.17816 3.29104
39.3851 5.17816 3.29104
32.7636 144.849 44.3845
-147.236 35.1512 -135.616
39.3851 5.17816 3.29104
39.3851 5.17816 3.29104
32.0103 137.415 45.1592
-147.99 42.5846 -134.841
如上所示,对于某些方向范围,转换是正确的,但对于其他方向范围则完全不同。
我做错了什么?
我查看过现有的问题并尝试了一些方法,包括尝试这里列出的每个可能的旋转顺序、共轭四元数和其他一些随机的事情,例如翻转俯仰/偏航/翻滚。但没有任何一个方法给了我预期的结果。
如何使用 glm
把欧拉角转换为四元数再转换回来,以表示原始方向?
以下是更多不一致的例子:
original: 4; 175; 26;
computed: -175; 4; -153;
difference: 179; 171; 179;
original: -6; 173; 32;
computed: 173; 6; -147;
difference: -179; 167; 179;
original: 9; 268; -46;
computed: -170; -88; 133;
difference: 179; 356; -179;
original: -27; -73; 266;
computed: -27; -73; -93;
difference: 0; 0; 359;
original: -33; 111; 205;
computed: 146; 68; 25;
difference: -179; 43; 180;
我试图找到一个模式来修复最终的computed
结果,但似乎没有一个易于识别的简单方法。
GIF + 视频演示:
我的直觉/目前的理解的可视化表示:
- 上面的图片显示了一个球体,我在中心。当我将枪瞄准绿色半球时,方向是正确的。当我将枪瞄准红色半球时,方向不正确-看起来每个轴都被反转了,但我不能确定是否确实如此。