cesium 实现 3d-tiles 平移旋转贴地

1,445 阅读1分钟

内容概览

1.基于cesium 实现 3d-tiles 平移旋转贴地
2.源代码 demo 下载

本篇实现 3d-tiles 平移旋转贴地,效果图如下:

实现思路:核心就是根据旋转、平移矩阵相乘来改变调整 3d-tiles 模型,利用 cesium 函数 Cesium.Matrix3.fromRotationX、Cesium.Matrix3.fromRotationY、Cesium.Matrix3.fromRotationZ、Cesium.Matrix4.fromRotationTranslation、Cesium.Matrix4.multiply等等

  • 界面滑条动态调整模型位置:

        var buttonx1 = document.getElementById('buttonx-');
        var buttonx2 = document.getElementById('buttonx+');
        var buttonx3 = document.getElementById('buttony-');
        var buttonx4 = document.getElementById('buttony+');
        var sliderx = document.getElementById('slider-x');
        var sliderValuex = document.getElementById('slider-value-x');
        var slidery = document.getElementById('slider-y');
        var sliderValuey = document.getElementById('slider-value-y');
        var sliderHeight = document.getElementById('slider-Height');
        var sliderValueHeight = document.getElementById('slider-value-Height');
        var sliderRotateX = document.getElementById('slider-RotateX');
        var sliderValueRotateX = document.getElementById('slider-value-RotateX');
        var sliderRotateY = document.getElementById('slider-RotateY');
        var sliderValueRotateY = document.getElementById('slider-value-RotateY');
        var sliderRotateZ = document.getElementById('slider-RotateZ');
        var sliderValueRotateZ = document.getElementById('slider-value-RotateZ');
        window.onload = function (){
            buttonx1.addEventListener('click', function(e) {
                params.tx = params.tx - 0.0001;
                if (isNaN(params.tx)) {
                    return;
                }
                sliderValuex.textContent = params.tx;
                update3dtilesMaxtrix(tileset);
            });
            buttonx2.addEventListener('click', function(e) {
                params.tx = params.tx + 0.0001;
                if (isNaN(params.tx)) {
                    return;
                }
                sliderValuex.textContent = params.tx;
                update3dtilesMaxtrix(tileset);
            });
            sliderx.addEventListener('input', function(e) {
                sliderValuex.textContent = e.target.value;
                params.tx = Number(e.target.value);
                if (isNaN(params.tx)) {
                    return;
                }
                update3dtilesMaxtrix(tileset);
            });
    
            buttonx3.addEventListener('click', function(e) {
                params.ty = params.ty - 0.0001;
                if (isNaN(params.ty)) {
                    return;
                }
                sliderValuey.textContent = params.ty;
                update3dtilesMaxtrix(tileset);
            });
            buttonx4.addEventListener('click', function(e) {
                params.ty = params.ty + 0.0001;
                if (isNaN(params.ty)) {
                    return;
                }
                sliderValuey.textContent = params.ty;
                update3dtilesMaxtrix(tileset);
            });
            slidery.addEventListener('input', function(e) {
                sliderValuey.textContent = e.target.value;
                params.ty = Number(e.target.value);
                if (isNaN(params.ty)) {
                    return;
                }
                update3dtilesMaxtrix(tileset);
            });
    
            sliderHeight.addEventListener('input', function(e) {
                sliderValueHeight.textContent = e.target.value;
                params.tz = Number(e.target.value);
                if (isNaN(params.tz)) {
                    return;
                }
                update3dtilesMaxtrix(tileset);
            });
    
            sliderRotateX.addEventListener('input', function(e) {
                sliderValueRotateX.textContent = e.target.value;
                params.rx = Number(e.target.value);
                if (isNaN(params.rx)) {
                    return;
                }
                update3dtilesMaxtrix(tileset);
            });
    
            sliderRotateY.addEventListener('input', function(e) {
                sliderValueRotateY.textContent = e.target.value;
                params.ry = Number(e.target.value);
                if (isNaN(params.ry)) {
                    return;
                }
                update3dtilesMaxtrix(tileset);
            });
    
            sliderRotateZ.addEventListener('input', function(e) {
                sliderValueRotateZ.textContent = e.target.value;
                params.rz = Number(e.target.value);
                if (isNaN(params.rz)) {
                    return;
                }
                update3dtilesMaxtrix(tileset);
            });
        }
    
  • 核心函数:

        params = {
            tx: 116.044332,  //模型中心X轴坐标(经度,单位:十进制度)
            ty: 30.110653,    //模型中心Y轴坐标(纬度,单位:十进制度)
            tz: 0,    //模型中心Z轴坐标(高程,单位:米)
            rx: 0,    //X轴(经度)方向旋转角度(单位:度)
            ry: 0,    //Y轴(纬度)方向旋转角度(单位:度)
            rz: 0      //Z轴(高程)方向旋转角度(单位:度)
        };
        //平移、贴地、旋转模型
        function update3dtilesMaxtrix(tileset) {
            //旋转
            var mx = Cesium.Matrix3.fromRotationX(Cesium.Math.toRadians(params.rx));
            var my = Cesium.Matrix3.fromRotationY(Cesium.Math.toRadians(params.ry));
            var mz = Cesium.Matrix3.fromRotationZ(Cesium.Math.toRadians(params.rz));
            var rotationX = Cesium.Matrix4.fromRotationTranslation(mx);
            var rotationY = Cesium.Matrix4.fromRotationTranslation(my);
            var rotationZ = Cesium.Matrix4.fromRotationTranslation(mz);
            //平移
            var position = Cesium.Cartesian3.fromDegrees(params.tx, params.ty, params.tz);
            var m = Cesium.Transforms.eastNorthUpToFixedFrame(position);
            //旋转、平移矩阵相乘
            Cesium.Matrix4.multiply(m, rotationX, m);
            Cesium.Matrix4.multiply(m, rotationY, m);
            Cesium.Matrix4.multiply(m, rotationZ, m);
            //赋值给tileset
            tileset._root.transform = m;
        }
    

参考资料:

link==>