2011-03-31 147 views
3

我正在嘗試使用類似於Wiimote的Android手機制作3自由度控制器。使用Accelerometer來識別控制器的方向(使用getOrientation()方法進行計算)用於旋轉3D立方體的Android方向傳感器

我正在測試方向值,通過使用這些值來旋轉PC中由opengl繪製的立方體。問題是,它似乎沒有工作。如果手機在特定的旋轉範圍內旋轉,立方體會旋轉到某個奇怪的方向。

沒有計算機圖形學的知識,我發現這個參考文獻說在歐拉旋轉中,3D物體的最終形狀取決於每個軸上的旋轉順序。它與問題有關嗎?如果是這樣,那麼正確的順序是什麼?當前訂單是「偏航 - >俯仰 - >滾動」

我不認爲這是因爲所謂的校準問題,因爲值的變化很大。

回答

0

我有類似的問題getOrientation()返回奇怪的結果時,手機接近垂直位置,並沒有校準幫助。

最簡單的解決方案是使用該傳感器:

manager = (SensorManager) context.getApplicationContext() 
           .getSystemService(Context.SENSOR_SERVICE); 
Sensor orientationSensor = manager.getDefaultSensor(Sensor.TYPE_ORIENTATION);` 

顯然,該傳感器在新平臺過時,但它工作得很好反正。

1

方向傳感器已棄用。獲取可靠傳感器值的最佳方法是使用旋轉矢量傳感器。它是基於軟件的傳感器,可以從加速度計和磁力計硬件傳感器獲取數據。

旋轉矢量表示設備作爲角度和軸的組合的方向,其中設備圍繞軸(x,y或z)旋轉角度θ。以下代碼顯示如何獲取默認旋轉矢量傳感器的實例。請參閱Android Dev站點中的info about this sensor

這是如何使用旋轉矢量得到可靠值的示例:

public void onSensorChanged(SensorEvent event) { 
     if(sensor.getType()==Sensor.TYPE_ROTATION_VECTOR){ 
      float[] rotationMatrix = new float[16]; 
      SensorManager.getRotationMatrixFromVector(rotationMatrix, event.values); 
      SensorManager.getOrientation(rotationMatrix, mOrientValues); 
      for(int i=0; i<3; i++) 
       mOrientValues[i]=(float) 
        Math.toDegrees(mOrientValues[i])+180.0f;//orientation in degrees 
}