愿你出走半生,归来仍是少年!
在场景中,有时候需要对地物(房屋、楼宇)进行贴地处理,或者说相对地面高度(井盖、井室)进行设置。
通过自定义的Terrain切片以及影像瓦片构建的三维场景应该如何获取到指定位置的高程呢?
1.通过原始的DEM数据获取
构建Terrain切片时肯定有对应的Dem原始数据,可以通过对Dem数据进行直接获取指定位置的高程。然后通过此高程在unity的场景中设置游戏对象的底面高度。具体操作请参考此文章:01.Dem数据提取高程_dem数据如何读取高度,c++_就是那个帕吉的博客-CSDN博客
2.在Unity中直接获取
通过Cesium 3DTileset组件加载Terrain构建的地形已存在在场景中,所以可以通过对它进行高程获取。
2.1.图层
首先需要将地形对象添加到对应的图层中。
2.2.高程获取
通过游戏对象的坐标,构建一个从高空往地面的射线,通过射线求出与指定图层的交点的世界坐标。
通过CesiumGeoreference将世界坐标转换为球心坐标,然后通过CesiumWgs84Ellipsoid将球心坐标转换为经纬度高程,就获取到指定位置的场景内的高程了。
Ray ray = new Ray(org, to);
RaycastHit hit;
int layerMask = LayerMask.GetMask(ConstVars.Terrain);
if (Physics.Raycast(ray, out hit, Mathf.Infinity, layerMask))
{
transform.position = hit.point;
var earth = cg.TransformUnityPositionToEarthCenteredEarthFixed(new double3(hit.point.x, hit.point.y, hit.point.z));
var wgs84 = CesiumWgs84Ellipsoid.EarthCenteredEarthFixedToLongitudeLatitudeHeight(earth);
terrainHeight = wgs84.z;
Debug.Log(terrainHeight);
}
3.结论
同理,若是想要贴合倾斜等,也可以采用此方法进行高程获取。