我正在尝试使用Android手机制作3-dof控制器,类似于Wiimote。使用Accelerometer识别控制器的方向(使用getOrientation()方法进行计算)
我正在测试方向值,方法是使用这些值来旋转由opengl在PC中绘制的立方体。问题是,它似乎不起作用。如果手机在特定旋转上旋转,则立方体会旋转到某个奇怪的方向。
在没有计算机图形学知识的情况下,我发现参考文献说在欧拉旋转中,3D物体的最终图形取决于每个轴上的旋转顺序。它与问题有关吗?如果是这样,那么正确的订单是什么?当前的订单是“偏航 - > pitch-> roll”
我认为这不是因为所谓的校准问题,因为价值变化很大。
答案 0 :(得分:1)
不推荐使用Orientation传感器。获得可靠传感器值的最佳方法是使用旋转矢量传感器。它是一种基于软件的传感器,可从加速度计和磁力计硬件传感器中获取数据。
旋转矢量表示作为角度和轴的组合的装置的取向,其中装置围绕轴(x,y或z)旋转了角度θ。以下代码显示如何获取默认旋转矢量传感器的实例。请参阅Android开发者网站中的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
}
答案 1 :(得分:0)
当手机接近垂直位置并且没有校准有帮助时,getOrientation()
返回了奇怪的结果,我遇到了类似的问题。
简单的解决方案是使用此传感器:
manager = (SensorManager) context.getApplicationContext()
.getSystemService(Context.SENSOR_SERVICE);
Sensor orientationSensor = manager.getDefaultSensor(Sensor.TYPE_ORIENTATION);`
显然这个传感器在较新的平台上已被弃用,但无论如何它都可以正常工作。