GLM angleAxis 错误?
GLM angleAxis wrong?
从 OpenGL 中的四元数测试中,我注意到多轴上的旋转没有按应有的方式工作。所以我写了一个简单的程序来调试它。这是我的程序:
glm::quat rotation = glm::angleAxis(glm::radians(45.0f), glm::vec3(1.0f, 1.0f, 0.0f));
glm::vec3 eulerRotation = glm::degrees(glm::eulerAngles(rotation));
printf("X = %f\tY = %f\tZ = %f\n", eulerRotation.x, eulerRotation.y, eulerRotation.z);
根据我对旋转的理解,这应该输出:
X = 45.0 Y = 45.0 Z = 0.0
但是程序输出如下:
X = 51.589348 Y = 45.000004 Z = 18.939444
我使用的是 GLM 版本 0.9.9.5 和 C++ 14
那么,我对旋转的理解是错误的还是 GLM 搞砸了?
glm::angleAxis:
Build a quaternion from an angle and a normalized axis.
Parameters
angle Angle expressed in radians if GLM_FORCE_RADIANS is define or degrees otherwise.
axis Axis of the quaternion, must be normalized.
(emphasis are mine)
您的代码段中没有标准化轴
Axis-Angle Representation and the Euler Angles 是两种不同的旋转编码方式。对于规范轴(X、Y、Z)上的旋转,表示非常相似,可能会导致错误的推断,即转换是微不足道的。例如,轴角 (45,(1,0,0))
就是欧拉角 (45,0,0)
。然而,对于更通用的轴,转换并不总是那么明显。
更令人困惑的是,当我们使用向量的长度从轴角表示中创建单个 3D 向量时,会使用名称 Euler Vector旋转角度。例如,(45,(1,0,0))
可以编码为 45*(1,0,0)
。但是,欧拉向量与包含欧拉角的向量不同,原因与轴角表示不同于欧拉角的原因相同。
最后,正如 Amadeus 在另一个回答中所述,glm 框架要求对输入轴向量进行归一化。规范化该向量将给出预期的结果。
从 OpenGL 中的四元数测试中,我注意到多轴上的旋转没有按应有的方式工作。所以我写了一个简单的程序来调试它。这是我的程序:
glm::quat rotation = glm::angleAxis(glm::radians(45.0f), glm::vec3(1.0f, 1.0f, 0.0f));
glm::vec3 eulerRotation = glm::degrees(glm::eulerAngles(rotation));
printf("X = %f\tY = %f\tZ = %f\n", eulerRotation.x, eulerRotation.y, eulerRotation.z);
根据我对旋转的理解,这应该输出:
X = 45.0 Y = 45.0 Z = 0.0
但是程序输出如下:
X = 51.589348 Y = 45.000004 Z = 18.939444
我使用的是 GLM 版本 0.9.9.5 和 C++ 14 那么,我对旋转的理解是错误的还是 GLM 搞砸了?
glm::angleAxis:
Build a quaternion from an angle and a normalized axis.
Parameters
angle Angle expressed in radians if GLM_FORCE_RADIANS is define or degrees otherwise.
axis Axis of the quaternion, must be normalized. (emphasis are mine)
您的代码段中没有标准化轴
Axis-Angle Representation and the Euler Angles 是两种不同的旋转编码方式。对于规范轴(X、Y、Z)上的旋转,表示非常相似,可能会导致错误的推断,即转换是微不足道的。例如,轴角 (45,(1,0,0))
就是欧拉角 (45,0,0)
。然而,对于更通用的轴,转换并不总是那么明显。
更令人困惑的是,当我们使用向量的长度从轴角表示中创建单个 3D 向量时,会使用名称 Euler Vector旋转角度。例如,(45,(1,0,0))
可以编码为 45*(1,0,0)
。但是,欧拉向量与包含欧拉角的向量不同,原因与轴角表示不同于欧拉角的原因相同。
最后,正如 Amadeus 在另一个回答中所述,glm 框架要求对输入轴向量进行归一化。规范化该向量将给出预期的结果。