Unity3d 在统一中围绕地球形状的球体的表面运动

Unity3d 在统一中围绕地球形状的球体的表面运动,unity3d,math,geo,Unity3d,Math,Geo,我正在尝试制作一个Unity游戏,允许用户根据地图探索地球形状球体的表面 是在Github上的,并且有很多这种行为 一个地球大小的形状对于Unity来说太大了,所以我只是在用户附近生成了瓷砖,偏移量使得第一块瓷砖位于Unity的原点。这个钻头有效 这个问题正在发生变化。我一直在使用一个函数,在这个函数中,我得到用户在坐标中的位置,然后对其进行归一化,为玩家提供全局方向,然后根据这个方向和他们的旋转向前平移玩家 问题在于,将ECEF坐标归一化意味着玩家以球形移动,但WGS84球体不是完美的球形。因

我正在尝试制作一个Unity游戏,允许用户根据地图探索地球形状球体的表面

是在Github上的,并且有很多这种行为

一个地球大小的形状对于Unity来说太大了,所以我只是在用户附近生成了瓷砖,偏移量使得第一块瓷砖位于Unity的原点。这个钻头有效

这个问题正在发生变化。我一直在使用一个函数,在这个函数中,我得到用户在坐标中的位置,然后对其进行归一化,为玩家提供全局方向,然后根据这个方向和他们的旋转向前平移玩家

问题在于,将ECEF坐标归一化意味着玩家以球形移动,但WGS84球体不是完美的球形。因此,玩家会下沉到地板上,如果你分别向南或向北,玩家会飞起来


我的问题是,如何允许用户通过平移的方式在球体的表面上移动?我觉得当玩家移动时,可能有某种方法可以考虑球体的长轴/短轴,但我不确定如何做到这一点。

我对Unity或计算机图形学没有经验,我只是从导航的角度来接近它

让我们看看现实世界。 我们想通过在地面行走/驾驶或在一定高度飞行来旅行。当我们这样做时,我们在本地坐标系中移动(南北、东西、上下),我们看不到任何曲率。我们假设地球是平的

当我们试图在计算机上做这件事时,问题就出现了,计算机非常精确,并且知道地球的形状。我们不能假设地球是平的,我们不能假设地球是球体。地球是一个大地水准面。幸运的是,出于某些目的,我们可以简化事情,假设地球是一个椭球体。您选择了WGS84。好!

那么如何在椭球体周围移动呢?用分析的方法解决问题是一场噩梦。我们必须作弊;) 我们应该假设地球暂时是平的,在局部坐标系中沿选定的方向移动,记下新位置的高度,计算新点的全局大地坐标(纬度、经度、高度),然后用使用局部坐标系获得的高度替换。换句话说:每次我们沿着一条完美的直线向前移动,并偏离椭球体(只是一点点),我们就迫使高度相对于椭球体不发生变化

实施。 您需要能够在大地坐标(纬度、经度、高度)和ECEF之间自由转换坐标。从大地测量到ECEF很容易。查找给定ECEF位置的大地坐标要复杂得多,有许多不同的算法,我相信您应该能够在某处找到一个随时可用的实现。 您还需要的是,准确地说,您将使用NED。 让我们假设您的对象最初位于某个大地坐标位置。写下高度(相对于椭球体)。然后创建一个原点位于该点的局部坐标系。然后在该局部坐标系中移动对象。写下高度(或者更确切地说是向下坐标)的变化量。然后必须计算新位置的ECEF坐标,并将其转换为大地坐标(纬度、经度、高度)。你有旧的高度,你有NED坐标中的高度变化,这意味着你知道新的高度。然后将该高度应用于新的大地坐标(用新值替换Lat/Long/Alt中的Alt)。 然后,在为新位置定义的NED坐标中进行另一个移动。等等


我不确定是否清楚,这个过程相当复杂。如果您不明白,请大声说:)

谢谢您的反馈!我想最后我做了与你的建议相似的事情。对于重力方向,我计算出用户所在的ECEF点,在WGS84 speroid上,在该点上方1m处,然后减去它们。如果你感兴趣的话,太棒了!长途旅行时,海拔是否保持不变?例如,当你一直向前走5分钟?是的!我有一个视频:)太棒了!做得好!