Unity 四元数与欧拉角的相互转换及推导

懒惰的我终于也要写第一篇博客啦~由于需求需要在控制台中对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=s1c2c3c1s2s3z=c1s2c3s1c2s3
其中:
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(2wx2yz)Y=atan2(2wy+2xz,12x22y2)Z=atan2(2wz+2xy,12x22z2)

推导

欧拉角→四元数

首先由轴角到四元数公式 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

  • 3
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Unity四元数(Quaternion)和欧拉角(Euler Angle)都是用来表示物体旋的数学工具,但它们之间有很大的区别。 1. 表示方式不同 欧拉角使用三个角度值来表示旋,通常是Yaw(偏航角)、Pitch(俯仰角)和Roll(翻滚角)。这三个角度可以分别表示绕X、Y、Z轴的旋四元数则是由四个数值构成的,分别是实部和三个虚部,通常表示为(q0,q1,q2,q3)。其中实部q0表示旋的余弦值,三个虚部q1、q2、q3则表示旋的轴向。 2. 表示精度不同 欧拉角存在“万向锁”问题,即当物体绕两个轴的旋角度相等时,会出现某个轴失效的情况。这种问题在计算机图形学中很常见,因此欧拉角的使用受到了限制。 四元数则不存在这种问题,因为它是四维的,可以表示任意旋。同时,四元数在旋计算时也比欧拉角更高效、更精确。 3. 插值方式不同 欧拉角的插值方式通常使用线性插值或球面线性插值,但由于存在万向锁问题,实际应用中需要进行额外的处理。 四元数则可以使用球面线性插值(Slerp)或球面立方插值(Slerp+)进行插值。这些插值方式不仅避免了万向锁问题,而且可以保证插值后的结果仍然是合法的四元数。 综上所述,虽然欧拉角在某些场合下仍然有用,但在大多数情况下,四元数已经成为了计算机图形学中旋表示的标准工具。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值