3d “a”和“a”之间有什么区别;单位「;四元数和一个;“身份”;四元数?

3d “a”和“a”之间有什么区别;单位「;四元数和一个;“身份”;四元数?,3d,rotation,3d,Rotation,我一直在使用www.opengl-tutorial.org/intermediate-tutorials/tutorial-17-quaternions/上的指南来学习opengl。这本指南说 glm::quatq …创建标识四元数(无旋转) 实验表明,q=[0,0,0,0]。将其用作根骨骼的父方向将不会导致任何骨骼旋转。他们失去了所有的旋转 导游说 四元数是一组由4个数字组成的[x y z w],以以下方式表示旋转: //旋转角度以弧度为单位 x=旋转轴x*sin(旋转角度/2) y=旋转轴y

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

glm::quatq

…创建标识四元数(无旋转)

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

导游说

四元数是一组由4个数字组成的[x y z w],以以下方式表示旋转:

//旋转角度以弧度为单位

x=旋转轴x*sin(旋转角度/2)

y=旋转轴y*sin(旋转角度/2)

z=旋转轴z*sin(旋转角度/2)

w=cos(旋转角度/2)

。。。而且

[01](w=1)表示角度=2*acos(1)=0,因此这是一个单位四元数,它根本不旋转

我一直在试验一个骨骼系统,其中每个骨骼在应用其自身旋转之前都继承其父骨骼的方向

如果使用“标识”四元数作为根骨骼的“父”方向,则所有骨骼都不会旋转。如果我使用“单位”旋转,一切都很好

当我将骨骼的初始方向设置为“标识”或“单位”四元数时,它会按我的需要显示。但是,当我将用户输入的Euler角度转换为方向时,我会得到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\u cast
,然后乘以一个标识
glm::vec4
。“单位”四元数使向量不旋转,但“单位”四元数使向量反转(乘以-1)向量的x和y分量

我想更好地理解四元数,特别是关于它们在代码中的使用

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

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


我只是被一本写得不好的指南弄糊涂了吗?单位和单位四元数是一样的。这本指南写得很糟糕,令人费解

glm::quat q不创建标识四元数。它创建了一个无效的四元数。创建标识四元数的最佳方法是通过
glm::quatq(glm::vec3(0.0,0.0,0.0))或通过
glm::quat q(1.0,0.0,0.0,0.0)。第一个基于所有零Euler旋转的向量生成四元数。第二个显式将其初始化为标识四元数


请注意,尽管四元数通常被描述为
[x y z w]
,但它们被存储并初始化为
(w,x,y,z)

单位和单位四元数是相同的。这本指南写得很糟糕,令人费解

glm::quat q不创建标识四元数。它创建了一个无效的四元数。创建标识四元数的最佳方法是通过
glm::quatq(glm::vec3(0.0,0.0,0.0))或通过
glm::quat q(1.0,0.0,0.0,0.0)。第一个基于所有零Euler旋转的向量生成四元数。第二个显式将其初始化为标识四元数


请注意,尽管四元数通常被描述为
[x y z w]
,但它们被存储并初始化为
(w,x,y,z)

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

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


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

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

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


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

“实验表明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)我使用字符串转换的原因是因为底层类型有点奇怪,使用%f或%lf会导致显示奇怪的值。我懒得弄清楚原因。我做了更多的实验,发现
glm::quat(1.0,0.0,0.0,0.0)
工作得非常好。我没有注意到,尽管指南将四元数表示为[x,y,z,w],但它声明您将其显式初始化为
glm::quat(w,x,y,z)