【问题标题】:Calculating coordinates from reference points从参考点计算坐标
【发布时间】:2013-09-18 17:12:47
【问题描述】:

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

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

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

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

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

蒂姆·法尔肯

【问题讨论】:

    标签: coordinates latitude-longitude


    【解决方案1】:

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

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

    编辑: 通过简单的线性数学,我的意思是这样的(这是 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:获取地图坐标的更多帮助。首先在谷歌地图上找到城市或任何城市。然后,您可以右键单击地图上的最高点(最北端)并找到最高经度。对所有四个基本方向重复此操作,您应该已设置好。

    【讨论】:

    • 对不起,我忘了说:我不是第一个参与这个项目的人(一长串可怜的学生项目,偶尔让我流血),世界已经建成,但没有人在创建它时考虑坐标。如果您的方法在这种情况下仍然有效,那么我误解了。但我认为因为城市的位置和旋转只是一些随机值,转换这些点是行不通的。不幸的是,位置不能再改变了,否则我只需将所有内容放在正确的坐标中:) [编辑:]我能够从我的 GPS 获取信息
    • 谢谢,我想我可以用你给我的信息计算出我需要的一切:)
    猜你喜欢
    • 2022-01-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-01
    • 1970-01-01
    • 2017-05-30
    • 2022-01-19
    相关资源
    最近更新 更多