Следующие функции должны помочь. Вероятно, все, что вам нужно сделать, это преобразовать код.
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);
}
Спасибо. Я смог понять большую часть кода, но я не мог понять, какой из вычислений будет конечным результатом. Не могли бы вы объяснить, как использовать его для правильного размещения изображения на экране? благодаря – user1433927