2011-03-31 67 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 
}