2012-03-14 41 views
2

我正在製作2D遊戲。手機水平放置,角色向左/向右上移/下移&以避開障礙物。該角色由手機上的加速計控制。如果玩家不介意(0,0)(角色靜止不動),那麼一切都可以正常工作。在這種情況下,可以直接讀取Y和X值並使用它們來控制字符。加速度計的值在-10到10之間(它們乘以加速度常數以決定字符的移動速度),libgdx是使用的框架。爲2D遊戲校準3D加速度計

問題是,有(0,0)不是很舒服,所以這個想法是校準它,以便0,0將被設置爲在特定時間點的手機位置。

這使我想到我的問題,我該怎麼做?我試着讀取當前的X和Y值,然後減去它。問題在於,當手機保持在90度角度時,X偏移值爲10(這是最大值),因此最終無法移動,因爲該值永遠不會超過10(10-10 = 0)。 Z軸必須在這裏發揮作用,我只是不知道如何。

感謝您的幫助,我試着盡我所能解釋,我嘗試尋找解決方案,但我甚至不知道我所尋找的東西是什麼。

回答

0

一個古老的問題,但我在這裏提供了答案,因爲我找不到任何地方的Android或LibGDX的好答案。下面的代碼基於iOS發佈的解決方案(對不起,我已經失去了參考)。

可以在三個部分做到這一點:

  1. 捕獲表示中立方向的矢量:

    Vector3 tiltCalibration = new Vector3( 
          Gdx.input.getAccelerometerX(), 
          Gdx.input.getAccelerometerY(), 
          Gdx.input.getAccelerometerZ()); 
    
  2. 變換這個載體導入旋轉矩陣:

    public void initTiltControls(Vector3 tiltCalibration) { 
        Vector3.tmp.set(0, 0, 1); 
        Vector3.tmp2.set(tiltCalibration).nor(); 
        Quaternion rotateQuaternion = new Quaternion().setFromCross(Vector3.tmp, Vector3.tmp2); 
    
        Matrix4 m = new Matrix4(Vector3.Zero, rotateQuaternion, new Vector3(1f, 1f, 1f)); 
        this.calibrationMatrix = m.inv(); 
    } 
    
  3. 無論何時您需要加速度計的輸入,首先運行它們通過旋轉矩陣:

    public void handleAccelerometerInputs(float x, float y, float z) { 
    
        Vector3.tmp.set(x, y, z); 
        Vector3.tmp.mul(this.calibrationMatrix); 
    
        x = Vector3.tmp.x; 
        y = Vector3.tmp.y; 
        z = Vector3.tmp.z; 
    
        [use x, y and z here] 
        ... 
    } 
    
0

對於一個簡單的解決方案,你可以看一下方法:

Gdx.input.getAzimuth(), Gdx.input.getPitch(), Gdx.input.getRoll() 

的缺點是,那些以某種方式使用內部羅盤,讓您的設備旋轉相比,北/南/東/西。我很快就做了測試,所以我不是100%確定的。也許值得一瞧。

更復雜的方法涉及到一些三角,基本上你必須計算手機的角度從Gdx.input.getAccelerometerX/Y/Z()。一定是這樣的(沿手機的長邊旋轉):

Math.atan(Gdx.input.getAccelerometerX()/Gdx.input.getAccelerometerZ()); 

對於這兩種方法,那麼你存儲初始角,後來就再減去它。你必須留意的範圍,但我認爲Math.atan(...)是在-PiPi

希望這會讓你以某種方式開始。您也可以搜索「加速度計到俯仰/滾動/旋轉」等。