提出
在 Unity 中 我使用了
transfrom.localEulerAngles.y
去獲取旋轉角度 y 的值,而並沒有用localRotation
這就涉及到了歐拉角(EulerAngles)和四元數(Quaternion)的概念。
歐拉角(EulerAngles)
百度百科說道,”歐拉角是用來唯一地確定定點轉動明體位置的三個一組獨立角參量,由章動角θ、進動角ψ和自轉角φ組成,為L.歐拉首先提出,故得名。“
在 Unity 中 EulerAngles 使用三個值(x,y,z)組成的旋轉序列來表示角位移,這三個值分別繞三個相互垂直的軸(本地坐標軸)的旋轉角度。
XYZ 約定一:heading-pitch-bank 約定(來自網絡)
- 先將物體坐標系與慣性坐標系重合
- heading 繞此時物體坐標系的 y 軸旋轉
- pitch 繞 heading 旋轉后的物體坐標系的 x 軸旋轉
- bank 繞 heading-pitch 旋轉后的物體坐標系的 z 軸旋轉
XYZ約定二:yaw-pitch-roll 約定 (來自《Unity 5 實踐》)
- 先將物體坐標系與慣性坐標系重合
- yaw(偏航) 繞此時物體坐標系的 y 軸旋轉
- pitch(偏角) 繞 heading 旋轉后的物體坐標系的 x 軸旋轉
- roll(側滾) 繞 heading-pitch 旋轉后的物體坐標系的 z 軸旋轉
四元數(quaternion)
四元數是一個描述旋轉的數學概念,強烈推薦去看一遍B站的一個視頻【Numberphile數字狂】神奇四元數。
看完視頻后,可以簡單說,我們在一維空間(X軸)移動需要一個數,這個就是實數(1 or -1)。在二位空間(XY坐標軸)移動和旋轉我們需要添加一個數,這個數就是復數i(i²=-1),進入三維空間(xyz坐標軸)移動和旋轉我們就需要再添加兩個數,構成的就是四元數ijk(i²=j²=k²=ijk=-1)。
在 Unity 方面 Quaternion 是為了在旋轉值之間插值,使得旋轉看起來更平滑和自然。三維動畫和游戲中常用四元數,如果是歐拉旋轉(用xyz軸的轉動角表示),轉動的路徑常常不是弧形,有時還會造成萬向節鎖,也就是無法旋轉,四元數很好地解決了這個問題。
總結
localRotation
是一個四元數,而不是歐拉角,使用 EulerAngles 是為了讓旋轉更加容易理解,Unity 提供了歐拉角和四元數的自動轉換,方便開發人員進行操作。