【OpenGL_02】欧拉角、万向锁、四元数
在LearnOpenGL网站学习,记录一下学习笔记
欧拉角
引用博客欧拉角与旋转矩阵的转换关系
欧拉角就是我们日常生活中常用的表示旋转的三维向量的乘积。
在Unity中,用zxy的顺序来表示旋转,即选旋转z轴、x轴、y轴的方式来表示旋转。在给出逆时针旋转的角度为正时(与右手系旋转方向相同的为旋转正方向),绕不同轴的旋转的矩阵表示:
按照不同轴进行旋转的时候,乘以相应的矩阵即可。
例如:依次按照x-y-z轴的顺序进行分别旋转特定的角度 \(\psi\)、\(\phi\)、\(\theta\) 。旋转矩阵为:
万向锁
在欧拉角的旋转计算过程中,会发生两个坐标系重合,然后欧拉角描述的旋转会丧失旋转维度的现象
如图所示:
四元数
引用博客四元数——基本概念
引用博客如何形象地理解四元数?
参考视频奇妙的四元数与空间旋转
我们将二维空间表示为(x,y),当y=0时,其实可以看成是一维的,只不过它表示成(x,0)这种形式。推到四维,(w,x,y,z),当w=0时,(0,x,y,z)就是一个三维子空间,这也是为什么我们可以用单位四元数对三维向量进行操作,其实我们是将三维向量映射到四维的三维子空间(w=0,这种形式也成纯四元数),然后对其进行旋转,最终得到的向量结果依然是这个三维子空间中的,因而可以映射回三维空间。
四元数的表达式为:
其中,$$i2=j2=k^2=ijk=-1$$
所以,四元数原本是用来描述在四维空间中的点的位置,可以用来描述四维空间中的旋转,也可以用来描述子空间(三维空间)的旋转。
所以可以用纯四元数来描述三维空间中的点。表达式为:
如果你想算一个点在这个旋转下新的坐标,需要进行如下操作,
1.定义纯四元数
2.进行四元数运算
3.产生的\(qw^{'}\)一定是纯四元数,也就是说它的第一项为0,有如下形式:
4.\(qw^{'}\)中的后三项就是:、
这样,就完成了一次四元数旋转运算。
同理,如果你有一个四元数:
那么,它对应一个以向量\(v=(vx,vy,vz)\)为轴,旋转角度\(\theta\)的旋转操作(右手法则的旋转)。
里面用的是\(\frac{\theta}{2}\)而不是\(\theta\)。这是因为\(q\)做的就是一个\(\frac{\theta}{2}\)的旋转,而\(q^{'}\)也做了一个\(\frac{\theta}{2}\)的旋转。我们进行了两次旋转,而不是一次,这两次旋转的结果是一个旋转角为\(\theta\)的旋转。
示意图:
四元数的矩阵乘法及其可易性
引用文章四元数矩阵的乘法及其可易性
蜕变矩阵
已知矩阵\(P\)的运算如下,
四元数的矩阵乘法
所以,如果有两个四元数\(q_1=a+bi+cj+dk\)和\(q_2=e+fi+gj+hk\)
那么它们的乘积为
同理,\(q_2\)与\(q_1\)的乘积为

浙公网安备 33010602011771号