“单位”四元数和“身份”四元数有什么区别?

Ala*_*irG 2 3d rotation

我一直在使用 www.opengl-tutorial.org/intermediate-tutorials/tutorial-17-quaternions/ 上的指南来学习 OpenGL。本指南说...

glm::quat q;

...创建恒等四元数(无旋转)。

实验表明 q = [0, 0, 0, 0]。使用它作为根骨骼的父方向会导致任何骨骼都不会旋转。他们失去了所有轮换。

导游说...

四元数是一组 4 个数字,[xyzw],它以下列方式表示旋转:

// RotationAngle 以弧度为单位

x = RotationAxis.x * sin(RotationAngle / 2)

y = RotationAxis.y * sin(RotationAngle / 2)

z = RotationAxis.z * sin(RotationAngle / 2)

w = cos(旋转角度/2)

... 和 ...

[0 0 0 1] (w=1) 表示angle = 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);
Run Code Online (Sandbox Code Playgroud)

注意:我在这里使用“lng”、“lat”和“att”旋转,因为当骨骼继承父旋转时,“x”轴可能不再是“x”轴。

我注意到的最后一件奇怪的事情是我使用glm::mat4_cast了每种类型的四元数,然后乘以一个 identity glm::vec4。“身份”四元数不旋转向量,但“单位”四元数导致向量反转(乘以 -1)向量的 x 和 y 分量。

我想更好地理解四元数,尤其是在它们在代码中的使用方面。

从概念上讲,“单位”四元数与“身份”四元数有何不同?

我应该在哪里使用“单位”四元数,我应该在哪里使用“身份”四元数?

我只是被写得很糟糕的指南弄糊涂了吗?

Jus*_*ere 7

单位四元数恒等四元数不同。四元数只是“四元数空间”中的任何数字,例如3 + 2i - 7j + 6k.

当我们使用四元数来计算旋转时,我们总是在谈论单位四元数,并且长度总是为 1,就像单位向量一样。乘以单位四元数是计算旋转的一种非常有效的方法,但长度必须保持不变,1。

恒等四元数是一个四元数,它不会改变与它相乘的任何四元数,因此1 + 0i + 0j + 0k1。因此,恒等四元数是无的旋转。

  • * i、j 和 k 是 glm 中的 x、y 和 z。w 是“真实”数字。 (2认同)