我正在開發基於實時位置的增強現實android應用程序。 這是一個簡單的概念:我的應用程序應該顯示我周圍的一些地方。我有 集中研究,但我仍然遇到問題。我有我的GPS座標 和目標地點的GPS座標。基於位置的增強現實android應用程序
我的問題是:我怎樣才能找回手機的相機正在看什麼(例如建築物)? 解決這樣的問題的邏輯方法是什麼?
我正在開發基於實時位置的增強現實android應用程序。 這是一個簡單的概念:我的應用程序應該顯示我周圍的一些地方。我有 集中研究,但我仍然遇到問題。我有我的GPS座標 和目標地點的GPS座標。基於位置的增強現實android應用程序
我的問題是:我怎樣才能找回手機的相機正在看什麼(例如建築物)? 解決這樣的問題的邏輯方法是什麼?
您需要的第一步是使用傳感器來獲取背部相機的方向。您可以在http://developer.android.com/reference/android/hardware/SensorManager.html
瞭解更多關於傳感器的信息。完成傳感器編碼後,請回答下一個問題。
試試DroidAR SDK https://github.com/bitstars/droidar。這是一個適用於Android的AR SDK。你的大部分問題都應該用它來解決。還有視頻手冊。如果你只需要一些東西用於你的項目,你也可以查看代碼。
這個問題有兩個方向,設備和目標。
裝置位置的方位角是指如下所示:
該信息可以由傳感器收集。但是,如果設備的方向是不固定的,你應該做SensorManager.remapCoordinateSystem
的方位角的目標如下所示:
這也可能是我能找到在互聯網上最好的數字。 一旦你有設備位置和所述目標位置可以通過計算:
azi = Math.abs(Math.toDegrees(Math.atan((tlon-lon)/(tlat-lat))));
其中tlat
tlon
和指示目標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;
}
這些都完成後,只需輕鬆檢測目標是否在您的視線內。
希望這些幫助。
首先檢查設備中傳感器的可用性。如果設備支持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會給目標位置的座標。
我發現使用方位角很有用。你知道ARToolKit嗎?如何使用它? – GvSharma
增強現實將真正的座標系統傳輸到相機的座標系。在AR基於位置的情況下,實際座標是地理座標系。我們將把GPS座標(緯度,經度,高度)轉換爲導航座標(東,北,上),然後將導航座標轉換爲攝像機座標並顯示在攝像機視圖中。
我剛剛創建演示給你: https://github.com/dat-ng/ar-location-based-android
你好Dat我剛剛導入你的項目,我把mu座標放在你的地方。但它沒有給出正確的方向。我不知道什麼是高度,所以我讓他們爲0 附加(新ARPoint( 「lirctek」,12.9693,77.7357,0)); 附加(新ARPoint( 「甘露高度」,12.9703,77.7354,0)); –
如果您設置的海拔高度爲0,您的手機可能會出現錯誤的位置。我想你的觀點在底部。您可以使用Google Elevation API從地球上的特定位置獲取高度 –
謝謝@Dat讓我試試:) –
其實我知道如何使用sensor.i正在逐漸傳感器值像航向,俯仰和roll.but我不知道如何使用它們 –
您需要要知道後置攝像頭的方向,如果您不知道如何找到它,請將您的代碼發佈到目前爲止的問題。然後回到這裏,我會告訴你下一步是什麼。 –
我不知道如何找到camera.but我讀到azimuth.is成才相機的這個方向的方向是什麼? –