2017-01-01 22 views
0

大きな画像を水平にスクロールするAndroidアプリを開発しています。私は回転角を得るために、加速度計(Sensor.TYPE_ACCELEROMETER)と磁場(Sensor.TYPE_MAGNETIC_FIELD)データを使用しました。このデータはノイズが頻繁に発生するため、スムーズなモーションエフェクトを実装することはできません。X軸に沿って携帯電話の角度を回転

@Override 
public void onSensorChanged(SensorEvent event) { 
    switch (event.sensor.getType()) { 
     case Sensor.TYPE_MAGNETIC_FIELD: 
      mags = event.values.clone(); 
      break; 
     case Sensor.TYPE_ACCELEROMETER: 
      accels = event.values.clone(); 
      break; 
    } 

    if (mags != null && accels != null) { 
     gravity = new float[16]; 
     boolean success = SensorManager.getRotationMatrix(gravity, null, accels, mags); 
     if (success) { 
      float[] outGravity = new float[16]; 
      SensorManager.remapCoordinateSystem(gravity, SensorManager.AXIS_X, SensorManager.AXIS_Z, outGravity); 
      SensorManager.getOrientation(outGravity, values); 

      rollingAverage[0] = roll(rollingAverage[0], values[0]); 
      rollingAverage[1] = roll(rollingAverage[1], values[1]); 
      rollingAverage[2] = roll(rollingAverage[2], values[2]); 

      azimuth = Math.toDegrees(values[0]); 
      pitch = Math.toDegrees(values[1]); 
      roll = Math.toDegrees(values[2]); 
      mags = null; 
      accels = null; 

      double diffRoll = lastRoll - roll; 
      double diffPitch = lastPitch - pitch; 
      long curTime = System.currentTimeMillis(); 
      if (Math.abs(diffRoll) >= 2) { 
       if (diffRoll > 0) 
        imageView.panLeft(); 
       else 
        imageView.panRight(); 
       lastRoll = roll; 
      } 
     } 
    } 
} 

他の方法でこれを達成するためのアイデアはありますか?

+0

加速度センサーはノイズの多いセンサーです。フィルタリング/スムーズにするDSPアルゴリズムを使用しない限り、あなたはどこにでもジャンプします。ロール()関数でこれを実行しようとしているように見えますが、あなたが何をしているのかを知るには、それを確認する必要があります。 –

+0

これはモーションゲームやVRでどのように達成されますか? – Sameer

答えて

0

カルマンフィルタまたは他のフィルタに基づいてセンサ融合技術を実装する必要があります。必要に応じて、オープンソースライブラリを使用することができます。このbitbucket repositoryを参照してください。 tutorial.

+0

ありがとう!センサーフュージョンのデモアプリケーションをチェックすると、加速度計+コンパスソリューションにも不安定な立方体が表示されます。 – Sameer

関連する問題