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

更新於 發佈於 閱讀時間約 5 分鐘

一、前言

  這篇文章將會講述常見的座標(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. 物理與座標的差異

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

五、後記

  原本我打算用一篇文章結束旋轉的部份,結果從早上測試到晚上,了解到了許多旋轉的知識,從三維座標到四元數、單次執行與每帧執行、平滑旋轉直接旋轉,甚至旋轉的軸向、座標空間都會影響,旋轉真是複雜阿。
為什麼會看到廣告
avatar-img
106會員
247內容數
對設計師如何成長為設計師好奇嗎? 2020年九月,我進入大學學習當一位設計師,從開始到沉寂,再到重燃熱忱,我將在方格子紀錄我的成長歷程、理念、心情,分享我在這段旅程中所經歷的故事。
留言0
查看全部
avatar-img
發表第一個留言支持創作者!
瓶裝雪的沙龍 的其他內容
這篇文章將會講述設計模式中的狀態模式,其資料源自於書籍、網路、個人理解,從簡介→架構→撰寫→測試的整個流程進行介紹與分享。
這篇文章將會介紹建構式(Constructor),這是一個隱藏在程式腳本中的重要知識,我們極常使用建構式,但新手程式員幾乎不會知道它。
這篇文章將會講述 Unity Visual Effect Graph 的系統簡介,並且簡單介紹這項系統主線上的四個核心組件。
這篇文章將會講述子彈射擊與命中的思路,不包含實際程式設計。
一、前言   這篇文章將會簡單介紹物件導向的設計模式,以及學習這項技術需要有哪些先備知識,學習才會比較順利。 二、設計模式   在物件導向中,除了最基本的五大原則以外,其實還有一知名的概念,那就是設計模式(Design Pattern),它能運用到很多層面。 1. 解決一再出現的問題   許多程式設
這篇文章將會講述最近的一個程式設計體悟,並且分享近期要參加的獨立遊戲製作者聚會,會展示課程的其中一個作品。
這篇文章將會講述設計模式中的狀態模式,其資料源自於書籍、網路、個人理解,從簡介→架構→撰寫→測試的整個流程進行介紹與分享。
這篇文章將會介紹建構式(Constructor),這是一個隱藏在程式腳本中的重要知識,我們極常使用建構式,但新手程式員幾乎不會知道它。
這篇文章將會講述 Unity Visual Effect Graph 的系統簡介,並且簡單介紹這項系統主線上的四個核心組件。
這篇文章將會講述子彈射擊與命中的思路,不包含實際程式設計。
一、前言   這篇文章將會簡單介紹物件導向的設計模式,以及學習這項技術需要有哪些先備知識,學習才會比較順利。 二、設計模式   在物件導向中,除了最基本的五大原則以外,其實還有一知名的概念,那就是設計模式(Design Pattern),它能運用到很多層面。 1. 解決一再出現的問題   許多程式設
這篇文章將會講述最近的一個程式設計體悟,並且分享近期要參加的獨立遊戲製作者聚會,會展示課程的其中一個作品。
你可能也想看
Google News 追蹤
Thumbnail
嘿,大家新年快樂~ 新年大家都在做什麼呢? 跨年夜的我趕工製作某個外包設計案,在工作告一段落時趕上倒數。 然後和兩個小孩過了一個忙亂的元旦。在深夜時刻,看到朋友傳來的解籤網站,興致勃勃熬夜體驗了一下,覺得非常好玩,或許有人玩過了,但還是想寫上來分享紀錄一下~
介紹以物件導向的方式,以向量來實作物體運動的模擬程式。
Thumbnail
首先是Y-Δ轉換口語的念法,筆者習慣稱為Y-Delte轉換,直接以英文發音為主;而它還有個中文名稱為星角轉換,也就是星形跟三角形轉換。 這是一份筆者常常使用的小工具,用來快速調整Y接或Δ接馬達設計變換時,線圈繞線條件的更改;但作為馬達設計者而言,是絕不需要考慮的Δ接設計方案。主要是Δ接會在馬達的三
Thumbnail
ThreeJS ArcballControl呼叫update方法後,視角被翻轉問題的解決記錄
Thumbnail
直觀理解 導數:考慮的是單一變數的函數,描述的是函數在某點的斜率或變化率。 偏導數:考慮的是多變數函數,描述的是函數在某個變數變化時的變化率,其他變數保持不變。  (針對各維度的調整 或者稱變化 你要調多少) 應用 導數:在物理學中應用廣泛,例如描述速度和加速度。 偏導數:在多變量分析、優
Thumbnail
剩下兩週上課囉,大家加油!! 在一開始我們在課程完成了椅子(角色的移動嘛),但遠遠的看著他移動好像缺少了一些遊戲體驗 嗎?>< 這週我們就來改變遊戲的視角吧~~ 來看一下兩個版本的比較~~ 原本WASD AD控制Y軸旋轉(轉頭),後來改成WASD控制平移座標,把旋轉特別移出來到滑鼠上,
Thumbnail
上次我們完成用Unity 建完一張椅子,還有學習基本變數的應用,那我們就繼續寫更多的腳本來讓物體有更多的ㄅㄧㄢ #一般不會用Unity來建模啦,主要還是要靠其他3D軟體導入 ●Gravity Scale 重力預設為1,是造成物體下墜的主因,可以先調到0。 (Unity有支援負
Thumbnail
完成了Debug.log()的測試,接著還是要跟各位簡單講一下C#的一些規則,之後看程式會(比較)看得懂。 又講到變數? 在Unity中,變數是重要的工具,用來儲存和管理資料。讓開發者能夠靈活調整遊戲的行為和性能,減少代碼的重複性,使得遊戲開發更加高效和簡潔。透過使用變數,開發者可以輕鬆修改資料
Thumbnail
使用反三角函數鐘的反正切函數 math.atan2() 計算出兩個座標之間的角度。 實現方法 邊界的最大最小值,相減求得對邊,鄰邊由檢測ROI的寬或高,求得角度 定義旋轉方向性,由邊界最大最小值的座標位子得知,旋轉方向性 程式範例 利用圖中白色物體的上邊界兩個座標點位,算出物體旋轉角度。
Thumbnail
輪胎轉動是用spin還是rotate?繞圓環是用turn、circle還是cycle?芭蕾舞轉圈、轉陀螺、開車轉彎、轉方向盤、滑鼠的鼠標轉圈圈到底要用哪個英文字?circle和cycle哪裡不同?如果你被煩到暈了,這篇用超清楚的規則幫你一次搞定。
Thumbnail
嘿,大家新年快樂~ 新年大家都在做什麼呢? 跨年夜的我趕工製作某個外包設計案,在工作告一段落時趕上倒數。 然後和兩個小孩過了一個忙亂的元旦。在深夜時刻,看到朋友傳來的解籤網站,興致勃勃熬夜體驗了一下,覺得非常好玩,或許有人玩過了,但還是想寫上來分享紀錄一下~
介紹以物件導向的方式,以向量來實作物體運動的模擬程式。
Thumbnail
首先是Y-Δ轉換口語的念法,筆者習慣稱為Y-Delte轉換,直接以英文發音為主;而它還有個中文名稱為星角轉換,也就是星形跟三角形轉換。 這是一份筆者常常使用的小工具,用來快速調整Y接或Δ接馬達設計變換時,線圈繞線條件的更改;但作為馬達設計者而言,是絕不需要考慮的Δ接設計方案。主要是Δ接會在馬達的三
Thumbnail
ThreeJS ArcballControl呼叫update方法後,視角被翻轉問題的解決記錄
Thumbnail
直觀理解 導數:考慮的是單一變數的函數,描述的是函數在某點的斜率或變化率。 偏導數:考慮的是多變數函數,描述的是函數在某個變數變化時的變化率,其他變數保持不變。  (針對各維度的調整 或者稱變化 你要調多少) 應用 導數:在物理學中應用廣泛,例如描述速度和加速度。 偏導數:在多變量分析、優
Thumbnail
剩下兩週上課囉,大家加油!! 在一開始我們在課程完成了椅子(角色的移動嘛),但遠遠的看著他移動好像缺少了一些遊戲體驗 嗎?>< 這週我們就來改變遊戲的視角吧~~ 來看一下兩個版本的比較~~ 原本WASD AD控制Y軸旋轉(轉頭),後來改成WASD控制平移座標,把旋轉特別移出來到滑鼠上,
Thumbnail
上次我們完成用Unity 建完一張椅子,還有學習基本變數的應用,那我們就繼續寫更多的腳本來讓物體有更多的ㄅㄧㄢ #一般不會用Unity來建模啦,主要還是要靠其他3D軟體導入 ●Gravity Scale 重力預設為1,是造成物體下墜的主因,可以先調到0。 (Unity有支援負
Thumbnail
完成了Debug.log()的測試,接著還是要跟各位簡單講一下C#的一些規則,之後看程式會(比較)看得懂。 又講到變數? 在Unity中,變數是重要的工具,用來儲存和管理資料。讓開發者能夠靈活調整遊戲的行為和性能,減少代碼的重複性,使得遊戲開發更加高效和簡潔。透過使用變數,開發者可以輕鬆修改資料
Thumbnail
使用反三角函數鐘的反正切函數 math.atan2() 計算出兩個座標之間的角度。 實現方法 邊界的最大最小值,相減求得對邊,鄰邊由檢測ROI的寬或高,求得角度 定義旋轉方向性,由邊界最大最小值的座標位子得知,旋轉方向性 程式範例 利用圖中白色物體的上邊界兩個座標點位,算出物體旋轉角度。
Thumbnail
輪胎轉動是用spin還是rotate?繞圓環是用turn、circle還是cycle?芭蕾舞轉圈、轉陀螺、開車轉彎、轉方向盤、滑鼠的鼠標轉圈圈到底要用哪個英文字?circle和cycle哪裡不同?如果你被煩到暈了,這篇用超清楚的規則幫你一次搞定。