0

我正在 Unity 中开发一款游戏,您可以在其中漫步在现实生活中的城市。在游戏中,您应该能够输入真实世界的坐标,或使用手机的 GPS,然后您将被传送到这些坐标的游戏内位置。

为此,我需要以某种方式将游戏坐标转换为纬度和经度坐标。我有一些来自特定建筑物的坐标,我想我也许可以编写一个脚本来确定这些参考点的游戏坐标。

我一直在 Google 上搜索了一下,虽然我可能偶尔会遇到正确的解决方案,但我无法充分理解它们,无法在我的代码中使用它。

如果有人有这方面的经验,或者知道我该怎么做,如果你能帮助我理解它,我将不胜感激:)

编辑:忘了提到其他以前的程序员已经将世界放置在他们喜欢使用的某个位置和旋转位置,不幸的是我不能简单地改变而不破坏东西。

蒂姆·法尔肯

4

1 回答 1

1

这是简单的线性数学。您将遇到的主要问题是您的游戏坐标系可能会沿一个或多个轴反转。您可能需要沿应用的纬度 (Y) 轴反转方向。除此之外,它只是一个简单的比例转换。既然您说这是真实地点的地图,您应该能够轻松找出地图所覆盖的最小\最大经度\纬度。取这两个值之差的绝对值,然后除以地图在每个方向上的宽度\高度。这将是每个地图单位值的纬度变化。存储这个值,应该很容易在两个单位之间进行双向转换。制作抽象细节的函数,无论哪种方式计算都应该没有问题。

我假设您已经能够检索 GPS 坐标 OK。

编辑:通过简单的线性数学,我的意思是这样的(这是 C++ 风格的伪代码,完全未经测试;在现实世界的例子中,常量都将是成员变量):

define('MAP_WIDTH', 1000);
define('MAP_HEIGHT', 1000);

define('MIN_LON', 25.333);
define('MIN_LAT', 20.333);
define('MAX_LON', 27.25);
define('MAX_LAT', 20.50);

class CoordConversion {
    float XScale=abs(MAX_LON-MIN_LON)/MAP_WIDTH;
    float YScale=abs(MAX_LAT-MIN_LAT)/MAP_HEIGHT;
    int LonDir = MIN_LON<MAX_LON?1:-1;
    int LatDir = MIN_LAT<MAX_LAT?1:-1;

    public static float GetXFromLon(float lon) {
      return (this.LonDir>0?(lon-MIN_LON):(lon-MAX_LON))*this.XScale;
    }
    public static float GetYFromLat(float lat) {
      return (this.LatDir >0?(lat-MIN_LAT):(lat-MAX_LAT))*this.YScale;
    }
    public static float GetLonFromX(float x) {
      return (this.LonDir>0?MIN_LON:MAX_LON)+(x/this.XScale);
    }
    public static float GetLatFromY(float y) {
      return (this.LonDir>0?MIN_LAT:MAX_LAT)+(y/this.YScale);
    }
}

EDIT2:在地图旋转的情况下,您需要使用地图上实际显示的最小和最大 lon\lat。您还需要在转换后旋转每个点。我什至不会试图把它从我的脑海中浮出水面,但我可以给你你需要的代码:

POINT rotate_point(float cx,float cy,float angle,POINT p)
{
  float s = sin(angle);
  float c = cos(angle);

  // translate point back to origin:
  p.x -= cx;
  p.y -= cy;

  // rotate point
  float xnew = p.x * c - p.y * s;
  float ynew = p.x * s + p.y * c;

  // translate point back:
  p.x = xnew + cx;
  p.y = ynew + cy;
}

这将需要在返回游戏点时完成,并且在使用游戏点转换为纬度/经度点之前需要反向完成。

EDIT3:获取地图坐标的更多帮助。首先在谷歌地图上找到城市或任何城市。然后,您可以右键单击地图上的最高点(最北端)并找到最高经度。对所有四个基本方向重复此操作,您应该已设置好。

于 2013-09-18T08:28:24.740 回答