最近做了一个案例,通过接收服务器发送的经纬度,确定一个物体在Unity场景中的位置。再往上查找了些资料。先说一下大概的思路吧。
其实经纬度组合起来就是一个Vector2类型的数据。我们首先在Unity中创建两个点,两个点的位置就是一个正方形的对角线的位置即可,将这两个点的位置分别给一个经纬度,在通过其和坐标的X,Z轴的值和经纬度的差值,从而计算出坐标。如下图:
两个球就是确定位置的关键点。我们先将经纬度分别设好,这样接收的经纬度就可以通过这两个点的经纬度,从而确定出其在场景中的位置。
说通俗一点就是,已知A,B的位置和对应的数值,和 C 的位置,让你求 C 对应的值,是一个道理。
而我用的是动态设置两个定位点的方法,就是在接收第一个数据的第一时间,设置两个定位点的坐标。就是将第一个接收到的经纬度作为场景的中心,然后通过经纬度各加减多少度,来确定两边的定位点。这样做的好处就是不论服务器发送的是什么样的经纬度我都可以计算出,并且不超出定位点单的范围。
下面上代码:这里用的是默认经纬度,没用通过接收的经纬度这只定位点
public static GisPointTo3DPoint Instance = null;
public Transform BottomRightPoint; //Unity中右下点 (X正方向和Z轴的负方向之间)
public Transform TopLeftPoint;//Unity中左上点 (Z轴正方向和X轴负方向之间)
private Vector2 BottomRightSai;//地图中对应的左上经纬度点
private Vector2 TopLeftSai;//地图中对应的右下经纬度点
private float z_offset, x_offset, z_w_offset, x_w_offset;
private RaycastHit rayHit;
private void Awake()
{
InitBasicNum();//初始化参数
if (Instance == null) Instance = this;
else if (Instance != this) Destroy(this);
}
private void InitBasicNum()
{
//右下经纬度
BottomRightSai = new Vector2(113.98071f, 22.52864f);
//左上经纬度
TopLeftSai = new Vector2(93.98071f, 42.52864f);
z_offset = BottomRightSai.y - TopLeftSai.y;//地图中的维度差
x_offset = BottomRightSai.x - TopLeftSai.x;//地图中的经度差
z_w_offset = BottomRightPoint.position.z - TopLeftPoint.position.z;//unity中的维度差
x_w_offset = BottomRightPoint.position.x - TopLeftPoint.position.x;//unity中的经度差
}
/// <summary>
/// 由经纬度得到位置点
/// </summary>
/// <param name="se"></param>
/// <returns></returns>
public Vector3 GetWorldPoint(Vector2 se)
{
float tempX = se.x - TopLeftSai.x;
float tempZ = se.y - BottomRightSai.y;
float _tempX = (tempX * x_w_offset / x_offset + TopLeftPoint.position.x);
float _tempZ = (tempZ * z_w_offset / z_offset + BottomRightPoint.position.z);
//坐标偏差(在Unity中的坐标)
return new Vector3(_tempX, 0, _tempZ);
}
/// <summary>
/// 由位置点得到经纬度
/// </summary>
/// <param name="curPoint"></param>
/// <returns></returns>
public Vector3 GetLatLon(Vector3 curPoint)
{
//坐标偏差
float _x_offset = (curPoint.x - BottomRightPoint.position.x) * x_offset / x_w_offset;
float _z_offset = (curPoint.z - TopLeftPoint.position.z) * z_offset / z_w_offset;
float resultX = _x_offset + BottomRightSai.x;
float resultZ = _z_offset + TopLeftSai.y;
return new Vector2(resultX, resultZ);
}
附上一个Demo:
链接:https://pan.baidu.com/s/1SUS-IZ4N0jPCRTmob54JoQ
提取码:gxxy