2013-02-15 88 views
3

我在PC上創建一個統一的應用程序,它可以讀取移動設備的方向,並根據手機與PC屏幕的角度旋轉游戲對象。現實世界物體之間的四元數差異 - > Unity

void Update() { 
    // Set main screen orientation when left trigger is pressed 
    if(leftPad.GetTrigger()) 
     mainScreenOrientation = InputState.orientation; 

    Quaternion delta = InputState.orientation * Quaternion.Inverse(mainScreenOrientation); 
    transform.localRotation = delta; 
} 

InputState.orientation是手機的方向,每幀更新一次。當用戶第一次啓動應用程序時,手機必須指向屏幕才能註冊mainScreenOrientation。

目前手機和PC屏幕方向之間的增量計算和遊戲對象的transform.localRotation

所有四元數與Y規定指向磁北設置,X指向東和z朝上 enter image description here

註冊後,遊戲對象的方向被正確設置爲標識,但是當旋轉手機時,對象似乎在錯誤的軸上旋轉。任何想法這有什麼問題?

編輯:

原來有與代碼

  1. 幾個問題傑羅姆提到的,方向有像手機在橫向模式下使用重新映射。

    Quaternion.Euler(0,0,90)* InputState.orientation

  2. 統一使用左手座標,同時由傳感器讀出的輸入是正確的。否定z轉換。

我沒有解決這個實現的最後一個問題是突然跳過旋轉超過某個角度。在水平線之上以橫向模式提升手機的高度會導致物體沿z軸旋轉90度。

不知道爲什麼會發生這種情況,因爲我只處理四元數,不應該有任何不連續性。

+0

90度的突然跳躍可能與Gimbal Lock有關。維基百科或在這裏搜索SO – Kay 2013-02-15 16:07:12

+0

由於沒有歐拉旋轉,不能是萬向節。甚至在我使用Quaternion.Euler(0,0,90)之前,這個問題就出現了,它返回一個四元數。 – Skul 2013-02-15 16:13:44

回答

1

您使用什麼傳感器?加速計或陀螺儀?

手機使用的軸可能是絕對的,因此可能需要根據設備方向重新映射,以便與Unity3D中的3D軸對齊。

根據縱向或橫向取向,可能需要切換y和x軸的可能性很大。

+0

我正在閱讀的實際傳感器是android [旋轉向量事件](http://developer.android.com/reference/android/hardware/Sensor。html#TYPE_ROTATION_VECTOR) – Skul 2013-02-15 12:54:16

+0

感謝您的幫助。結果發現代碼有多個錯誤。我已通過部分修復更新了該文章。 – Skul 2013-02-15 14:50:13

0

正如你使用歐拉,我認爲你必須調整過零線。例如根據你旋轉的方向增加或減少360.這對角度> 360並不重要,但我記得在Unity中遇到這個問題,因爲它不像負角度值。

+0

即使我不使用Quaternion.Euler(0,0,90)旋轉到橫向模式,問題仍然會發生。我的代碼中沒有任何euler旋轉,除非統一或android傳感器使用euler旋轉作爲其底層表示。 – Skul 2013-02-15 16:04:23

+0

然後我不確定問題是什麼,但我有一個預感,它與萬向節鎖定或通過零線有關。我會調試你的代碼並仔細檢查你的代碼給你的值,因爲數字永遠不會說謊! – Whiplash450 2013-02-15 16:17:31