我正在尝试为 Android 实现一个简单的增强现实工具。它需要做的就是将我的位置和设备方向以及另一个设备的位置作为输入,并呈现一个相机 View ,并在适当的位置以适当的大小覆盖一个图标。
我被困在两个地方:
我编写了代码来获取设备当前方位角、俯仰角和滚动角的更新。代码如下所示:
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采用了一种更简单的方法,但我无法让它发挥作用。
一旦我获得了我设备的方位角、俯仰角和滚动角,以及我和其他设备的纬度和经度,我如何才能确定将图标放在屏幕上的什么位置?这似乎是一个复杂的几何问题,我们必须将相机的视野想象成一个无限大的圆锥体,将其投影到地球表面,看看其他位置是否在投影区域内,但这看起来非常复杂。有没有我忽略的更好方法?
最佳答案
这不是您问题的直接答案,但您可以尝试查看mixare。 source code .
您可能感兴趣的核心代码在这个类中: https://github.com/mixare/mixare/blob/master/src/org/mixare/MixView.java 大约第 212 行及以后。
如您所见,代码不使用方位角、俯仰和横滚,而是操纵矩阵。
至于几何问题,你说“将[相机的FOV]投影到地球表面”,我不明白。我说过,FOV 被投影到用户周围的虚拟球体上。
关于android - 在 Android 中实现无标记增强现实,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10942776/