将经纬度转换为位置的问题

Problem converting fom latitude and longitude to position

我希望能够将球体上的 3d 位置转换为纬度和经度,然后再转换回来。我尝试使用以下方法转换为纬度和经度:

lat = acos(y / sphere_radius) * 180 / PI
long = atan2(x, z) * 180 / PI

它似乎有效。我得到的一些值是:

(0, 1, 0) -> (0, 0)
(1, 0, 0) -> (90, 90)
(0, 0, 1) -> (90, 0)
(0, 1, 1) -> (45, 0)

所以这意味着 y 是我的方向,z 我的前进方向,我的纬度是 0-180,经度是 0-360。但是现在我想将纬度和经度转换回位置向量,所以我在网上找到了这个片段(在):

z = sphere_radius * cos(longitude) * cos(latitude)
x = -sphere_radius * cos(longitude) * sin(latitude)
y = sphere_radius * sin(latitude)

的确是returns球体上的一个点,当我改变经纬度的时候,这个点还四处移动,但是位置不对。例如,如果我首先将点 (1, 0, 0) 转换为 (90, 90),然后尝试将其转换回来,它会 returns (-0.4005763, 0.8939967, 0.20077)。我听说您需要先转换回弧度,但这似乎没有帮助(而是 returns (4.371139e-08, 1, 1.910685e-15))。也许我只需要左右翻转一些正弦和余弦?

现在可以使用了! 这些是我最终使用的方法(在 C# 中,Mathf 是 Unity 的一部分,但我相信你可以找到其他能够很容易地执行 sin、cos、acos 和 atan 的库)

public static Vector2 ToLatLon(this Vector3 vector, float sphere_radius)
{
    return new Vector2(
        Mathf.Acos(vector.y / sphere_radius),
        Mathf.Atan2(vector.x, vector.z)
    );
}

public static Vector3 ToVector(this Vector2 latlon, float sphere_radius)
{
    return new Vector3(
         sphere_radius * Mathf.Sin(latlon.y) * Mathf.Sin(latlon.x),
         sphere_radius * Mathf.Cos(latlon.x),
         sphere_radius * Mathf.Cos(latlon.y) * Mathf.Sin(latlon.x)
    );
}

我的 x、y 和 z 的方程式顺序错误,并且在计算 x 时还必须从 sphere_radius 中删除减号。我还删除了纬度和经度从弧度到度数的转换,因为不需要它们(除了更容易阅读之外)。因此,当我需要以度为单位的值进行调试时,我改为使用 Mathf.Rad2Deg 在函数外部转换为度数。