Cesium变换3DTiles的位置(平移旋转缩放)

function add3DTilesetDataTrans(url) {
            //viewer1.scene.globe.depthTestAgainstTerrain = true;//地形遮挡
            //viewer1.scene.globe.depthTestAgainstTerrain = false;//去掉地形遮挡
            tileset = viewer.scene.primitives.add(new Cesium.Cesium3DTileset({
                url: url,
                //maximumScreenSpaceError: 20,        //最大的屏幕空间误差
                //maximumNumberOfLoadedTiles: 10,  //最大加载瓦片个数
            }));
            tileset.readyPromise.then(function () {

            }).then(function () {
                if (tileset._root.transform == undefined) {
                    console.log("瓦片未变换");
                }
                tileset._root.transform = update3dtilesMaxtrix(params);
                viewer.zoomTo(tileset);
            });
        };

        function remove3DTilesetData(dataConfig) {
            var url = dataConfig;
            var primitives = viewer.scene.primitives;
            for (var i = 0; i < primitives.length; i++) {
                if (primitives._primitives[i]._url == url) {
                    viewer.scene.primitives.remove(primitives._primitives[i]);
                }
            }
         
        }

        function add3DTilesetData(dataConfig) {
            //viewer1.scene.globe.depthTestAgainstTerrain = true;//地形遮挡
            //viewer1.scene.globe.depthTestAgainstTerrain = false;//去掉地形遮挡
            var tileset = viewer.scene.primitives.add(new Cesium.Cesium3DTileset({
                url: dataConfig,
                //maximumScreenSpaceError: 20,        //最大的屏幕空间误差
                //maximumNumberOfLoadedTiles: 10,  //最大加载瓦片个数
            }));
            tileset.readyPromise.then(function () {

            });
        };
        let params = {
            tx: 120.257, //模型中心X轴坐标(经度,单位:十进制度)
            ty: 31.226, //模型中心Y轴坐标(纬度,单位:十进制度)
            tz: 2800, //模型中心Z轴坐标(高程,单位:米)
            rx: 0, //X轴(经度)方向旋转角度(单位:度)
            ry: 0, //Y轴(纬度)方向旋转角度(单位:度)
            rz: -1 //Z轴(高程)方向旋转角度(单位:度)
        };


        function update3dtilesMaxtrix(params) {
            //旋转

            let mx = Cesium.Matrix3.fromRotationX(Cesium.Math.toRadians(params.rx));
            let my = Cesium.Matrix3.fromRotationY(Cesium.Math.toRadians(params.ry));
            let mz = Cesium.Matrix3.fromRotationZ(Cesium.Math.toRadians(params.rz));
            let rotationX = Cesium.Matrix4.fromRotationTranslation(mx);
            let rotationY = Cesium.Matrix4.fromRotationTranslation(my);
            let rotationZ = Cesium.Matrix4.fromRotationTranslation(mz);
            //平移
            let position = Cesium.Cartesian3.fromDegrees(params.tx, params.ty, params.tz);
            let m = Cesium.Transforms.eastNorthUpToFixedFrame(position);

            let scale = Cesium.Matrix4.fromUniformScale(0.85);
            // //缩放
            Cesium.Matrix4.multiply(m, scale, m);
            //旋转、平移矩阵相乘
            Cesium.Matrix4.multiply(m, rotationX, m);
            Cesium.Matrix4.multiply(m, rotationY, m);
            Cesium.Matrix4.multiply(m, rotationZ, m);
            //赋值给tileset
            return m;
        }

### Cesium加载3DTile数据时位置偏移的解决方案 在Cesium中加载3DTile数据时,如果遇到位置偏移的问题,可以通过调整模型的空间变换参数来解决。具体来说,可以利用Cesium中的`ModelMatrix`属性来进行平移缩放旋转操作[^2]。 以下是通过代码实现的具体方法: #### 平移修正 当3D Tiles的位置发生偏移时,通常是因为其地理坐标未正确映射到地球表面。此时可通过设置`modelMatrix`矩阵完成空间上的位移校正。假设已知目标位置的经纬度(longitude, latitude),以及高度(height),则可构建如下转换矩阵: ```javascript const viewer = new Cesium.Viewer(&#39;cesiumContainer&#39;); // 定义目标位置 (经度, 纬度, 高度) const targetPosition = Cesium.Cartesian3.fromDegrees(longitude, latitude, height); // 构建 Model Matrix 进行平移 const modelMatrix = Cesium.Transforms.eastNorthUpToFixedFrame(targetPosition); viewer.scene.primitives.add(Cesium.createOrientedBoundingBox({ center: targetPosition, halfAxes: Cesium.Matrix3.fromScale(new Cesium.Cartesian3(10.0, 10.0, 10.0)), modelMatrix: modelMatrix })); // 添加3DTiles图层并应用ModelMatrix const tileset = viewer.scene.primitives.add( new Cesium.Cesium3DTileset({ url: &#39;path/to/your/tileset.json&#39;, modelMatrix: modelMatrix // 应用平移矩阵 }) ); ``` 上述代码片段展示了如何定义一个新的中心点,并将其作为参考系重新定位3D Tiles对象。 #### 缩放旋转调整 除了简单的平移外,还可以结合缩放旋转功能优化显示效果。例如,在某些情况下可能需要微调比例因子或者改变方向角度,则需扩展`modelMatrix`计算逻辑以支持更多维度的操作。 ```javascript // 创建一个组合变换矩阵:先绕Z轴旋转一定角度再整体放大两倍 let rotationAroundZAxis = Cesium.Matrix3.fromRotationZ(Cesium.Math.toRadians(rotationAngle)); let scaleTransform = Cesium.Matrix4.fromUniformScale(scaleFactor); // 合并所有变换至最终matrix finalModelMatrix = Cesium.Matrix4.multiplyTransformation(modelMatrix, Cesium.Matrix4.fromRotationTranslation(rotationAroundZAxis), finalModelMatrix); tileset.modelMatrix = finalModelMatrix; ``` 以上脚本实现了基于原始`modelMatrix`基础上增加额外旋转变换及全局尺寸伸展的功能。 综上所述,针对Cesium平台上3DTile数据加载过程中产生的位置偏差现象,主要依靠精确设定`modelMatrix`这一核心机制予以纠正;同时辅之必要的尺度调节与定向摆布手段达成更佳视觉呈现目的[^1]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值