2017-01-06 31 views
2

對於與歐拉角相關的Unity的某些文檔,我有點困惑。我只想知道,如果我不瞭解差異,或者樣本不符合最佳做法。文檔here 指出:將歐拉角增加到360度以上

只能使用此變量讀取並將角度設置爲絕對值。不要增加它們,因爲當角度超過360度時它會失敗。改用Transform.Rotate。

同時,代碼示例似乎使用增量可能超過360度:

using UnityEngine; 
using System.Collections; 

public class ExampleClass : MonoBehaviour { 
    public float yRotation = 5.0F; 
    void Update() { 
     yRotation += Input.GetAxis("Horizontal"); 
     transform.eulerAngles = new Vector3(10, yRotation, 0); 
    } 
    void Example() { 
     print(transform.eulerAngles.x); 
     print(transform.eulerAngles.y); 
     print(transform.eulerAngles.z); 
    } 
} 

會不會增加一個變量,然後使用該變量絕對設定值仍然可以運行的風險超過360度,如果變量超過360度?

+0

我認爲這個例子是一個特殊的例子,它可以無限增加y,因爲y是定期修改的唯一座標軸,而x和z保持爲常數。 如果所有座標軸都可能是可修改的,當您的eulers在360度左右交換時,遞增y可能會導致問題。您甚至可能進入萬向節鎖定狀態。我想這就是爲什麼使用Transform.Rotate的原因。 –

回答

1

有差異。當這樣做的:

transform.eulerAngles.y += 1F; 

要調用的+=運營商Vector3

但是,當您設置eulerAngles這樣:

float newY = transform.eulerAngles.y + 1F; 
transform.eulerAngles = new Vector3(.., newY, ..); 

要調用在Transform一個二傳手,這裏面的setter,它可能包括更新Transform.rotation的作用。

不同之處在於Unity可以實現Transform類中的更新邏輯,而不是Vector3類,這在這裏更有意義。

我們所用的documentation下面進一步驗證:

不要設置爲:eulerAngles軸中的一個分別;因爲這將導致漂移和不希望的轉動(例如eulerAngles.x = 10)。當 將它們設置爲新值時,將它們全部設置爲一次,如上所示。 統一 將轉換存儲在 Transform.rotation中的旋轉角度。

+1

這裏添加的幾件事情是,這僅適用於Javascript。另外,爲了解決這個問題,你實際上可以這樣做:'transform.eulerAngles.y + = yRotation%360;'。你不應該只知道周圍的工作。 – Programmer

+0

@程序員你的意思是'transform.eulerAngles.y + = 1F'在c#中安全地工作? :O – Lincoln

+0

不會。它不會編譯。這是C#的保護。這將在Javascript中編譯,你會得到在文檔中提到的問題。 – Programmer

2

當您使用歐拉角度旋轉對象時,當它達到360並嘗試超過更遠時,它將變爲(減)-360並逐漸從-359增加到-1。

執行以下代碼後,您的值不會超過360,並且會保持爲正值。

float rotateAngle = rotateObject.transform.localEulerAngles.y; 
// Convert negative angle to positive angle 
rotateAngle = (rotateAngle > 180) ? rotateAngle - 360 : rotateAngle; 
rotateObject.transform.localEulerAngles = new Vector3(rotateObject.transform.localEulerAngles.x, rotateAngle, rotateObject.transform.localEulerAngles.z); 
+0

謝謝,我明白你的意思,但是來自doc的示例代碼仍然冒着超過360的風險? – tchock