GLM 角度轴错了?
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 = %ftY = %ftZ = %fn", 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(上的旋转,表示非常相似,并可能导致转换微不足道的错误推论。例如,轴角(45,(1,0,0))
只是欧拉角(45,0,0)
。但是,对于更通用的轴,转换并不总是那么明显。
更令人困惑的是,当我们使用矢量的长度从轴角表示中创建单个 3D 矢量以编码旋转角度时,会使用欧拉矢量这个名称。例如,(45,(1,0,0))
可以编码为45*(1,0,0)
。但是,欧拉矢量与包含欧拉角的矢量不同,原因与轴角表示与欧拉角表示不同的原因相同。
最后,正如 Amadeus 在另一个答案中所述,glm框架要求对输入轴向量进行规范化。规范化此向量将给出预期的结果。
从 GLM_GTC_quaternion:
glm::角度轴:
从角度和归一化轴构建四元数。
参数
- 轴
角度以弧度表示的角度(如果GLM_FORCE_RADIANS是定义的,否则是度数。
四元数的轴,必须归一化。 (强调是我的(
您的代码段中没有规范化轴
相关文章:
- #定义c-预处理器常量..我做错了什么
- 努力将整数转换为链表。不知道我在这里做错了什么
- 首要问题的答案让值班员搞错了
- 看起来is_nothrow_constructible_v()在MSVC中被破坏了,我错了吗
- .h 和.cpp文件分离时出错,但仅使用 .h 文件时没有错误.我做错了什么?
- 我的C++线程做错了什么?
- 如何正确使用 >=?(a+f()+c)>=0 错了吗?
- 谁能告诉我我用 getline 做错了什么 (cpp) 格式
- 没有输出的合并排序我做错了什么?
- 我正在尝试使用 while 循环从字符串中删除字母,直到没有字母。我在这里做错了什么?
- 在C++中使用 AKS 素数测试计算双胞胎素数 我做错了什么?
- 指针相关的UE4崩溃.我的指针哪里错了?
- 我一直试图弄清楚我在这个链表程序中做错了什么
- 我正在尝试学习如何在 c++ 中传递指针,但出现错误:没有用于调用"test"的匹配函数。我做错了什么?
- FFMPEG,C++,内存泄漏,我做错了什么?
- 我做错了什么?反向字符串 C++
- 我在这个课上做错了什么?
- 创建整数的 2D 数组,该数组将使用两个函数用随机数填充矩阵.我做错了什么?
- 在不使用内置库函数的情况下添加字符串,我做错了什么?
- GLM 角度轴错了?