2012-06-08 82 views
1

我正在尝试为Android实现一个简单的增强现实工具。所有需要做的就是将我的位置和设备方向以及另一个设备的位置作为输入,并以合适大小的适当位置覆盖图标来呈现相机视图。在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的教程采取了一种更简单的方法,但我无法让它工作。

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

回答

1

这不是直接回答你的问题,但你可以试着看看mixaresource code

您可能会感兴趣的核心代码是: https://github.com/mixare/mixare/blob/master/src/org/mixare/MixView.java 围绕212号线及以后。如你所见,代码并不使用方位角,俯仰角和滚动角,而是操纵矩阵。

至于几何问题,我不明白当你说“项目[摄像机的FOV]到地球表面”。我已经说过,FOV投射到围绕用户的虚拟球体上。