cesium中3dtiles贴地问题设置

当我们转换得到3dtiles格式数据后,将数据添加到cesium中: 

tileset = new Cesium.Cesium3DTileset({ 
              url: "./tileset.json",  //文件路径
          }); 
viewer.scene.primitives.add(tileset); 

 模型可能出现以下不贴地的情况:

对于此类问题,解决办法参考如下:

tileset.readyPromise.then(function(tileset) {
            //高度偏差,正数为向上偏,负数为向下偏,根据真实的模型位置不断进行调整
            var heightOffset = -210;
            //计算tileset的绑定范围
            var boundingSphere = tileset.boundingSphere;
            //计算中心点位置
            var cartographic = Cesium.Cartographic.fromCartesian(boundingSphere.center);
            //计算中心点位置坐标
            var surface = Cesium.Cartesian3.fromRadians(cartographic.longitude, 
cartographic.latitude, 0);
            //偏移后的三维坐标
            var offset = Cesium.Cartesian3.fromRadians(cartographic.longitude, 
cartographic.latitude, heightOffset);
            var translation = Cesium.Cartesian3.subtract(offset, surface, new Cesium.Cartesian3());
            //tileset.modelMatrix转换
            tileset.modelMatrix = Cesium.Matrix4.fromTranslation(translation);
}

模型定位:

viewer.zoomTo(tileset);

修改后,模型贴地显示如下(设置不同的偏移量可以获得不同高度的模型): 

### Cesium 中实现 3D Tiles 贴地效果的方法 为了使 3D Tiles 在 Cesium 地图上达到贴地的效果,可以采用以下方法: 调整模型矩阵以适应地形高度变化是关键。具体来说,在加载 3D Tileset 后,遍历其内部节点并读取各自的世界坐标位置[^1]。 对于每一个 tile 的几何中心点执行如下操作: - 获取该点对应的地球表面实际海拔高度; - 将此高度应用到tile自身的变换矩阵中作为新的Z轴偏移量; - 更新 modelMatrix 属性来反映这些更改后的参数设置; 通过上述过程可以使所有的 tiles 都紧贴于底层DEM数据所描述的地表形态之上。 ```javascript // 假设已有一个 cesium viewer 对象实例化完成 const viewer = new Cesium.Viewer('cesiumContainer'); viewer.scene.primitives.add(tileset); function adjustTileToGround(tileset) { const terrainProvider = viewer.terrainProvider; function processNode(node, parentNodeTransform) { let boundingSphere = node.boundingVolume.sphere; // 计算世界空间中的质心 var centerInWorldCoords = Cesium.Matrix4.multiplyByPoint(parentNodeTransform || Cesium.Matrix4.IDENTITY, new Cesium.Cartesian3(boundingSphere.center.x,boundingSphere.center.y,boundingSphere.center.z), new Cesium.Cartesian3()); // 把这个质心从笛卡尔坐标系转成经纬度高程形式 var cartographicPosition = Cesium.Cartographic.fromCartesian(centerInWorldCoords); // 查询当前位置下的真实地面高度 return Cesium.sampleTerrainMostDetailed(terrainProvider,[cartographicPosition]).then(function(updatedPositions){ updatedPosition = updatedPositions[0]; // 设置新高度等于查询所得的真实地面高度 cartographicPosition.height = updatedPosition.height; // 反向计算回笛卡尔坐标系下对应的新位置 var newPosition = Cesium.Cartesian3.fromRadians(cartographicPosition.longitude,cartographicPosition.latitude,cartographicPosition.height); // 构建平移矩阵用于更新当前node的transform属性 var translationMatrix = Cesium.Transforms.eastNorthUpToFixedFrame(newPosition); // 应用最终的结果至model matrix node.transform = Cesium.Matrix4.multiplyTransformation( (parentNodeTransform ? parentNodeTransform : Cesium.Matrix4.IDENTITY), translationMatrix, new Cesium.Matrix4() ); }); } // 开始处理根节点及其子树... processNode(tileset.root).then(() => console.log("All nodes adjusted to ground")); } ```
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值