Vector3到纬度经度

时间:2017-09-15 21:08:26

标签: unity3d geometry latitude-longitude

我正在尝试在球体上投射一个点,然后将该点转换为适当的纬度和经度。我遇到了这个与我几乎完全在堆栈交换中所做的事情相关的问题

3D coordinates on a sphere to Latitude and Longitude

使用此功能

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到3(对于lat)和-1到1(对于经度)。

我使用的程序是Unity,有谁知道为什么我可能会得到这些不正确的值?我将光线投射命中世界矢量和球体半径作为我的参数传递,球体以世界0,0,0为中心。

非常感谢能够提供帮助的任何人!

更新代码

{{1}}

我现在遇到的问题是它们所在的象限没有正确反映这些值。

1 个答案:

答案 0 :(得分: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);
}