【发布时间】:2020-03-05 22:27:43
【问题描述】:
我一直在使用 www.opengl-tutorial.org/intermediate-tutorials/tutorial-17-quaternions/ 上的指南来学习 OpenGL。本指南说...
glm::quat q;
...创建一个身份四元数(无旋转)。
实验表明q = [0, 0, 0, 0]。使用它作为根骨骼的父方向会导致根本不旋转任何骨骼。他们失去了所有的轮换。
指南说...
四元数是 4 个数字的集合,[x y z w],表示旋转如下:
// RotationAngle 以弧度为单位
x = RotationAxis.x * sin(RotationAngle / 2)
y = RotationAxis.y * sin(RotationAngle / 2)
z = RotationAxis.z * sin(RotationAngle / 2)
w = cos(RotationAngle / 2)
...和...
[0 0 0 1] (w=1) 表示角度 = 2*acos(1) = 0,所以这是一个单位四元数,完全不旋转。
我一直在试验一个骨架系统,其中每个骨骼在应用自己的旋转之前继承其父级的方向。
如果我使用“身份”四元数作为根骨骼的“父”方向,则根本不会旋转任何骨骼。如果我使用“单位”旋转,一切都很好。
当我将骨骼的初始方向设置为“身份”或“单位”四元数时,它会按我的意愿显示。但是,当我将用户输入的欧拉角转换为一个方向时,我会旋转 180 度。我所做的转换是:
glm::vec3 eulers(glm::radians(pose.lng_rotate),
glm::radians(pose.lat_rotate),
glm::radians(pose.att_rotate));
pose.orientation = glm::quat(eulers);
注意:我在这里使用“lng”、“lat”和“att”旋转,因为当骨骼继承父旋转时,“x”轴可能不再是“x”轴了。
我注意到的最后一件奇怪的事情是我在每种类型的四元数上使用了glm::mat4_cast,然后乘以一个标识glm::vec4。 “恒等”四元数使向量保持不变,但“单位”四元数使向量反转(乘以 -1)向量的 x 和 y 分量。
我想更好地理解四元数,尤其是关于它们在代码中的使用。
从概念上讲,“单位”四元数与“身份”四元数有何不同?
我应该在哪里使用“单位”四元数,我应该在哪里使用“身份”四元数?
我只是被写得不好的指南弄糊涂了吗?
【问题讨论】:
-
"实验表明 q = [0, 0, 0, 0]。" 证明它。全零的四元数不是“身份四元数”。我不认为 GLM 有这么糟糕的编码会有这样的错误。
-
@Nicol 我只是做了
glm::quat q; printf("%s, %s, %s, %s\n", std::to_string(q.x).c_str(), std::to_string(q.y).c_str(), std::to_string(q.z).c_str(), std::to_string(q.w).c_str());我使用字符串转换的原因是因为底层类型有些奇怪,使用 %f 或 %lf 会导致显示奇怪的值。我懒得弄清楚为什么。 -
我做了更多的实验,发现
glm::quat(1.0, 0.0, 0.0, 0.0)工作得很好。我没有注意到,尽管指南将四元数表示为 [x, y, z, w],但它声明您将其显式初始化为glm::quat(w,x,y,z)。 -
这个问题的标题是理想的标题。无需进一步阅读即可理解。它应该仅针对该属性进行投票。