ETH官方钱包

前往
大廳
主題

Unity C# | 旋轉(Rotate)#1-常見的座標旋轉方式

瓶裝雪 | 2023-06-26 19:00:08 | 巴幣 2 | 人氣 822

一、前言
  這篇文章將會講述常見的座標(Transform)旋轉方式,適合初學者到進階程式員複習。

二、座標旋轉
  旋轉是許多遊戲都必定使用的功能,但是它是一個非常複雜的系統,除了旋轉從三維座標改為四維的四元數以外,座標計算與旋轉方式組合出多種狀態,直接轉動與平滑移動的不同,導致成為許多人的夢魘。

1. 默認旋轉方向
  首先,我們談談旋轉這件事情,從最基礎的部分開始講起,當我們以某個軸向為基準旋轉90度,那物體會依據某個軸向順時鐘旋轉,如果要逆時鐘旋轉就必須要旋轉負90度,或軸向基準改為負軸向。

2. 直接完成目標
  如果希望讓物件旋轉90度,程式碼也很直接的撰寫成:執行後物體會旋轉90度,那當執行程式後,物體會直接完成目標,不會有中間的旋轉過程,無論是哪一種旋轉方式皆是如此。

3. 平滑移動的方法
  如果希望達成平滑的旋轉,有幾種方式可以達成目標:第一種方式是運用插值(Lerp)的方式去改變物件座標,物體會平滑的移動過去;第二種方式是運用逐格旋轉的方式,讓它逐步轉過去;第三種方法是運用非同步程式碼撰寫,每隔幾毫秒轉動一次,會比第二種方法更注重時間的精確。

三、常用的座標旋轉方法
  這篇文章將會講述普通的座標系統旋轉,因為 Unity 有為四元數設計幾套有用的函式,讓我們可以忽略四元數的複雜,因此不包含四元數的介紹、插值的使用等等,僅介紹常見的旋轉函式。

1. Transform.Rotate()
  這是最基礎與最常用的旋轉方式,其中所有的 Space 都可以省略,系統會默認 Space.Self,總共有以下三種:

transform.Rotate(Vector3 eulerAngles, Space);
  在函式的參數中,只需要輸入一個 Vector3,就會依據上面的XYZ值開始旋轉,假設X=1,那每次執行函式,這個 Vector3 的X就會 +1。

Rotate(float x , float y, float z, Space)
  在函式的參數中,需要輸入三次浮點數(float)代表XYZ,當我們輸入參數,就會依據上面的XYZ值開始旋轉,假設X=1,那每次執行函式,這個 Vector3 的X就會 +1。

Rotate(Vector3 axis, float angle, Space)
  在函數的參數中,第一個座標代表轉軸,例如輸入 vector.up,後面則可以旋轉角度,例如5度,當我們輸入上述這兩者,代表函式每執行一次,這個物件就會以Y軸為軸心,旋轉5度。

2. Transform.RotateAround
  這是以某個點為圓心,繞著它旋轉,相當於星球的周轉,其需要一個點座標作為圓心,一個旋轉的軸向,一個旋轉的角度。

RotateAround(Vector3 point, Vector3 axis, float angle)
  在這個函式中,我們可以輸入一個點座標、軸向、角度,這樣物件就會以點座標為中心,以某個軸向為基準,每次執行都轉動一次度數。

RotateAround(Vector3 point, Vector3 axis, float angle, Space)
  在這個函式中,多出了一個旋轉空間,可以讓這個旋轉的座標屬於世界座標或當地座標,。

RotateAround(Transform target, Vector3 axis, float angle)
  在這個函式中,則可以抓取一個座標系統,我推測這個會比較適合移動型的座標,可以比較節省資源。

3. Transform.LookAt
  這個函式都很簡單,就是面對某個座標點,不過這個座標對象可以是一個座標系統,也能是一個世界座標,其中WorldUp是在面對後進行微調,屬於非必須的選擇。

LookAt(Transform target, [Vector3 worldUp])
  在這個函式中,座標是一個當地座標系統,該物件會面向這個目標。

LookAt(Vector3 worldPosition, [Vector3 worldUp])
  在這個函式中,座標是一個世界座標,該物件會面向這個目標。

LookAt(Transform target, Vector3 worldUp, bool isLocal)
  在這個函式中,跟第一個函式一樣,不過 WorldUp 參數為必填,並且會需要註記是否為當地座標。

四、物理旋轉與座標旋轉
  大多數時候,遊戲僅需要使用座標旋轉,物理旋轉的效能消耗更多,許多功能也不需要物理效果,有一個比較容易理解的方式,如果遊戲很注重遊戲碰撞後的物理效果模擬,則使用物理旋轉較為合適。

1. 運用座標系統旋轉
  似乎大多數的遊戲,雖然有使用物理系統,不過這些遊戲的旋轉依然使用座標系統,這可能是因為旋轉相對於移動來說較為簡單,不會有太複雜的資訊或注意事項。

2. 物理系統的矩陣
  因此可以推測,如果要使用物理系統來旋轉,則可能用於模擬器或需要更擬真的物理系統,連旋轉都要使用物理系統的旋轉。

3. 物理與座標的差異
  他們之間最大的差異,在於受到外力影響受的改變,如果是正在運作的座標系統,受到外力後不會改變,物理系統則是擁有更複雜的計算,因此能邊進行旋轉邊受力。

五、後記
  原本我打算用一篇文章結束旋轉的部份,結果從早上測試到晚上,了解到了許多旋轉的知識,從三維座標到四元數、單次執行與每幀執行、平滑旋轉直接旋轉,甚至旋轉的軸向、座標空間都會影響,旋轉真是複雜阿。

送禮物贊助創作者 !
0
留言

創作回應

相關創作

更多創作