2014-02-21 3 views
1

Я хочу разработать простое приложение AR android.Android простая дополненная реальность с GPS

Мне удалось найти код, чтобы получить: азимут, подачу и бросок, и подумайте, что я понял.

Я не могу найти способ отображения изображения поверх «предварительного просмотра камеры» в соответствии с местоположением GPS.

У меня есть координаты (широта, долгота) и множество других координат (широта, долгота).

Что я хочу, это возможность отображать «маркеры» в этих координатах, когда пользователь указывает на них камеру.

Как объединить координаты и азимут, шаг и рулон, чтобы достичь этого?

Я не против использования сторонних материалов, но мне это нужно БЕСПЛАТНО.

Thanks

ответ

2

Следующие функции должны помочь. Вероятно, все, что вам нужно сделать, это преобразовать код.

setObjTranslation() вычисляет координаты/положение маркера относительно позиции игрока. Как вы можете видеть внутри функции, вычисляются tmpx и tmpy. Insted использования приведенного выше кода (translation = ...(x,y,z)) вы будете иметь что-то вроде:

markerPos.x = tmpx; 
markerPos.y = tmpy; 

Вам не нужно третье значение, г перевод, если вы не помещаете объект/маркер в 3D сцене.

Затем setDistanceToPlayer() вычисляет фактическое расстояние между положением игрока и положением маркера (в метрах). Если вы найдете поисковый запрос haversine, вы узнаете об этой функции. В основном он вычисляет расстояние между двумя местоположениями GPS.

Последняя функция, markerPlayerAngle() вычисляет угол (в градусах) между двумя координатами GPS. Поэтому, исходя из ориентации устройства, вы сможете определить, является ли маркер «видимым», другими словами, если маркер находится в поле зрения устройства ...

function setObjTranslation() { 
        if (!arObjectIsVisible() || vec2fUndefined(playerPos) || vec2fUndefined(objectPosition)) return; 
        tmpx = calcmetdistance(playerPos.x, playerPos.y, objectPosition.x, playerPos.y); 
        tmpy = calcmetdistance(playerPos.x, playerPos.y, playerPos.x, objectPosition.y); 

        arObjectPos.translation = new SFVec3f (tmpx, tmpy, 0); 
        setDistanceToPlayer(); 
       } 
function calcmetdistance(lat1, lon1, lat2, lon2) { 
        R  = 6371000; 
        lat1 *=Math.PI/180; 
        lon1 *=Math.PI/180; 
        lat2 *=Math.PI/180; 
        lon2 *=Math.PI/180; 
        d  = Math.acos ( 
              Math.sin(lat1)*Math.sin(lat2) + 
              Math.cos(lat1)*Math.cos(lat2) * 
              Math.cos(lon2-lon1) 
             ) * R; 
        return d; 
       } 

function setDistanceToPlayer() { 
        distance = haversine_m(objectPosition.x, objectPosition.y, playerPos.x, playerPos.y).toFixed(); 
        arObjDistanceTranslation.rotation = new SFRotation(0, 1, 0, markerPlayerAngle(objectPosition.x, objectPosition.y, playerPos.x, playerPos.y)); 
       } 

function haversine_m(lat1, long1, lat2, long2) { 
        d2r  = Math.PI/180; 
        d_latt = (lat2 - lat1) * d2r; 
        d_long = (long2 - long1) * d2r; 
        a  = Math.sin(d_latt/2)*Math.sin(d_latt/2) + Math.cos(lat1 * d2r) * Math.cos(lat2 * d2r) * Math.sin(d_long/2)*Math.sin(d_long/2); 
        c  = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1-a)); 
        return 6371 * 1000 * c; 
       } 

function markerPlayerAngle(markerLat, markerLong, playerLat, playerLong) { 
        dy  = markerLat - playerLat; 
        dx  = Math.cos(Math.PI/180*playerLat)*(markerLong - playerLong); 
        return Math.atan2(dy, dx); 
       } 
+0

Спасибо. Я смог понять большую часть кода, но я не мог понять, какой из вычислений будет конечным результатом. Не могли бы вы объяснить, как использовать его для правильного размещения изображения на экране? благодаря – user1433927

Смежные вопросы