8.对象贴地-CSDN博客

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6

愿你出走半生,归来仍是少年

        在场景中有时候需要对地物房屋、楼宇进行贴地处理或者说相对地面高度井盖、井室进行设置。

        通过自定义的Terrain切片以及影像瓦片构建的三维场景应该如何获取到指定位置的高程呢

 1.通过原始的DEM数据获取

        构建Terrain切片时肯定有对应的Dem原始数据可以通过对Dem数据进行直接获取指定位置的高程。然后通过此高程在unity的场景中设置游戏对象的底面高度。具体操作请参考此文章01.Dem数据提取高程_dem数据如何读取高度,c++_就是那个帕吉的博客-CSDN博客

2.在Unity中直接获取

        通过Cesium 3DTileset组件加载Terrain构建的地形已存在在场景中所以可以通过对它进行高程获取。

2.1.图层

        首先需要将地形对象添加到对应的图层中。

增加Terrain图层
将对象添加到图层

 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.结论

        同理若是想要贴合倾斜等也可以采用此方法进行高程获取。

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6