我正在尝试为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上的教程采用了一种更简单的方法,但我无法使其工作。
一旦我的设备的方位角,俯仰和滚动,以及我的纬度和经度以及其他设备的方位角,我如何确定将图标放在屏幕上的位置?这似乎是一个复杂的几何问题,我们必须将摄像机的视野想象成无限锥体,将其投射到地球表面,看看其他位置是否在投影区域内,但这看起来非常复杂。有没有更好的方式让我俯视?
答案 0 :(得分:1)
这不是您问题的直接答案,但您可以尝试查看mixare source code。
您可能感兴趣的核心代码在此课程中: https://github.com/mixare/mixare/blob/master/src/org/mixare/MixView.java 在#212行以后。
正如您所看到的,代码不使用azimut,pitch和roll,而是操纵矩阵。
至于几何问题,当你说“将相机的FOV投影到地球表面”时,我不明白。我已经说过FOV被投射到围绕用户的虚拟球体上。