2011-01-02 3 views
24

AndroidゲームMy Paper Planeは、どのようにチルトコントロールを実装するのかの素晴らしい例ですが、どのように似たようなことができるかを理解するために苦労しています。「My Paper Plane」のような傾斜制御にSensorManager.getOrientationを使用するにはどうすればよいですか?

次の例では、SensorManagerのgetOrientation()を使用しています。全体はpastebin hereです。これは、テキストフィールドに方向値を出力するだけです。ここで最も関連性の抜粋です。

private void computeOrientation() { 
    if (SensorManager.getRotationMatrix(m_rotationMatrix, null, 
             m_lastMagFields, m_lastAccels)) { 
     SensorManager.getOrientation(m_rotationMatrix, m_orientation); 

     /* 1 radian = 57.2957795 degrees */ 
     /* [0] : yaw, rotation around z axis 
     * [1] : pitch, rotation around x axis 
     * [2] : roll, rotation around y axis */ 
     float yaw = m_orientation[0] * 57.2957795f; 
     float pitch = m_orientation[1] * 57.2957795f; 
     float roll = m_orientation[2] * 57.2957795f; 

     /* append returns an average of the last 10 values */ 
     m_lastYaw = m_filters[0].append(yaw); 
     m_lastPitch = m_filters[1].append(pitch); 
     m_lastRoll = m_filters[2].append(roll); 
     TextView rt = (TextView) findViewById(R.id.roll); 
     TextView pt = (TextView) findViewById(R.id.pitch); 
     TextView yt = (TextView) findViewById(R.id.yaw); 
     yt.setText("azi z: " + m_lastYaw); 
     pt.setText("pitch x: " + m_lastPitch); 
     rt.setText("roll y: " + m_lastRoll); 
    } 
} 

問題は値が、これはナンセンスのような表情を出してくれる、あるいは少なくとも、ユーザーが実行される動きの種類を分離するための方法はありませんということです。私は私が検出したいという運動の2種類を示すために図を描いた - 1.「チルト」ピッチとロール/ステアリング2.「回転」のために:

Figure 1. Pitch and roll

(それはです

長軸に沿って電話を前後に傾けると(1で示されています)、値の1つだけがすべて変更されると予想しましたが、すべて彼らの劇的に変化するようです。同様に、スクリーンから出てくる想像上の線について電話を回転させると(2に示すように)、私はロールの値だけが変わることを望んでいますが、すべての値が大きく変化します。

現在の角度x、y、zの値を記録することを意味する私のゲームを調整するときに問題があります - 後で傾いているように見えるように、受信した更新された角度をどのように解釈するかわからない電話とあなたは3度左に回転したい "。これは、「電話に移行して、同じタイミングでやっている」というよりも、「意図がロールに過ぎない」場合でもそうです。理にかなっている?

アイデア?私はremapCoordinateSystemを使って、軸の変更が何らかの効果を持っているかどうかを調べてみました。喜びはありません。私はあなたがアクセルとmegneticセンサアレイを混入し、私はこの:-(

答えて

22

で基本的な何かが欠けていると思うのコードは次のようになります。

if (SensorManager.getRotationMatrix(m_rotationMatrix, null, 
            m_lastAccels, m_lastMagFields)) { 

チェックアウトgetRotationMatrix(..)

+0

まあが、それは恥ずかしかったです。私は、ここ数日、数週間で何時間も浪費してしまったことは分かりませんが、APIを意図した通りに使えば、もっとうまく動作します。 – richq

+0

感情を知って;)この種の問題では、目の第二のペアは本当に役立ちます。 –

+1

私はこの投稿には答えがあるようですが、ちょっと古いですが、ここであなたが探している本質的なものを書きました:[http://blog.samsandberg.com/2015/05/10 /tilt-for-android/](http://blog.samsandberg.com/2015/05/10/tilt-for-android/) - 誰かを助けることを願っています! –

関連する問題