首页 > 建站教程 > 地图,GIS教程 >  Cesium修改3dtiles的经纬度和高度偏移量正文

Cesium修改3dtiles的经纬度和高度偏移量

一、根据前后经纬度和高度计算变换矩阵-平移矩阵:
    ①根据tileset的边界球体中心点的笛卡尔坐标得到经纬度坐标
    ②根据经纬度和高度0,得到地面笛卡尔坐标
    ③根据经纬度和需要的高度,得到偏移后的笛卡尔坐标
    ④计算坐标变换,得到新的笛卡尔坐标

根据变换得到Matrix4变换矩阵的具体代码:
// 加载OSGB倾斜摄影数据
var tileset = new Cesium.Cesium3DTileset({
    url: url2,
    name: "建筑物",
    maximumScreenSpaceError: 1
})

// 修复偏移量
tileset.readyPromise.then(function (tileset) {
    //根据tileset的边界球体中心点的笛卡尔坐标得到经纬度坐标
    var cartographic = Cesium.Cartographic.fromCartesian(tileset.boundingSphere.center);
    //根据经纬度和高度0,得到地面笛卡尔坐标
    var surface = Cesium.Cartesian3.fromRadians(cartographic.longitude, cartographic.latitude, cartographic.height);
    //根据经纬度和需要的高度,得到偏移后的笛卡尔坐标
    // var offset = Cesium.Cartesian3.fromRadians(cartographic.longitude, cartographic.latitude, 60);
    var offset = Cesium.Cartesian3.fromRadians(cartographic.longitude, cartographic.latitude, 0);
    //计算坐标变换,得到新的笛卡尔坐标
    var translation = Cesium.Cartesian3.subtract(offset, surface, new Cesium.Cartesian3());
    //调整3dtiles位置
    tileset.modelMatrix = Cesium.Matrix4.fromTranslation(translation);
}).otherwise(function (e) {
    throw e
});

viewer.scene.primitives.add(tileset);
//定位过去
viewer.zoomTo(tileset);
二、根据旋转角度计算变换矩阵-旋转矩阵:
var hprRollZero = new Cesium.HeadingPitchRoll();
var position=Cesium.Cartesian3.fromDegrees(-123.075, 44.045000, 5000.0)
var converter= Cesium.Transforms.eastNorthUpToFixedFrame
var hpRoll = new Cesium.HeadingPitchRoll();

//计算原始的modelMatrix
var modelMatrix = Cesium.Transforms.headingPitchRollToFixedFrame(position, hprRollZero, Cesium.Ellipsoid.WGS84, converter);
scene.primitives.add(new Cesium.DebugModelMatrixPrimitive({
    modelMatrix : modelMatrix,
    length : 300.0,
    width : 10.0
}));

//当hproll变化后,计算新的modelMatrix
//每次移动单位为1度,转为弧度
hpRoll.heading += deltaRadians;

hpRoll.pitch -= deltaRadians;
var deltaRadians = Cesium.Math.toRadians(1.0);
var medelMaxtrix=Cesium.Transforms.headingPitchRollToFixedFrame(position, hpRoll, Cesium.Ellipsoid.WGS84, converter, primitive.modelMatrix);