通用的Cesium自动调整倾斜模型高度贴合地形的方法

通用的Cesium自动调整倾斜模型高度贴合地形的方法

倾斜模型自带地形起伏,该地形起伏的精度与测量精度有关,精度不在本文讨论范围内,本文讨论的是,如何在Cesium加载倾斜数据时,自动调整其变换矩阵,使其更加贴近真实地表。

一般情况下,若不调整,倾斜数据要么整体悬在上空,要么整体下陷到地里,所以我们要找到一个高度作为调整的高度,又由于Cesium使用的是笛卡尔坐标系,矩阵变换也使用该坐标系,所以不能通过单纯调整一个轴的值就试图实现该目标,因为笛卡尔坐标系没有哪个轴对应我们理解意义上的垂直地面高度。参见另一篇博客:笛卡尔坐标系是什么鬼

具体实现方法如下:

var tileset=viewer.scene.groundPrimitives.add(new Cesium.Cesium3DTileset({
                url: url,//此处填写tileset url地址
            }));
tileset.readyPromise.then(function (tileset) {               
    var boundingSphere = tileset.boundingSphere;
    var cartographic = Cesium.Cartographic.fromCartesian(boundingSphere.center);//获取到倾斜数据中心点的经纬度坐标(弧度)
    var surface = Cesium.Cartesian3.fromRadians(cartographic.longitude, cartographic.latitude, 0.0);//倾斜数据中心点的笛卡尔坐标      
     var positions = [Cesium.Cartographic.fromDegrees(cartographic.longitude,cartographic.latitude)];
     var promise = Cesium.sampleTerrainMostDetailed(terrainProvider, positions);//其中terrainProvider是当前场景使用的高程Provider
     Cesium.when(promise, function(updatedPositions) {
         var terrainHeight = updatedPositions[0].height;//高程
         var offset=Cesium.Cartesian3.fromRadians(cartographic.longitude, cartographic.latitude, terrainHeight);//带高程的新笛卡尔坐标
         var translation = Cesium.Cartesian3.subtract(offset, surface, new Cesium.Cartesian3());//做差得到变换矩阵
         tileset.modelMatrix = Cesium.Matrix4.fromTranslation(translation);
});

 }).otherwise(function (error) {
                console.log(error);
            });

具体思路是通过中心点带高程的新笛卡尔坐标与原中心点不带高程的笛卡尔坐标做差得到变换矩阵。

实验证明用这种方法可以使倾斜数据完全贴合地表高程(排除测量细微精度影响),而且不用手动程序,全部自动执行。

  • 6
    点赞
  • 41
    收藏
    觉得还不错? 一键收藏
  • 21
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 21
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值