一、前言
這篇文章將會講述平滑的旋轉與單次旋轉的差異,並介紹旋轉的兩種體系與其使用效果,並提供參考的示範影片。
二、單次旋轉與平滑旋轉
在上一篇文章中,我們學會了常見的旋轉,介紹了旋轉的基本知識,分享旋轉的多載函式,並分析物理旋轉與座標旋轉的差異,有興趣可以去參考上一篇文章,接下來這邊會講述單次與平滑的差異,並介紹兩種旋轉體系。
1. 單次旋轉的效果
在程式腳本(Script)中,單次執行一次旋轉,會直接從現在的位置到達終點位置,不會有中間的動畫,會以順時針的方向旋轉,在設計上,這種旋轉方式會直接完成,因此會有很強烈的回饋感,可以進行很精確的操作。
2. 平滑旋轉的效果
當我們在製作注重美術的遊戲時,平滑旋轉則是重中之重,優秀且經過設計的旋轉提供了良好的視覺效果,並且玩家不會感受到突兀,能很好的沉浸在遊戲設計師所創造的世界中。
3. 旋轉的兩種體系
在 Unity 的引擎中,有兩種旋轉體系,第一種是以歐拉角(Euler Angles)的座標變換(Transform)體系;第二種是以四元數(Quaternion)體系。
前者方便易懂好使用,後者複雜詳細不易錯;在歐拉角中,在軸靠得很近時會出現萬象鎖的問題,並且在資源上消耗較大,因為要重新計算;而四元數的體系就沒這個問題了,而且比較節省資源。
三、歐拉角(Eluer Angles)-簡易的旋轉
雖然歐拉角看起來有不少問題,不過他還是很常使用,最主要的問題是因為使用難度低、程式碼數量少,只要避開複雜的旋轉,僅用於簡單的旋轉,那歐拉角完全沒問題。
因為前一篇文章已經撰寫過歐拉角的旋轉的旋轉函式如何使用,這篇文章將會搭配影片並分享使用與觀察體驗,提出在遊戲設計中值得使用的內容。
1. Transform.Rotate()
從影片中可以看到,這種旋轉方式並沒有太大的問題,如果每一個影格旋轉一格看起來太突兀,可以改變成每一個影格轉動半格,也因此可以理解為何這會是最常被使用的旋轉函式了。
2. Transform.RotateAround
這個旋轉還包含了座標的轉換,不過它主要是以某個點為圓心公轉,可以用行星公轉來比喻,只要我們決定好點與公轉速度,它就會開始旋轉了。
3. Transform.LookAt
這個函式的功能是看向某一個目標,在影片中,搭配上一個公轉函式,能很好的呈現這兩個函式的效果,也就是追蹤某個目標,並強硬的看向對像。
四、四元數(Quaternion)-複雜的旋轉
我至今還沒完全搞懂四元數的插值使用方式,不過這邊將會把他們的一些函式的使用方式分享出來,有興趣的也可以到官網上查看。
我在接觸到 Vector3 的 Lerp 時到是有稍微搞懂,它是一個比較像從A點到B點之間把所有狀態提取出來,有一個插值比例,接近A的比例為0,接近B的比例為1,而 Lerp 與 Slerp 的差別在於,這條線是一個直線還是曲獻。
1. Quaternion.Lerp
這個函式需要三個參數:起始四元數、目標四元數和插值比例(t)。插值比例的範圍在0到1之間,0代表完全使用起始四元數,1代表完全使用目標四元數。
Quaternion Lerp(Quaternion a, Quaternion b, float t);
2. Quaternion.Slerp
這個函式需要三個參數:起始四元數、目標四元數和插值比例(t),跟前面的 Lerp完全相同。在我找到的教學中,若使用 Slerp 的話,在旋轉的過程中會保持同樣的轉速,保持曲線旋轉的平滑性。
Quaternion Slerp(Quaternion a, Quaternion b, float t);
3. Quaternion.RotateTowards
這個函式用於將一個四元數逐漸旋轉到另一個四元數,它接受三個參數:當前四元數、目標四元數、最大旋轉角度。最大旋轉角度指定了每次旋轉的最大幅度。通過調整最大旋轉角度,就可以控制旋轉速度和平滑度。
Quaternion RotateTowards(Quaternion from, Quaternion to, float maxDegreesDelta);
五、後記
原本我式打算把兩種旋轉方式都弄出來,不過在 Lerp 上面我卡住非常久,直到一段時間後我觀看 Youtube 的影片才稍微了解。