c++ - 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 搞砸了?
解决方案
轴角表示和欧拉角是编码旋转的两种不同方式。对于规范轴(X、Y、Z)上的旋转,表示非常相似,并且可能导致错误推断为转换是微不足道的。例如,Axis-Angle(45,(1,0,0))
就是 Euler Angles (45,0,0)
。但是,对于更通用的轴,转换并不总是那么明显。
更令人困惑的是,当我们使用 Axis-Angle 表示创建单个 3D 向量时使用了Euler Vector这个名称,该表示使用向量的长度来编码旋转角度。例如,(45,(1,0,0))
可以编码为45*(1,0,0)
. 但是,欧拉向量与包含欧拉角的向量不同,原因与轴角表示不同于欧拉角的原因相同。
最后,正如 Amadeus 的另一个答案中所述,glm框架要求对输入轴向量进行归一化。规范化这个向量将给出预期的结果。
推荐阅读
- node.js - While sending mail by Nodemailer I am getting error of Invalid login
- tensorflow - 如果softmax不包含在训练中,那么在TensorFlow中如何获得softmax的参数?
- python - 如何解析plist?
- html - css 中的大纲在 IE 中不起作用(最新版本)
- python - 从我编写的类继承时出现“self”运算符的问题
- python-3.x - python:如果条件不满足while循环
- r - 计数连续出现并在找到值后停止
- java - 从 Jackson 2.5.0 移植到 2.9.5 或 2.7.0 时,json 枚举响应未按预期进行
- ios - 无法在 Swift 中访问可编码的结构值
- cassandra - 在 Cassandra 中持久化连接表数据的最佳方法