我在使用AR视图作为指南针时遇到了一个非常烦人的问题。当我将手机竖直地握在手中(屏幕朝向我的脸),我调用
我使用两个传感器来获取读数,
我使用一个低通滤波器来过滤数据,它相当基础,实现方式是通过一个alpha常量,可以直接应用于传感器读取的值。
以下是我的代码:
正如您所见,这里并没有什么魔法。当重力计值和磁力计值准备好使用时,我调用这段代码。
我的问题是,当我倾斜手机时,如何防止方位角疯狂变化?
我在 Google Play 商店上检查了一个免费应用程序“Compass”,它没有解决这个问题,但我希望有一个解决方案。
我有两个解决方案:
1. 使 AR 视图只在非常受限制的俯仰角度下工作,现在我有类似于 `pitch >= -5 && pitch <= 30` 的东西。如果不满足此条件,则向用户显示一个屏幕,要求他/她将手机旋转到纵向。
2. 以某种方式使用俯仰角来抑制方位角,尽管这似乎是一种相当特定于设备的解决方案,但我当然愿意听取建议。
我还可以补充说,我已经搜索了几个小时,寻找一个像 2)这样的解决方案,但都没有找到更好的解决方案。
提前感谢!
remapCoordinateSystem
函数,以便在这种情况下 pitch 的值为 0 。此时方位角(指南针功能)是完美的,但是一旦我倾斜手机,方位角就会出现问题。如果我向前弯曲,方位角会增加;如果我向后弯曲,方位角会减少。我使用两个传感器来获取读数,
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);
正如您所见,这里并没有什么魔法。当重力计值和磁力计值准备好使用时,我调用这段代码。
我的问题是,当我倾斜手机时,如何防止方位角疯狂变化?
我在 Google Play 商店上检查了一个免费应用程序“Compass”,它没有解决这个问题,但我希望有一个解决方案。
我有两个解决方案:
1. 使 AR 视图只在非常受限制的俯仰角度下工作,现在我有类似于 `pitch >= -5 && pitch <= 30` 的东西。如果不满足此条件,则向用户显示一个屏幕,要求他/她将手机旋转到纵向。
2. 以某种方式使用俯仰角来抑制方位角,尽管这似乎是一种相当特定于设备的解决方案,但我当然愿意听取建议。
我还可以补充说,我已经搜索了几个小时,寻找一个像 2)这样的解决方案,但都没有找到更好的解决方案。
提前感谢!
Sensor.TYPE_MAGNETIC_FIELD
进行低通滤波吗?现在我同时对Sensor.TYPE_MAGNETIC_FIELD
和Sensor.TYPE_GRAVITY
进行低通滤波。 - Johan S