我遇到了一个非常烦人的问题,AR 视图就像指南针一样。因此,当我纵向握住手机(使屏幕指向我的脸)时,我会拨打remapCoordinateSystem
纵向握持时的音高为 0。然后方位角(罗盘功能)是完美的,但是一旦我倾斜手机,方位角就会被破坏,如果我向前弯曲,方位角会增加,如果我向后弯曲,它会减小。
我使用 2 个传感器来获取读数,Sensor.TYPE_MAGNETIC_FIELD
并且Sensor.TYPE_GRAVITY
.
我使用了一个非常基本的低通滤波器,它使用alpha常数实现,并直接用于传感器的读取值。
这是我的代码:
float[] rotationMatrix = new float[9];
SensorManager.getRotationMatrix(rotationMatrix, null, gravitymeterValues,
magnetometerValues);
float[] remappedRotationMatrix = new float[9];
SensorManager.remapCoordinateSystem(rotationMatrix, SensorManager.AXIS_X,
SensorManager.AXIS_Z, remappedRotationMatrix);
float results[] = new float[3];
SensorManager.getOrientation(remappedRotationMatrix, results);
float azimuth = (float) (results[0] * 180 / Math.PI);
if (azimuth < 0) {
azimuth += 360;
}
float pitch = (float) (results[1] * 180 / Math.PI);
float roll = (float) (results[2] * 180 / Math.PI);
如您所见,这里没有魔法。当gravitymeterValues 和magnetometerValues 准备好使用时,我调用这段代码。
我的问题是当我倾斜手机时如何阻止方位角变得疯狂?
我在 Google Play Store 上查看了一个免费的应用程序Compass并没有解决这个问题,但我希望有一个解决方案。
我有两个解决方案:
使 AR 视图仅在非常受限的俯仰角度下工作,现在我有类似
pitch >= -5 && pitch <= 30
. 如果这未完成,则向用户显示一个屏幕,要求他/她将手机旋转为纵向。不知何故使用俯仰来抑制方位角,虽然这似乎是一个非常适合特定设备的解决方案,但我当然愿意接受建议。
我还可以补充一点,我已经花了几个小时寻找一个体面的解决方案,但我没有找到任何比 2) 更好的解决方案。
提前致谢!