2016-09-12 4 views
0

GPS와 좌표계를 사용하는 Unity3D로 앱을 만들고 있습니다. 3D 세계에 "물건"을 배치 할 수 있습니다. 당신은 그것이 가까워지고있는 것을 발견 할 것이다. 좀 비슷해 PokemonGO유니티 GPS 좌표가 (X, Y, Z)로 북쪽으로 회전합니다.

그래서 문제는 다음과 같습니다. 2 차원 좌표 사이의 거리를 미터로 표시하는 함수 dist (lat1, lon1, lat2, lon2)를 사용하여 올바른 위치와 거리에 객체를 배치했습니다. (아래 참조).

내가 다음에하고 싶은 것은 북쪽으로 향하기 위해 Y 축을 중심으로 장면을 회전시키는 것입니다 (Z 축 +가 북쪽을 가리켜 야 함). 어떻게해야합니까?

float xx = dist (0, Tlon, 0, lon), zz = dist (Tlat, 0, lat, 0); 
Vector3 position = new Vector3 (xx, 0, zz); 
position.Normalize(); 
float beta = Mathf.Acos(position.z) * Mathf.Rad2Deg; 
position = Quaternion.Euler (0,beta-Input.compass.trueHeading,0)*position; 
transform.position = position; 

하지만, "올바른"위치는 왼쪽 내 오른쪽에 내에서 모두 이상한 물건입니다 않는 (? 이유는 나도 몰라)

{DIST 기능을 : 내가 무슨 짓을

이 있었다 }이 작업을 수행하는

float dist(float lat1, float lon1, float lat2, float lon2){ // generally used geo measurement function 
    var R = 6378.137; // Radius of earth in KM 
    var dLat = (lat2 - lat1) * Mathf.PI/180; 
    var dLon = (lon2 - lon1) * Mathf.PI/180; 
    var a = Mathf.Sin(dLat/2) * Mathf.Sin(dLat/2) + 
     Mathf.Cos(lat1 * Mathf.PI/180) * Mathf.Cos(lat2 * Mathf.PI/180) * 
     Mathf.Sin(dLon/2) * Mathf.Sin(dLon/2); 
    var c = 2 * Mathf.Atan2(Mathf.Sqrt(a), Mathf.Sqrt(1-a)); 
    var d = R * c; 
    return (float)(d * 1000); // meters 
} 

답변

1

간단한 방법을 당신이 부모로서 비우고 다음 회전에 할당 된 모든지도 객체를 사용할 경우에있을 것입니다 : 2 개 좌표 사이의 거리를 계산하는 데 사용. 당신은 단지 빈

Input.compass.trueHeading

transform.rotation = Quaternion.Euler (0,Input.compass.trueHeading,0)을 설정할 필요가이 방법 - 지리적 북극

상대도의 제목은 보일 것입니다 코드를 보면 같은 :

float xx = dist (0, Tlon, 0, lon), zz = dist (Tlat, 0, lat, 0); 
Vector3 position = new Vector3 (xx, 0, zz); 
position.Normalize(); 
position = Quaternion.AngleAxis(Input.compass.trueHeading, Vector3.up) * position; 
transform.position = position; 

EDIT. 왜 예제가 마이너스인지 모르겠다. 어쩌면 내 코드에도 있어야한다.

transform.rotation = Quaternion.Euler (0, -Input.compass.trueHeading, 0);

0

사실은 내 자신의 질문에 대한 해결책을 발견하고, 즉 : 나는 델타 (연합 북쪽의 차이 (Z = 축) 북쪽 실제 지리)

if (delta == 0 && (gcb.activeSelf||head.transform.eulerAngles.y!=0)) { 
    Vector3 fwd = new Vector3 (0, 0, 1); 
    Vector3 north = Quaternion.Euler (0, Input.compass.trueHeading, 0) * fwd; 
    delta = SignedAngle(fwd,north) + (360-head.transform.eulerAngles.y); 
} 

다음 장소

float xx = dist (0, Tlon, 0, lon), zz = dist (Tlat, 0, lat, 0); 
Vector3 position = new Vector3 (xx, 0, zz); //the position of the target if unityNorth and actual geoNorth were the same 
position.Normalize(); 
Vector3 unityN = new Vector3 (0,0,1); // unity north 
angoloTrgt = Vector3.Angle (unityN, position); 
position *= MIN_CUBE_DIST; 
target.transform.position = new Vector3 (0,0,MIN_CUBE_DIST); 

: 그리고

는 전 소자 배치되어야 unityNorth과 장소 사이의 각도를 계산할 직각

bollettino.transform.RotateAround (Vector3.zero, Vector3.up, angoloTrgt - old_compass-delta); 

old_compass에서 객체가 Input.compass.trueHeading의 값 때 장면로드

관련 문제