[英]How to Copy Transform.rotation over Network (byte[]) in unity?
[英]Edit or not the Transform.rotation in unity3D
在統一文檔中,在Transform.rotation下寫入:
請勿嘗試編輯/修改旋轉。
但是在該示例中,使用賦值之后的幾行transform.rotation = ...
並且直接設置transform.rotation
似乎是日常實踐。
但是可以推薦嗎? 那么其他屬性(例如localRotation
)又如何實現rotation
屬性的設置器,以便也更改localRotation?
transform.rotation的成分不是角度,因此不能作為角度來處理。
正如robertbu在本文中提到的:
許多輪換(很可能是您嘗試的輪換)可以通過其他(更簡單的)方法來完成,包括'Transform.Roate()'和直接訪問'Transform.eulerAngles'-。
Transform.Rotate()-Rotate()進行相對旋轉,默認情況下進行局部旋轉。
他們不編輯/修改旋轉的意思是,旋轉是一個統一的內置類,可以處理對象的旋轉。 因此,可以像這樣隨意設置對象的旋轉:
Transform.rotation = object.transform.rotation;
但是不建議修改內置的旋轉類。
我覺得文檔中關於此的措詞曾經更加清晰,但這就是它的含義:
我們強烈勸阻編輯transform.rotation
直接對象。 也就是說執行諸如transform.rotation = new Quaternion(0, 100, 15, 1);
除非您真的了解使用四元數的來龍去脈,這要比使用EulerAngles更加困難,因為后者更加人性化和易於理解。
您應該使用的替代方法(這也反映在文檔的代碼示例中)是Unity提供的用於更改旋轉方式的方法。 這些方法將為您解決因改變四元數值而帶來的復雜性。
如果我們仔細看看Unity提供的代碼示例:
Quaternion target = Quaternion.Euler(tiltAroundX, 0, tiltAroundZ);
transform.rotation = Quaternion.Slerp(transform.rotation, target, Time.deltaTime * smooth);
這里的兩個關鍵因素是target = Quaternion.Euler()
,它采用三個歐拉角(360度標度的角度)並將它們轉換為四元數。 另一個是rotation = Quaternion.Slerp()
,它將當前旋轉作為四元數,將目標旋轉作為四元數並在兩者之間進行插值。
請注意,這兩個函數都沒有從您的側面“直接”改變transform.rotation
,但是它們都通過了Unity的內部邏輯以轉換為適當的四元數。
像transform.Rotate
這樣的方法也是如此。
transform.localRotation
基本上與transform.rotation
相同。 唯一的區別是,前者表示相對於父級的旋轉,而后者表示相對於父級的旋轉。
如果要直接編輯對象的旋轉,最簡單的方法是編輯對象的EulerAngles。 一個例子是:
transform.localEulerAngles = new Vector3(10, 150, 0);
相對於父對象,對象將繞X軸旋轉10度,並沿Y軸旋轉150度。 使用transform.eulerAngles
可以相對於世界旋轉它。
請注意,盡管這是解決問題的最簡單方法。 Unity確實鼓勵使用Quaternions類及其函數來應用旋轉,因為使用Euler角會導致發生怪異的效果。
該文檔中還討論了Unity中的旋轉和方向 ,並指出(強調我的意思):
四元數可用於表示GameObject的方向或旋轉。 該表示法內部包含四個數字(在Unity中稱為x,y,z和w), 但是這些數字並不表示角度或軸,因此通常不需要直接訪問它們 。 除非您對四元數的數學特別感興趣,否則您只真正需要知道四元數表示3D空間中的旋轉,並且通常不需要知道或修改x,y和z屬性。
Unity使用四元數的原因尤其是,四元數不會受到萬向節鎖定的影響 ,而eulerAngles會遭受這種損害。 我引用這篇文章:
Unity將所有GameObject旋轉內容內部存儲為四元數,因為這樣做的好處超過了限制。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.