2012-04-24 9 views
15

こんにちは私はAndroid用の3Dゲームを構築しています。アンドロイド方位センサーの代替手段は何ですか?

現在、ゲームにセンサーを追加して、アンドロイドをコントロールとして傾けることを可能にしています。

理想的には、オリエンテーションセンサーを使用したいと考えていますが、非推奨になっています。誰もがアンドロイドの傾きを検出する方法を知っていて、このセンサーを使用していませんか?

答えて

41

実際の「向き」センサーはありません。実際には、加速度センサーと磁力計の組み合わせから生成された複合センサーです。 http://developer.android.com/reference/android/hardware/SensorEvent.html

から

は「このセンサタイプは、レガシーの理由のために存在し、代わりにこれらの値を計算するためにremapCoordinateSystem()getOrientation()と一緒にgetRotationMatrix()を使用してください。」

public class OrientationTestActivity extends Activity implements SensorEventListener 
{ 
    private SensorManager mSensorManager; 
    private Sensor mAccelerometer; 
    private Sensor mMagnetometer; 

    private float[] mLastAccelerometer = new float[3]; 
    private float[] mLastMagnetometer = new float[3]; 
    private boolean mLastAccelerometerSet = false; 
    private boolean mLastMagnetometerSet = false; 

    private float[] mR = new float[9]; 
    private float[] mOrientation = new float[3]; 

    @Override 
    public void onCreate(Bundle savedInstanceState) 
    { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 

     mSensorManager = (SensorManager)getSystemService(SENSOR_SERVICE); 
     mAccelerometer = mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER); 
     mMagnetometer = mSensorManager.getDefaultSensor(Sensor.TYPE_MAGNETIC_FIELD); 
    } 

    protected void onResume() { 
     super.onResume(); 
     mLastAccelerometerSet = false; 
     mLastMagnetometerSet = false; 
     mSensorManager.registerListener(this, mAccelerometer, SensorManager.SENSOR_DELAY_NORMAL); 
     mSensorManager.registerListener(this, mMagnetometer, SensorManager.SENSOR_DELAY_NORMAL); 
    } 

    protected void onPause() { 
     super.onPause(); 
     mSensorManager.unregisterListener(this); 
    } 

    public void onAccuracyChanged(Sensor sensor, int accuracy) { 
    } 

    @Override 
    public void onSensorChanged(SensorEvent event) { 
     if (event.sensor == mAccelerometer) { 
      System.arraycopy(event.values, 0, mLastAccelerometer, 0, event.values.length); 
      mLastAccelerometerSet = true; 
     } else if (event.sensor == mMagnetometer) { 
      System.arraycopy(event.values, 0, mLastMagnetometer, 0, event.values.length); 
      mLastMagnetometerSet = true; 
     } 
     if (mLastAccelerometerSet && mLastMagnetometerSet) { 
      SensorManager.getRotationMatrix(mR, null, mLastAccelerometer, mLastMagnetometer); 
      SensorManager.getOrientation(mR, mOrientation); 
      Log.i("OrientationTestActivity", String.format("Orientation: %f, %f, %f", 
                  mOrientation[0], mOrientation[1], mOrientation[2])); 
     } 
    } 
} 
+0

他のセンサーと同じように、イベントハンドラのようにgetOrientation()コマンドを使用する方法はありますか? – user1207381

+4

getOrientation()関数には、磁気センサーと加速度センサーの両方の値が必要なgetRotationMatrix()の値が必要です。したがって、これら2つのセンサーのセンサーリスナーを設定し、それらの値をキャッシュします。そして、いずれかのセンサの新しいデータを取得したときに向きを再計算することができます。 – JesusFreke

+0

これらのメソッドを一緒に使用する方法のサンプルコードはありますか?私はこれらの方法を一緒に使うことはできませんでした。 – user1207381

関連する問題