懒惰的我终于也要写第一篇博客啦~由于需求需要在控制台中对unity的四元数与欧拉角进行相互转换 而网上的文章大多没有推导过程 并且坐标系或欧拉角的旋转顺序与unity不一致 所以自己动笔算了算 在此记录一下~
首先感谢这个小姐姐的这篇文章。以及文章中的以下四个链接给予我的启发
1. Euler To Quaternion
2.Quaternion To Euler
3.AngleAxis To Quaternion
4.Quaternion To AngleAxis
注:本文建立在对欧拉角和四元数概念了解透彻的基础上所做的纯数学推导 若对概念不清可先看上面小姐姐的文章~
废话结束进入正题
先说结论
定义unity中的欧拉角为e = (X,Y,Z)
四元数为Q = (x,y,z,w) = w+ix+jy+kz
欧拉角→四元数:
w = c 1 c 2 c 3 + s 1 s 2 s 3 x = s 1 s 2 c 3 + c 1 c 2 s 3 y = s 1 c 2 c 3 − c 1 s 2 s 3 z = c 1 s 2 c 3 − s 1 c 2 s 3 \begin{array}{l} w = c_1c_2c_3 + s_1s_2s_3\\ x = s_1s_2c_3 + c_1c_2s_3\\ y = s_1c_2c_3 - c_1s_2s_3\\ z = c_1s_2c_3 - s_1c_2s_3\end{array} w=c1c2c3+s1s2s3x=s1s2c3+c1c2s3y=s1c2c3−c1s2s3z=c1s2c3−s1c2s3
其中:
s 1 = s i n ( Y / 2 ) c 1 = c o s ( Y / 2 ) s 2 = s i n ( Z / 2 ) c 2 = c o s ( Z / 2 ) s 3 = s i n ( X / 2 ) c 3 = c o s ( X / 2 ) \begin{array}{l} s_1 = sin(Y/2)\\ c_1 = cos(Y/2)\\ s_2= sin(Z/2)\\ c_2 = cos(Z/2)\\ s_3 = sin(X/2)\\ c_3 = cos(X/2)\end{array} s1=sin(Y/2)c1=cos(Y/2)s2=sin(Z/2)c2=cos(Z/2)s3=sin(X/2)c3=cos(X/2)
四元数→欧拉角:
X = a s i n ( 2 w x − 2 y z ) Y = a t a n 2 ( 2 w y + 2 x z , 1 − 2 x 2 − 2 y 2 ) Z = a t a n 2 ( 2 w z + 2 x y , 1 − 2 x 2 − 2 z 2 ) \begin{array}{l} X = asin(2wx-2yz)\\ Y = atan2(2wy+2xz,1-2x^2-2y^2)\\ Z = atan2(2wz+2xy,1-2x^2-2z^2)\end{array} X=asin(2wx−2yz)Y=atan2(2wy+2xz,1−2x2−2y2)Z=atan2(2wz+2xy,1−2x2−2z2)
推导
欧拉角→四元数
首先由轴角到四元数公式 q = ( ( x , y , z ) s i n θ 2 , c o s θ 2 ) q = ((x,y,z)sin\frac{\theta}{2},cos\frac{\theta}{2}) q=((x,y,z)sin2θ,cos2θ) 得绕三个轴旋转的四元数分别为
Q X = c 3 + i s 3 Q Y = c 1 + j s 1 Q Z = c 2 + k s 2 \begin{array}{l} Q_X = c_3+is_3\\ Q_Y = c_1+js_1\\ Q_Z = c_2+ks_2 \end{array} QX=c3+is3QY=c1+js1QZ=c2+ks2
由于unity欧拉角的旋转顺序为z→x→y
故该欧拉角对应的四元数应为
Q = Q Y Q X Q Z Q=Q_YQ_XQ_Z Q=QYQXQZ
分别带入得
Q = ( c 1 + j s 1 ) ( c 3 + i s 3 ) ( c 2 + k s 2 ) = ( c 1 c 3 + i c 1 s 3 + j s 1 c 3 − k s 1 s 3 ) ( c 2 + k s 2 ) = c 1 c 2 c 3 + s 1 s 2 s 3 + i ( s 1 s 2 c 3 + c 1 c 2 s 3 ) + j ( s 1 c 2 c 3 − c 1 s 2 s 3 ) + k ( c 1 s 2 c 3 − s 1 c 2 s 3 ) \begin{array}{l} Q &=(c_1+js_1)(c_3+is_3)(c_2+ks_2)\\ &=(c_1c_3+ic_1s_3+js_1c_3-ks_1s_3)(c_2+ks_2)\\ &=c_1c_2c_3+s_1s_2s_3+i(s_1s_2c_3+c_1c_2s_3)+j(s_1c_2c_3-c_1s_2s_3)+k(c_1s_2c_3-s_1c_2s_3) \end{array} Q=(c1+js1)(c3+is3)(c2+ks2)=(c1c3+ic1s3+js1