Unity3d 矢量3到经纬度

Unity3d 矢量3到经纬度,unity3d,geometry,latitude-longitude,Unity3d,Geometry,Latitude Longitude,我正在尝试对球体上的点进行光线投射,然后将该点转换为其适当的纬度和经度。我遇到了这个问题,它与我在堆栈交换上所做的几乎完全相关 哪个使用这个函数 public static LatLon FromVector3(Vector3 position, float sphereRadius) { float lat = (float)Math.Acos(position.Y / sphereRadius); //theta float lon = (float

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

哪个使用这个函数

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);
    }
但是,该函数总是返回一个范围为0到3(纬度)和-1到1(经度)的值

我使用的程序是Unity,有人知道我为什么会得到这些不正确的值吗?我将光线投射命中世界向量和球体半径作为参数传递,球体以世界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);
    }

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

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);
}

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);
}

如果Z分量很小,最好使用
Atan2(position.X,position.Z)
因为
Atan
没有考虑“点”[X,Z]所在的象限;此外,它只涵盖180度的角度,而不是360度(这是phi的领域),这是有意义的,我已经切换到Atan2。你知道我该怎么修改象限吗?例如,应该显示为116 lon的内容是154。我们可以做180-154+90=116,所以我看到了这个关系,但我不确定如何解释每个象限。很抱歉,数学不是我的强项,我很欣赏你迄今为止的见解。如果你明确地这样做,那么你最好使用Atan2,因为这正是Atan2在Z分量很小的情况下最好使用的
Atan2(position.X,position.Z)
。当我切换到Atan2时,我会得到完全不同的值,知道为什么吗?因为
Atan
没有考虑你的“点”[X,Z]所在的象限;此外,它只涵盖180度的角度,而不是360度(这是phi的领域),这是有意义的,我已经切换到Atan2。你知道我该怎么修改象限吗?例如,应该显示为116 lon的内容是154。我们可以做180-154+90=116,所以我看到了这个关系,但我不确定如何解释每个象限。很抱歉,数学不是我的强项,我很欣赏你迄今为止的见解。如果你明确地这样做,那么你最好使用Atan2,因为这正是Atan2所做的