我正在尝试将以欧拉角的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
如您在上面看到的,对于某些方向范围而言,转换是正确的,但对于另一些方向而言,则是完全不同的。
我在做什么错?
我已经研究了现有的问题,并尝试了一些尝试,包括尝试every possible rotation order listed here,conjugating the quaternion以及其他诸如翻转俯仰/偏航/侧倾等随机事件。什么都没有给我预期的结果。
我如何使用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 +视频的行为:
我的直觉/当前理解的视觉表示:
我正在尝试将以欧拉角的glm :: vec3存储的OpenVR控制器的方向转换为glm :: fquat并返回,但是我得到的结果和游戏中的行为截然不同...
32.7636 144.849 44.3845-147.236 35.1512 -135.616
表示旋转的任意3个角度的定义不仅是旋转的顺序(如果是外在的还是外在的,还包括在定义每个元素的映射时选择的角度间隔) 3D Rotation Group到3个角度的元组。