Cesium地层爆炸

先上效果:

存在的问题:

这个地层展开和关闭代码有点问题,因为地层顺序的原因,有些本来我认为在最上层的地层,可是在处理后的数据数组中,它可能处于中间,那么这样去让它沿着z轴平移的时候,就会出现上下重合的问题。

解决思路是:

对地层按照从上到下重新排列一下顺序,确定每个地层的平移距离,这样地层在z轴的平移才是均匀的。

试过的方法

我试过了设置定时器的方式,也就是说为每个地层设置加载时间,加载时间确定,这样就不会出现有的加载位置多,有的加载位移少。但是这样操作起来代码很麻烦,远不如这样代码量少。而且我还没将这个想法在多地层中实现。遂放弃!

数据处理方面—准备数据:

用的CesiumLab处理fbx转3dtiles 这个工具,首先从专业的3D软件导出地层数据,然后将地层数据加载到3DMax中为每个地层加载贴图,然后将每个地层单独导出为FBX。打开CesiumLab,将每个地层添加进去:

处理结果:

// 加载3dtiles
var tileset = viewer.scene.primitives.add(new Cesium.Cesium3DTileset({
            url: 'http://localhost/HMCesiumServer/Models/3DTilesModel/diceng/tileset.json',
            modelMatrix: Cesium.Matrix4.fromArray([0.9968103011141229, -0.06607658011747744,
                0.04475610743518041, 0, 0.06990471351651151, 0.9934677396759846, -
                0.09019523962640563, 0, -0.038503955912934706, 0.09303620683942887,
                0.9949179411368485, 0, -399.5717901394237, 965.4759578034282, 2146.449658575002, 1
            ]),
            luminanceAtZenith: 1,
            lightColor: new Cesium.Cartesian3(0.8, 0.8, 0.8),
            maximumMemoryUsage: 32,
            maximumScreenSpaceError: 2, // 数值加大,能让最终成像变模糊
        }));
        viewer.flyTo(tileset);
        // 地层展开
        function Spread() {
            //viewer.targetFrameRate = 500;
            viewer.scene.globe.show = false;
            // tileset.readyPromise.then(function (argument) {
            var dcCount = tileset.root.children[0].children.length;
            var num = 0;
            var listener = function (scene, time) {
                num += 1;
                for (let i = 0; i < dcCount; ++i) {
                    var tempNum = 0;
                    var mm = tileset.root.children[0].children[i].transform;
                    var tempCartesian = new Cesium.Cartesian3();
                    Cesium.Cartesian3.subtract(tileset.root.children[0].children[i].boundingSphere.center, tileset
                        .boundingSphere.center, tempCartesian);
                    var tempHeight = tempCartesian.z;
                    if (tempHeight > 0) {
                        tempNum = 1;
                    } else if (tempHeight < 0) {
                        tempNum = -1;
                    } else {
                        tempNum = 0;
                    }
                    var temp = {
                        x: 0,
                        y: 0,
                        z: num  *i
                    }
                    Cesium.Matrix4.multiplyByTranslation(mm, temp, mm);
                    tileset.root.children[0].children[i].transform = mm;
                    //setTimeout(viewer.scene.preUpdate.removeEventListener(listener), 1000)
                }
                // setTimeout(function () {
                //     viewer.scene.preUpdate.removeEventListener(listener);
                // }, 500);
                if (num >= 5) {
                    viewer.scene.preUpdate.removeEventListener(listener);
                }
            }
            viewer.scene.preUpdate.addEventListener(listener);
            // })
        }
         // 地层关闭
        function Close() {
            //viewer.targetFrameRate = 500;
            viewer.scene.globe.show = true;
            // tileset.readyPromise.then(function (argument) {
            var dcCount = tileset.root.children[0].children.length;
            var num = 0;
            var listener = function (scene, time) {
                num -= 1;
                for (let i = 0; i < dcCount; ++i) {
                    var tempNum = 0;
                    var mm = tileset.root.children[0].children[i].transform;
                    var tempCartesian = new Cesium.Cartesian3();
                    Cesium.Cartesian3.subtract(tileset.root.children[0].children[i].boundingSphere.center, tileset
                        .boundingSphere.center, tempCartesian);
                    var tempHeight = tempCartesian.z;
                    if (tempHeight > 0) {
                        tempNum = 1;
                    } else if (tempHeight < 0) {
                        tempNum = -1;
                    } else {
                        tempNum = 0;
                    }
                    var temp = {
                        x: 0,
                        y: 0,
                        z: num  *i
                    }
                    Cesium.Matrix4.multiplyByTranslation(mm, temp, mm);
                    tileset.root.children[0].children[i].transform = mm;
                    //setTimeout(viewer.scene.preUpdate.removeEventListener(listener), 1000)
                }
                // setTimeout(function () {
                //     viewer.scene.preUpdate.removeEventListener(listener);
                // }, 500);
                if (Math.abs(num) >= 5) {
                    viewer.scene.preUpdate.removeEventListener(listener);
                }
            }
            viewer.scene.preUpdate.addEventListener(listener);
            // })
        }
       

地层测试模型:

链接:https://pan.baidu.com/s/1YmonTaW-1IJ1-jwDV_kuDQ?pwd=0wu0 
提取码:0wu0 
--来自百度网盘超级会员V1的分享

  • 10
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值