李俊龙 郭仁春 姜檬 王志淳
摘 要:首先,文章介绍了刚体最短旋转的概念,刚体从一个方位旋转到另一个方位的过程中,可以有无限种方式,在这些方式中存在一种方式,绕某一轴旋转一次就能到达指定方位,并且该角在﹣180°~180°之间,称这样的旋转方式为最短旋转。其次,给出最短旋转的数学表达式,即两个方位角的四元数之比。在Unity 3D中,表示刚体方位的参数分别是欧拉角和四元数。文章采用具体实例验证最短旋转与四元数的关系,给出了寻找最短旋转的解决方案。
关键词:Unity 3D;最短旋转;四元数
在Unity 3D中,实现物体旋转有多种方式,如旋转矩阵、欧拉角和四元数等[1]。旋转需要两个基本参量轴和角,物体从一个方位旋转到另一个方位可以采用多次改變轴和角的方式,依次旋转。其中,有一种旋转方式是只绕一个轴旋转一次就能达到指定方位,且旋转角度在﹣180°~180°之间,称这样的旋转方式为最短旋转。这个定义由于没有其他文献支持,因此本文为便于理解,采用最短旋转的说法。
任意指定两个方位,要找出其中的最短旋转并不是一件容易的事。本文将给出最短旋转的数学描述以及在Unity 3D中实现最短旋转的方法。
1 最短旋转的数学描述
刚体的运动包括平动和转动。描述刚体的空间位置,用三维空间坐标点(x,y,z)表示,在Unity 3D中有3个基本坐标系,分别是世界坐标系、惯性坐标系与本地坐标系。相应的,描述刚体的旋转状态,即方位,是本地坐标系与惯性坐标系所形成的角度变化,采用欧拉角(α,β,γ)来描述。由于本文不涉及平移,因此为方便讨论,将惯性坐标系和世界坐标系重合。
众所周知,“两点之间线段最短”,同样两个方位之间也存在类似的关系,即最短旋转,两点之间的距离用两点位置之差来描述。相应的,两个方位之间的最短旋转用两个方位的四元数之比来描述。
如果方位a的四元数为q1,方位b的四元数为q2,刚体从方位a旋转到方位b的最短旋转的四元数为q,则q=q2÷q1,一般写成q= q2×q1-1
设四元数q的4个分量分别是(x,y,z,w),该四元数隐含了旋转轴向量n和旋转角θ,设轴向量n的3个分量为(nx,ny,nz)。一般将轴n和角θ写成“轴角对”的形式,即(n, θ)=( nx, ny, nz, θ)。四元数q=(x, y, z, w) 与轴角对(n, θ)=( nx, ny, nz, θ)之间的关系为:
在Unity 3D中,改变欧拉角和改变四元数是两种基本的旋转方式,Unity 3D提供了Lerp和Slerp两种插值函数,在两个方位之间进行采样插值。对欧拉角的Lerp插值,很难实现最短旋转,而四元数Slerp函数插值则非常容易实现最短旋转,下面通过例子来进行验证。
2 在Unity3D中改变欧拉角实现旋转
在Unity 3D中,制作一个空物体,命名为a,该物体位于世界坐标系的原点位置,在其下面放置一个立方体Cube和一个小球Sphere,调整立方体和小球的大小和位置,如图1所示,让小球位于立方体的一个角点。
将该段代码拖拽到物体x上,将场景中的物体a和b拖放到代码的公共变量卡槽a和b上,代码中的Vector3.Lerp是系统提供的插值函数,包括3个参数:起始向量a的欧拉角、结束向量b的欧拉角、插值t在0~1的取值,运行结果如图4所示。
从图4可以看到,物体x上的小球画出了一条奇怪的轨迹,说明用欧拉角插值不能实现最短旋转。
3 在Unity3D中改变四元数实现最短旋转
代码中q1和q2分别是a, b的四元数,Slerp是在两个四元数之间进行插值,再次运行,结果如图5所示。通过观察可以看出,物体x绕某一固定轴一次旋转到了指定位置,实现了最短旋转。
在图5中可以清楚地看出刚体绕轴n旋转了θ角。这个旋转过程用语言可以描述为:一个刚体从初始方位为a,其欧拉角为(-20,-30,9),旋转到末方位b,欧拉角为(15,80,60),找到轴角对(n, θ)实现最短旋转。方位a和b的四元数q1,q2可以通过各自的欧拉角求出,计算公式可参考苏超凡等[2]的研究,手工计算结果如下:
4 结语
仿照最短距离,本文给出了最短旋转的概念并给出了最短旋转的数学描述,即两个方位的四元数的比值。在Unity 3D中,通过修改四元数很容易实现最短旋转,并能够直观地给出旋转轴和角,对理解四元数在Unity 3D中的应用具有重要作用。
[参考文献]
[1]戈洪瑶,郭仁春.基于Unity 3D的欧拉角实现对物体旋转的应用[J].湖北农机化,2019(13):119-121.
[2]苏超凡,郭仁春.Unity 3D中欧拉角与四元数关系的研究[J].计算机科学与应用,2019(5):890-895.