2017-09-15 1 views
0

球面上の点をレイキャストし、その点を適切な緯度と経度に変換しようとしています。私は、スタック交換にほぼ正確にやっているものに関連するこの質問に出くわした関数は常に範囲内のどこかに値を返して、ベクトル3から緯度経度

public static LatLon FromVector3(Vector3 position, float sphereRadius) 
    { 
     float lat = (float)Math.Acos(position.Y/sphereRadius); //theta 
     float lon = (float)Math.Atan(position.X/position.Z); //phi 
     return new LatLon(lat, lon); 
    } 

ただし、この機能を使用しています

3D coordinates on a sphere to Latitude and Longitude

緯度は0〜3、経度は-1〜1です。

私が使用しているプログラムはUnityですが、なぜこれらの間違った値が得られるのか誰にも分かりませんか?私はraycastのヒットしたワールドベクタと球の半径をパラメータとして渡しています。球はワールド0,0,0の中央に配置されています。

アドバイスいただきありがとうございました!

更新されたコード

public static Vector2 GetLatLonFromVector3 (Vector3 position, float sphereRadius){ 
     float lat = (float)Mathf.Acos(position.y/sphereRadius); //theta 
     float lon = (float)Mathf.Atan2(position.x, position.z); //phi 
     lat *= Mathf.Rad2Deg; 
     lon *= Mathf.Rad2Deg; 
     return new Vector2(lat, lon); 
    } 

私は今に実行している問題は、値が正しく、彼らがしていることを象限によって反射されていないです。

+0

Z成分が小さい場合は、 'Atan2(position.X、position.Z) 'を使用することをお勧めします。 – meowgoesthedog

+0

私はAtan2に切り替えると、私はまったく異なる値を得ます。 –

+0

'Atan'はあなたの" point "[X、Z]が入っている象限を考慮していないので、またそれは360度ではなく180度の角度しかカバーしません。 – meowgoesthedog

答えて

2

ACOSラジアン単位でATANの戻り値したがって、-π(-3.1 ...)からπ(3.1 ...)になります。度に変換するには、πで割り、180を掛けます。Unityには便利な定数Mathf.Rad2Degもあります。

public static LatLon FromVector3(Vector3 position, float sphereRadius) 
{ 
    float lat = (float)Math.Acos(position.Y/sphereRadius); //theta 
    float lon = (float)Math.Atan(position.X/position.Z); //phi 
    return new LatLon(lat * Mathf.Rad2Deg, lon * Mathf.Rad2Deg); 
}