2016-08-19 86 views
0

我需要旋轉一個物體以相對於現實世界進行精確的旋轉。因此調用Input.gyro.attitude將返回一個表示設備位置的四元數。另一方面,這迫使我根據這個四元數計算每一個旋轉作爲默認旋轉。 一種簡單的方法來設置朝上將是以下一些對象:Unity c#四元數:用z軸交換y

Vector3 up = Input.gyro.attitude.eulerAngles; 
... 
transform.rotation = Quaternion.Euler(up.x, up.y, up.z); 

此旋轉up.z圍繞Z,然後圍繞x up.x,和up.y圍繞y。

我的問題是,座標系不太正確,在我的應用程序中,交換了y和z軸(我使用Vuforia,所以它總是相對於標記),這意味着圍繞z的旋轉導致繞y旋轉,反過來。這裏事情變得困難:顯然

transform.rotation = Quaternion.Euler(up.x, up.z, up.y); 

失敗,因爲這還是第一次旋轉圍繞Z的,但現在up.y。正確的順序是創建一個旋轉,首先圍繞y旋轉,然後是x,然後是z。

由於歐拉角是從四元檢索,

transform.rotation = Quaternion.identity; 
    transform.Rotate(0, up.eulerAngles.z, 0); 
    transform.Rotate(up.eulerAngles.x, 0, 0); 
    transform.Rotate(0, 0, up.eulerAngles.y); 

不會工作,當然。

但是,我找不到辦法做到這一點。我可以忽略一些東西嗎

回答

0

我相信你應該能夠按照你想要的順序將一系列調用乘以Quaternion.AngleAxis。必須嘗試一些像這樣的東西?

transform.rotation = Quaternion.identity * 
    Quaternion.AngleAxis(up.eulerAngles.y, Vector3.up) * 
    Quaternion.AngleAxis(up.eulerAngles.x, Vector3.forward) * 
    Quaternion.AngleAxis(up.euelerAngles.z, Vector3.right); 
+0

謝謝,那個人做到了!四元數是一個痛苦的處理... –