《3D游戏编程大师技巧》 上册 4.10章节
1.四元数的思想来源于复数
复数:当只有一个虚部i的时候,复数的几何表示可以表示为二维复平面。
四元数:从一个虚部i 扩展到 三个虚部 i,j,k。四元数为一个实部+3个虚部:P=p0+p1*i+p2*j+p3*k。其中q0为实部。
其中,<i,j,k>可以看做一个三维空间,i,j,k分别为三个方向上的基向量,并且,i*j=j*k=k*j=-1。
那么四元数可以用向量方式表示:<p0,p1,p2,p3>。
1.5 用四元数表示旋转轴和旋转角度
情况1.给定一个旋转轴Vq(单位向量),和绕此轴的旋转角度θ,得到四元数:
Q=cos(θ/2)+sin(θ/2)*Vq
情况2.给定了旋转的标准欧拉角(xθ,yθ,zθ),xθ为x轴的倾角,yθ为y轴的偏航角,zθ为z轴的倾斜角,要得到用Q来表示旋转轴和旋转角的四元数。
根据Q(final)=xyz三个轴的四元数的乘积(顺序不限)
=Q(xθ)*Q(yθ)*Q(zθ) (顺序不限)
=Q(zθ)*Q(yθ)*Q(xθ) (3D引擎中常用顺序)
首先分别计算出Q(xθ)、Q(yθ)、Q(zθ):
根据Q=cos(θ/2)+sin(θ/2)*Vq知道,知道了旋转轴和角度可以获得四元数,得到:
Q(xθ)=cos(xθ/2)+sin(xθ/2)*(1·i+0·j+0·k) (基向量为<1,0,0>)
Q(yθ)=cos(yθ/2)+sin(yθ/2)*(0·i+1·j+0·k) (基向量为<0,1,0>)
Q(zθ)=cos(zθ/2)+sin(zθ/2)*(0·i+0·j+1·k) (基向量为<0,0,1>)
2.四元数旋转
向量V,绕Vq轴旋转θ度,用单位四元数Q=cos(θ/2)+sin(θ/2)*Vq表示旋转轴和旋转向量,Q*为Q的共轭复数,则向量V旋转结果V'为如下:
右手坐标系:
1.顺时针旋转:
V'=Q*·V·Q
2.逆时针旋转:
V'=Q·V·Q*
左手坐标系:
1.顺时针旋转:
V'=Q·V·Q*
2.逆时针旋转:
V'=Q*·V·Q
得到的V'的v'0=0,因此,可以去掉v'0,用v=<v'1,v'2,v'3>来代表旋转后得到的向量
注意,只有当Q为单位四元数的时候,Q﹣¹=Q*