2

私は2Dゲームを作っています。電話は水平に保持され、キャラクターは障害物を避けるために上下左右に移動します。キャラクターは携帯電話の加速度計によって制御されます。(0,0)プレイヤーが(キャラクターが静止しているポイント)電話が完全に平らに保持されていることを気にしない場合は、すべてが正常に機能します。このシナリオでは、Y値とX値を直接読み取り、それらを使用して文字を制御することができます。加速度計の値は-10から10の間(キャラクターの移動速度を決定するために加速度定数を掛けたもの)でlibgdxあり、使用されるフレームワークです。

問題は、持っていること(0,0)があまり快適ではないということです。そのため、特定の時点で0,0が電話の位置に設定されるように調整することをお勧めします。

それは私の質問に私をもたらします、私はこれをどのように行うのですか?現在のX値とY値を読み取って、それを減算してみました。それに関する問題は、電話が90度の角度で保持されている場合、Xオフセット値が10(最大値)であり、値が10()を超えることはないため、移動できなくなること10-10 = 0です。どういうわけか、ここでZ軸が機能する必要がありますが、どうすればよいかわかりません。

助けてくれてありがとう、私はできる限り説明しようとしました、私は解決策を探してみました、しかし私は私が探しているもののための適切な用語が何であるかさえ知りません。

4

2 に答える 2

1

古い質問ですが、AndroidまたはLibGDXの適切な回答がどこにも見つからなかったため、ここで回答を提供します。以下のコードは、誰かがiOS用に投稿したソリューションに基づいています(申し訳ありませんが、参照を失いました)。

これは3つの部分で行うことができます。

  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]
        ...
    }
    
于 2014-03-06T13:27:33.917 に答える
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(...)ただし、範囲に注意する必要があります。範囲内にある-Piと思いますPi

うまくいけば、それはあなたが何とか始められるようになるでしょう。「ピッチ/ロール/回転する加速度計」なども検索できます。

于 2012-03-14T22:19:15.057 に答える