李俊龍 郭仁春 姜檬 王志淳



摘? ?要:首先,文章介紹了剛體最短旋轉的概念,剛體從一個方位旋轉到另一個方位的過程中,可以有無限種方式,在這些方式中存在一種方式,繞某一軸旋轉一次就能到達指定方位,并且該角在﹣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.