1

我正在尝试为 Android 实现一个简单的增强现实工具。它所需要做的就是将我的位置和设备方向以及另一台设备的位置作为输入,并在适当的位置以适当的大小显示一个带有图标的相机视图。

我被困在两个地方:

我编写了代码来获取设备当前方位角、俯仰角和滚动的更新。代码如下所示:

    private final SensorEventListener goodListener = new SensorEventListener() {
    private float[] magneticValues;
    private float[] accelerometerValues;

    public void onAccuracyChanged(Sensor sensor, int accuracy) {
    }

    public void onSensorChanged(SensorEvent event) {
        switch (event.sensor.getType()) {
        case Sensor.TYPE_MAGNETIC_FIELD:
            magneticValues = event.values.clone();
            break;
        case Sensor.TYPE_ACCELEROMETER:
            accelerometerValues = event.values.clone();
            break;
        }

        if (magneticValues != null && accelerometerValues != null) {
            float[] outR = new float[9];
            float[] orientationValues = new float[3];

            SensorManager.getRotationMatrix(outR, null,
                    accelerometerValues, magneticValues);
            SensorManager.getOrientation(outR, orientationValues);

            double azimuth = Math.toDegrees(orientationValues[0]);
            double pitch = Math.toDegrees(orientationValues[1]);
            double roll = Math.toDegrees(orientationValues[2]);

        }
    }

当我使用日志来读取这些值时,它们似乎相对稳定,但它们似乎与围绕任何自然轴集的角度不对应,我无法弄清楚这些数字代表什么。我应该如何解释这些数字?

http://www.devx.com/wireless/Article/42482/0/page/3上的教程采用了更简单的方法,但我无法让它工作。

获得设备的方位角、俯仰角和滚动角以及我的纬度和经度以及其他设备的方位角和经度后,我如何确定将图标放在屏幕上的哪个位置?这似乎是一个复杂的几何问题,我们必须将相机的视场想象成一个无限大的圆锥体,将其投影到地球表面,并查看其他位置是否在投影区域内,但这似乎非常复杂。有没有更好的方法让我忽略?

4

1 回答 1

1

这不是您问题的直接答案,但您可以尝试查看mixare source code

您可能感兴趣的核心代码在此类中: https ://github.com/mixare/mixare/blob/master/src/org/mixare/MixView.java 围绕第 #212 行及以后。

如您所见,该代码不使用方位角、俯仰和滚动,而是操纵矩阵。

至于几何问题,当你说“将[相机的FOV]投影到地球表面”时,我不明白。我会说 FOV 被投影到围绕用户的虚拟球体上。

于 2012-06-11T11:33:20.530 回答