我正在Unity中开展游戏,你可以在一个现实生活中存在的城市里走来走去。 在游戏中,您应该能够输入真实世界的坐标,或使用手机的GPS,然后您将被转移到这些坐标的游戏中位置。
为此,我需要以某种方式将游戏坐标转换为纬度和经度坐标。我有一些来自特定建筑物的坐标,我想我可以编写一个脚本来确定这些参考点的游戏坐标。
我一直在Google上搜索,虽然我偶尔会遇到正确的解决方案,但我一直无法理解它们在我的代码中使用它。
如果有人有这方面的经验,或者知道如何做到这一点,如果你能帮我理解,我会很感激:)
编辑:忘记提及其他以前的程序员已经把世界置于他们想要使用的某个位置和旋转位置,不幸的是,我不能简单地改变而不会破坏。
蒂姆法尔肯答案 0 :(得分:1)
这是简单的线性数学。您将遇到的主要问题是您的游戏坐标系可能会沿着一个或多个轴反转。您可能需要反转应用程序的纬度(Y)轴方向。除此之外,它只是简单的转换。既然你说这是一个真实地方的地图,你应该能够轻松找出你的地图所涵盖的min \ max lon \ lat。取这两个值之间的差值的绝对值,并将其除以每个方向上地图的宽度\高度。这将是每个地图单位值的纬度变化。存储此值,应该很容易在两个单位之间进行双向转换。制作抽象细节的函数,你应该没有任何问题计算这个。
我认为你已经能够检索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;
}
这需要在返回游戏点时完成,并且需要在使用游戏点转换为lat \ lon点之前反向完成。
EDIT3:获取地图坐标的更多帮助。首先找到Google地图上的城市或其他任何内容。然后,您可以右键单击地图上的最高点(最北边),找到最高经度。对所有四个基本方向重复此操作,您应该设置。