从欧拉角到四元数并返回的GLM转换不成立

问题描述 投票:3回答:2

我正在尝试将以欧拉角的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`

我希望eulerAnglesInDegreesresult是相同方向的相同或等同表示,但是显然不是这种情况。这些是我打印出来的一些示例值:

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 hereconjugating 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 +视频的行为:

Video excerpt

Visual diagram

  • 上面的图片显示了一个球体,我在中心。当我将枪对准球体的绿色部分时,方向是正确的。当我将枪对准球体的红色一半时,这是不正确的-似乎每个轴都颠倒了,但我不确定百分百是这种情况。

我正在尝试将以欧拉角的glm :: vec3存储的OpenVR控制器的方向转换为glm :: fquat并返回,但是我得到的结果和游戏中的行为截然不同...

c++ quaternions glm-math euler-angles openvr
2个回答
2
投票

32.7636 144.849 44.3845-147.236 35.1512 -135.616


0
投票

表示旋转的任意3个角度的定义不仅是旋转的顺序(如果是外在的还是外在的,还包括在定义每个元素的映射时选择的角度间隔) 3D Rotation Group到3个角度的元组。

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