2012-04-24 40 views
15

Xin chào, tôi đang xây dựng một trò chơi 3D cho Android.Thay thế cho cảm biến định hướng Android là gì?

Tôi hiện đang cố gắng thêm cảm biến vào trò chơi của mình cho phép người chơi nghiêng android làm điều khiển của nó.

Lý tưởng nhất là tôi muốn sử dụng cảm biến ORIENTATION, nhưng tôi nhận thấy nó đã không được chấp nhận. Có ai biết làm thế nào để phát hiện độ nghiêng trong Android và không sử dụng cảm biến này?

Trả lời

41

Không có cảm biến "định hướng" thực tế - đây là (thực tế) là một cảm biến tổng hợp, được tạo ra từ sự kết hợp của gia tốc kế và công tơ kế.

Từ http://developer.android.com/reference/android/hardware/SensorEvent.html

"loại cảm biến này tồn tại vì lý do di sản, xin vui lòng sử dụng getRotationMatrix() kết hợp với remapCoordinateSystem()getOrientation() để tính toán các giá trị thay thế."

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

Có cách nào để sử dụng lệnh getOrientation() như trình xử lý sự kiện như cách các cảm biến khác được sử dụng? – user1207381

+4

Hàm getOrientation() yêu cầu các giá trị từ getRotationMatrix() - đòi hỏi các giá trị từ cả cảm biến từ và cảm biến gia tốc. Vì vậy, bạn thiết lập trình xử lý cảm biến cho 2 cảm biến đó và lưu vào bộ nhớ cache các giá trị bạn nhận được cho chúng. Và sau đó bạn có thể tính toán lại hướng khi bạn nhận được dữ liệu mới cho một trong hai cảm biến. – JesusFreke

+0

Mã mẫu của chúng có phù hợp với các phương pháp này không? Tôi đã không thể tìm thấy bất kỳ sử dụng các phương pháp này với nhau. – user1207381

Các vấn đề liên quan