Unity 中的旋轉和朝向

2021-10-02 09:23:04 字數 1795 閱讀 3466

動畫中

unity中的旋轉,通常用四元數和尤拉角來表示。它們都有優缺點。unity內部用四元數,在inspector中顯示尤拉角形式,因為該方法已於理解和編輯。

尤拉角由按照順序在x,y,z軸上進行的旋轉表示,當將乙個尤拉角應用到乙個gameobject時,每個軸上的旋轉都會被分別應用。

四元數可以被用來表示旋轉或物件的朝向。該數學模型,用4個數來表示(x,y,z,w),然而這些數字既不表示旋轉軸,也不表示旋轉角度,無法理解,所以我們不能直接修改xyz分量的值(w表示角度,可能會發生錯誤。除非你非常了解這背後的數學原理。

小秘密:軸和角度藏在四元數中。假設沿著軸(nx,ny,nz)旋轉,角度為a度,則四元數為:

[w, x, y, z] = [cos(a/2), sin(a/2)nx, sin(a/2)ny, sin(a/2)nz]

vector3可以表示位置和方向(當表示方向時,時原點在000點),乙個四元數可以表示朝向和旋轉,當表示旋轉時,是從identity開始的旋轉。四元數不能表達超過180度的旋轉。

unity用四元數來儲存gameobject的旋轉,因為四元數更加健壯。

但是在inspector面板上,顯示的旋轉是用尤拉角來表示的,因為尤拉角是可讀可編輯的。

[外鏈轉存失敗,源站可能有防盜煉機制,建議將儲存下來直接上傳(img-1kdbpy1x-1580048145871)(

所以,可以看到,如果我們可以在inspector中設定x:0,y:365,z:0來設定物件的旋轉,因為四元數無法表達該旋轉,因此,啟動遊戲後,會變成x:0,y:5,z:0。效果相同。

當在指令碼中處理旋轉時,應該用四元數來建立或修改旋轉值。當然有些情況下,使用尤拉角也是有效的,但是要牢記,要使用四元數介面來處理尤拉角,從四元數獲取,修改,重新應用尤拉角到四元數,可能會產生錯誤的結果。

unity提供了介面,用來建立和操作四元數,而且不需要尤拉角的參與。例如

建立操作

尤拉角使用注意

然而,有時我們希望在**中使用尤拉角,這時,要將角度儲存到自己定義的變數中,並且用這些變數更新旋轉。因為以獲取->修改->應用尤拉角的流程寫**,會出錯,因為每次取得的尤拉角,是臨時從四元數計算出來的,每次計算可能返回不同的尤拉角,可能會導致萬向鎖問題。

// 正確

float x;

void update (

)// 錯誤

void update (

)

很多3d創作外掛程式,以及unity內部,都有自己的動畫視窗,來用尤拉角編輯動畫的旋轉。

這些旋轉,經常超過四元數表達的範圍,比如旋轉720度,尤拉角是沒問題的,但是對於四元數來說,等於沒有旋轉。

unity內部的動畫編輯視窗,提供了設定選項,來決定如何進行插值,用四元數或尤拉角。通過指定使用尤拉角,可以告訴unity我們想要在完整的運動範圍內插值。如果用四元數,則會限制在限定的範圍內(-180,180),並用四元數插值。

匯入的外部動畫資源,檔案通常會使用尤拉角記錄旋轉。預設unity會重新進行取樣動畫生成新的四元數動畫幀,以避免旋轉超出四元數有效範圍。

例如,想象有2幀動畫,相隔6幀。第一幀旋轉x=0,第二幀(6幀後)旋轉是270。如果直接用四元數在這兩幀之間進行插值,則動畫會沿著最短路徑旋轉,即向相反方向旋轉90度。但是通過重新取樣,將旋轉定義為6幀,沒幀是45度,這樣在進行四元數插值時,就正確了。

有時候,通過重新取樣,也不能達到跟原始動畫完全重合,這時,可以在動畫匯入設定中,關閉重新取樣選項(resample curves),在執行時使用尤拉角進行插值。

Unity 2D中UI隨滑鼠旋轉朝向滑鼠

詳細教程 1 canvas的render mode的三種模式介紹 1.screen space overlay可以理解為unity為你自動設定好了uicamera,而且這個相機的depth值是大於100的 相機能設定的最大depth值為100 2.screen space camera 將ui渲染在...

Unity程式設計 Unity中的尤拉旋轉

是z 軸與z 軸的夾角,是交點線與x 軸的夾角。xyz代表了三個角度,它們定義了一組有序的旋轉,即圍繞z軸旋轉z度,然後圍繞x軸旋轉x度,然後圍繞y軸旋轉y度。你應該只去讀取或者直接設定這些數值,不要增加它們,因為當角度超過360度將會失敗。應該使用transform.rotate去替代執行旋轉操作...

簡單聊聊 Unity中的 旋轉

今天來系統的學習一下unity中的幾種旋轉以及相應的一些經常用到的函式 我們平時看到的tranform裡的角就是尤拉角 這是尤拉角。這三個分量分別是繞x軸 y軸 z軸旋轉的角度。transform.rotate 軸,space.self 以自身座標係為參考 transform.rotate 軸,sp...