一般情况下,若不调整,倾斜数据要么整体悬在上空,要么整体下陷到地里,所以我们要找到一个高度作为调整的高度,又由于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); });具体思路是通过中心点带高程的新笛卡尔坐标与原中心点不带高程的笛卡尔坐标做差得到变换矩阵。
实验证明用这种方法可以使倾斜数据完全贴合地表高程(排除测量细微精度影响),而且不用手动程序,全部自动执行。