2013-03-31 70 views
3

我正在开发基于实时位置的增强现实android应用程序。 这是一个简单的概念:我的应用程序应该显示我周围的一些地方。我有 集中研究,但我仍然遇到问题。我有我的GPS坐标 和目标地点的GPS坐标。基于位置的增强现实android应用程序

我的问题是:我怎样才能找回手机的相机正在看什么(例如建筑物)? 解决这样的问题的逻辑方法是什么?

回答

0

您需要的第一步是使用传感器来获取背部相机的方向。您可以在http://developer.android.com/reference/android/hardware/SensorManager.html
了解更多关于传感器的信息。完成传感器编码后,请回答下一个问题。

+0

其实我知道如何使用sensor.i正在逐渐传感器值像航向,俯仰和roll.but我不知道如何使用它们 –

+0

您需要要知道后置摄像头的方向,如果您不知道如何找到它,请将您的代码发布到目前为止的问题。然后回到这里,我会告诉你下一步是什么。 –

+0

我不知道如何找到camera.but我读到azimuth.is成才相机的这个方向的方向是什么? –

0

试试DroidAR SDK https://github.com/bitstars/droidar。这是一个适用于Android的AR SDK。你的大部分问题都应该用它来解决。还有视频手册。如果你只需要一些东西用于你的项目,你也可以查看代码。

0

这个问题有两个方向,设备和目标。

装置位置的方位角是指如下所示:

Azimuth

该信息可以由传感器收集。但是,如果设备的方向是不固定的,你应该做SensorManager.remapCoordinateSystem

的方位角的目标如下所示:

enter image description here

这也可能是我能找到在互联网上最好的数字。 一旦你有设备位置和所述目标位置可以通过计算:

azi = Math.abs(Math.toDegrees(Math.atan((tlon-lon)/(tlat-lat)))); 

其中tlattlon和指示目标GPS位置,纬度和经度是设备位置。 这个等式的值在-90到+90之间,这不是真正的方位角。所以,应该添加3个额外的代码。

if((tlon-lon)>0&&(tlat-lat)<0){ 
     azi = 180 - azi; 
    } 
    if((tlon-lon)<0&&(tlat-lat)<0){ 
     azi = 180 + azi; 
    } 
    if((tlon-lon)<0&&(tlat-lat)>0){ 
     azi = 360 - azi; 
    } 

这些都完成后,只需轻松检测目标是否在您的视线内。

希望这些帮助。

2

首先检查设备中传感器的可用性。如果设备支持TYPE_ROTATION_VECTOR,则为其注册一个传感器侦听器,否则检查TYPE_MAGNETIC_FIELD和TYPE_ACCELEROMETER。

SensorManager mSensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE); 
rSensor = mSensorManager.getDefaultSensor(Sensor.TYPE_ROTATION_VECTOR); 
if (rSensor == null) { 
    mSensor = mSensorManager.getDefaultSensor(Sensor.TYPE_MAGNETIC_FIELD); 
    aSensor = mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER); 
} 

然后在onSensorChanged函数中,您应该计算方位角。

if (rSensor == null) { 
    switch (event.sensor.getType()) { 
     case Sensor.TYPE_MAGNETIC_FIELD: 
      magnetic = event.values.clone(); 
      break; 
     case Sensor.TYPE_ACCELEROMETER: 
      accelerometer = event.values.clone(); 
      break; 
    } 

    if (magnetic != null && accelerometer != null) { 
     Rot = new float[9]; 
     I = new float[9]; 
     SensorManager.getRotationMatrix(Rot, I, accelerometer, magnetic); 

     float[] outR = new float[9]; 
     SensorManager.remapCoordinateSystem(Rot, SensorManager.AXIS_X, 
       SensorManager.AXIS_Z, outR); 
     SensorManager.getOrientation(outR, values); 

     azimuth = values[0]; 
     magnetic = null; 
     accelerometer = null; 
    } 
} else { 
    SensorManager.getRotationMatrixFromVector(mRotationMatrix, event.values); 
    SensorManager.getOrientation(mRotationMatrix, mValues); 

    azimuth = Math.toDegrees(mValues[0])); 
    } 
} 

您可以使用此方位绘制位置cameraview

double angle = bearing(myLatitude, myLongitude, dLatitude, dLongitude) - azimuth; 
double xAxis, yAxis; 

if(angle < 0) 
    angle = (angle+360)%360; 

xAxis = Math.sin(Math.toRadians(angle)) * dist; 
yAxis = Math.sqrt(Math.pow(dist, 2) - Math.pow(xAxis, 2)); 

if (angle > 90 && angle < 270) 
    yAxis *= -1; 

double xAxisPosition = angle * (screenWidth/90d); 

xAxis = xAxisPosition - spotImageWidth/2; 
float x, y; 
if (angle <= 45) 
    x = (float) ((screenWidth/2) + xAxis); 

else if (angle >= 315) 
    x = (float) ((screenWidth/2) - ((screenWidth*4) - xAxis)); 

else 
    x = (float) (float)(screenWidth*9); 

y = (float)(((screenHeight - 300) - (i * 100))); 

protected static double bearing(double lat1, double lon1, double lat2, double lon2) { 
    double longDiff = Math.toRadians(lon2 - lon1); 
    double la1 = Math.toRadians(lat1); 
    double la2 = Math.toRadians(lat2); 
    double y = Math.sin(longDiff) * Math.cos(la2); 
    double x = Math.cos(la1) * Math.sin(la2) - Math.sin(la1) * Math.cos(la2) * Math.cos(longDiff); 

    double result = Math.toDegrees(Math.atan2(y, x)); 
    return (result+360.0d)%360.0d; 
} 

X,Y会给目标位置的坐标。

+0

我发现使用方位角很有用。你知道ARToolKit吗?如何使用它? – GvSharma

2

增强现实将真正的坐标系统传输到相机的坐标系。在AR基于位置的情况下,实际坐标是地理坐标系。我们将把GPS坐标(纬度,经度,高度)转换为导航坐标(东,北,上),然后将导航坐标转换为摄像机坐标并显示在摄像机视图中。

我刚刚创建演示给你: https://github.com/dat-ng/ar-location-based-android

+0

你好Dat我刚刚导入你的项目,我把mu坐标放在你的地方。但它没有给出正确的方向。我不知道什么是高度,所以我让他们为0 附加(新ARPoint( “lirctek”,12.9693,77.7357,0)); 附加(新ARPoint( “甘露高度”,12.9703,77.7354,0)); –

+0

如果您设置的海拔高度为0,您的手机可能会出现错误的位置。我想你的观点在底部。您可以使用Google Elevation API从地球上的特定位置获取高度 –

+0

谢谢@Dat让我试试:) –