先上效果:
存在的问题:
这个地层展开和关闭代码有点问题,因为地层顺序的原因,有些本来我认为在最上层的地层,可是在处理后的数据数组中,它可能处于中间,那么这样去让它沿着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的分享