2015-12-14 75 views
3

我正在構建一種依靠原始陀螺儀讀數的遊戲。我使用下面的代碼獲取讀數(我使用C#):使用Unity3D API瞭解陀螺儀讀數

void Start() { 
    Input.gyrometer.enabled = true; 
} 

void Update() { 
    _guiText = Input.gyrometer.attitude.eulerAngles.ToString(); 
} 

我在OnGUI()方法在屏幕上顯示的值。當我使用Unity時,我使用的是右手座標系,我注意到來自陀螺儀的Y值對應於Unity中的X旋轉。

問題是這些值大量跳躍。例如,我可以將設備保持在X:90°,並緩慢旋轉Y軸;在某個點(270°左右)之後,X會突然翻轉180°。然而,這意味着如果我在Y設備處於270°時啓動應用程序,則X讀數將完全無法使用。 Z軸也會發生同樣的效果。

我設法通過使用下面的代碼片斷重置陀螺儀讀數,以避開這個在iOS設備上:依次Input.gyro.enabled = true;Input.gyro.enabled = false;我用這個來獲得設備的絕對旋轉的精確讀數,然後我用旋轉變化來得到任何其他設備移動。但是,這在Android上不起作用。

有沒有人遇到過這個?如果是這樣,你是如何得到它或者是一個無法解決的錯誤?

+0

歐拉角始終不可靠(正如@fafase在他的回答中所述)。改爲使用四元數。我甚至會避免Quaternion.Angle。要了解歐拉角度有多危險,請查看維基百科關於[Gimbal Lock]的文章(https://en.wikipedia.org/wiki/Gimbal_lock) – Kay

+0

Hi @Kay。我知道Gimbal Lock我將四元數轉換爲歐拉,編輯歐拉然後轉換回四元數。這仍然會導致問題嗎? –

回答

1

這是因爲您正在閱讀四元數的轉換。 Unity中的歐拉角度只是一種友好的方式,可以獲得V3難以掌握的東西。建議不要直接影響eulerAngles以及使用它們作爲參考。相反,將平板設備視爲一次旋轉,然後開始獲取默認旋轉和當前旋轉之間的角度,並使用該值來定義您的操作。

您可以爲此使用Quaternion.Angle。

+0

謝謝。我在我的代碼中刪除了對eulers的任何引用,並查看它是否解決了它。 –

+0

這會讓事情變得更難以調試和理解,因爲你在3D中沒有更多的工作,但是在4D中。這是直到你意識到你不需要完全理解正在發生的事情,只是爲了瞭解如何使用它以及期待什麼。這並不意味着你不應該閱讀有關四元數的知識,但是這個話題是相當深入和先進的。 – Everts

+0

我已經可以使用四元數了,因爲正如你所說的,eulers簡單得多。只是爲了澄清,如果我想旋轉陀螺儀-90左右的代碼將是:'四元數旋轉= Input.gyro.attitude *新的四元數(1,0,0, - (Mathf.PI/2.0f) );'? –