⭐ 重点: 3D Tiles是Cesium开发的用于处理海量三维地理数据的开放标准,类似于2D地图的瓦片系统,但专为3D数据优化。
// 创建3D Tiles图层
const tileset = viewer.scene.primitives.add(
new Cesium.Cesium3DTileset({
url: 'http://example.com/tileset.json', // tileset.json文件路径
maximumScreenSpaceError: 16, // 控制LOD级别的参数,越小越精细
maximumMemoryUsage: 512 // 内存使用上限(MB)
})
);
// 加载完成后定位到模型
tileset.readyPromise.then(function(tileset) {
// 缩放到瓦片数据集
viewer.zoomTo(tileset);
// 或者手动设置相机位置
viewer.camera.flyTo({
destination: Cesium.Cartesian3.fromDegrees(longitude, latitude, height),
orientation: {
heading: Cesium.Math.toRadians(0),
pitch: Cesium.Math.toRadians(-30),
roll: 0.0
}
});
});
// 使用Cesium的样式语言设置瓦片样式
tileset.style = new Cesium.Cesium3DTileStyle({
// 颜色表达式
color: {
conditions: [
// 根据高度着色
['${height} >= 100', 'color("red")'],
['${height} >= 50', 'color("orange")'],
['${height} >= 25', 'color("yellow")'],
['${height} >= 10', 'color("lime")'],
['true', 'color("cyan")']
]
},
// 缩放表达式
scale: '${height} / 100 + 0.5',
// 是否显示
show: '${height} > 0'
});
⭐ 重点: 3D Tiles支持强大的样式语言,可以基于属性动态控制颜色、透明度、显示与否等特性。
// 监听瓦片加载事件
tileset.tileLoad.addEventListener(function(tile) {
console.log('瓦片已加载:', tile);
});
// 监听瓦片失败事件
tileset.tileFailed.addEventListener(function(error) {
console.error('瓦片加载失败:', error);
});
// 监听瓦片卸载事件
tileset.tileUnload.addEventListener(function(tile) {
console.log('瓦片已卸载:', tile);
});
// 监听所有瓦片加载完成事件
tileset.allTilesLoaded.addEventListener(function() {
console.log('所有可见瓦片已加载完成');
});
const tileset = viewer.scene.primitives.add(
new Cesium.Cesium3DTileset({
url: 'http://example.com/tileset.json',
// 控制细节级别,值越小越精细但性能消耗越大
maximumScreenSpaceError: 16,
// 内存管理
maximumMemoryUsage: 512,
// 跳级加载优化
skipLevelOfDetail: true,
skipScreenSpaceErrorFactor: 16,
skipLevels: 1,
// 预加载优化
preloadWhenHidden: true,
preloadFlightDestinations: true,
// 剔除优化
cullWithChildrenBounds: true,
cullRequestsWhileMoving: true,
cullRequestsWhileMovingMultiplier: 10
})
);
⭐ 重点: 合理设置
maximumScreenSpaceError
是性能优化的关键,值越大加载速度越快但精度越低,需要平衡性能和视觉效果。
// 创建剪裁平面集合
const clipPlanes = new Cesium.ClippingPlaneCollection({
planes: [
// 创建一个剪裁平面,法向量指向东方,位置在原点
new Cesium.ClippingPlane(new Cesium.Cartesian3(1.0, 0.0, 0.0), 0.0)
],
edgeWidth: 1.0, // 剪裁边缘宽度
edgeColor: Cesium.Color.WHITE,
enabled: true
});
// 将剪裁平面应用到瓦片集
tileset.clippingPlanes = clipPlanes;
// 动态调整剪裁平面
function updateClipPlane() {
// 获取模型中心位置
const boundingSphere = tileset.boundingSphere;
const center = boundingSphere.center;
// 更新剪裁平面距离
clipPlanes.get(0).distance = Cesium.Cartesian3.distance(
center,
clipPlanes.get(0).normal
) * Math.sin(Cesium.Math.toRadians(viewer.clock.currentTime.secondsOfDay));
}
viewer.scene.preRender.addEventListener(updateClipPlane);
// 为3D Tiles模型添加点击事件
const handler = new Cesium.ScreenSpaceEventHandler(viewer.scene.canvas);
handler.setInputAction(function(click) {
// 执行拾取操作
const pickedFeature = viewer.scene.pick(click.position);
// 检查是否拾取到了3D Tiles要素
if (Cesium.defined(pickedFeature) &&
pickedFeature instanceof Cesium.Cesium3DTileFeature) {
// 读取属性
const propertyIds = pickedFeature.getPropertyIds();
console.log('属性列表:', propertyIds);
// 获取具体属性值
propertyIds.forEach(propertyId => {
console.log(propertyId + ': ' + pickedFeature.getProperty(propertyId));
});
// 修改要素样式
pickedFeature.color = Cesium.Color.YELLOW;
}
}, Cesium.ScreenSpaceEventType.LEFT_CLICK);
⭐ 重点: 3D Tiles的每个要素可以包含丰富的属性数据,通过拾取可以实现查询和交互功能。
类型 | 后缀 | 用途 | 特点 |
---|---|---|---|
Batched 3D Model | .b3dm |
建筑物、地形等 | 支持合并绘制,适合建筑群 |
Instanced 3D Model | .i3dm |
树木、灯杆等重复对象 | 内存高效,适合大量相似对象 |
Point Cloud | .pnts |
激光扫描点云 | 支持海量点数据,适合地形测量 |
Vector Data | .vctr |
矢量数据(如线、面) | 适合细节丰富的矢量几何体 |
Composite | .cmpt |
混合多种类型 | 将多种类型组合为单一瓦片 |
3D Tiles生成工具
常见源数据格式
⭐ 重点: 数据处理是3D Tiles应用中最具挑战性的环节,通常需要专业工具进行模型优化和转换。
加载慢或卡顿
maximumScreenSpaceError
值skipLevelOfDetail
和相关优化参数模型位置不正确
modelMatrix
调整位置和朝向heightOffset
调整高度模型不显示
内存占用过高
maximumMemoryUsage
值cullWithChildrenBounds
优化剔除⭐ 重点总结:
- 3D Tiles是处理海量三维数据的标准解决方案
- 通过分层LOD和按需加载实现高效渲染
- 性能调优是应用3D Tiles的关键挑战
- 数据处理和转换是整个工作流程中的重要环节