使用 Cesium 构建 3D 地图应用的实践

CesiumJS 是一个功能强大的开源 JavaScript 库,能够帮助开发者快速构建高性能、高精度的 3D 地球和地图应用 。本文将介绍如何使用 Cesium 构建一个基本的 3D 地图应用,并加载自定义的 3D Tiles 模型。

初始化 Cesium Viewer

首先,在 Vue 的 onMounted 生命周期钩子中初始化 Cesium Viewer。我们需要传入一个容器 ID 和配置对象,以定制化 Viewer 的功能。例如,我们可以禁用一些不必要的 UI 组件(如动画控件、时间线等),以简化界面并专注于核心功能 。

ts 复制代码
const viewer = new Cesium.Viewer("cesiumContainer1", {
  animation: false,
  timeline: false,
  baseLayerPicker: false,
  geocoder: false,
  homeButton: false,
  fullscreenButton: false,
  sceneModePicker: false,
  navigationHelpButton: false,
  infoBox: false,
  selectionIndicator: false,
  contextOptions: { webgl: { alpha: true } },
});
去除版权信息

为了保持界面整洁,可以隐藏默认的版权信息显示:

ts 复制代码
(viewer.cesiumWidget.creditContainer as HTMLElement).style.display = "none";
初始相机视角

设置初始视角,让相机从地球外部俯视中国区域,提供一个全局概览:

ts 复制代码
viewer.camera.setView({
  destination: Cesium.Cartesian3.fromDegrees(104, 30, 40000000), // 4千万米,能看到整个地球
  orientation: {
    heading: 0,
    pitch: -Cesium.Math.PI_OVER_TWO,
    roll: 0,
  },
});
加载 3D Tiles 模型

通过 Cesium 提供的 Cesium3DTileset 类,我们可以轻松加载和渲染复杂的 3D 模型。以下代码展示了如何从指定 URL 加载模型,并将其添加到场景中:

ts 复制代码
let tileset;
try {
  tileset = await Cesium.Cesium3DTileset.fromUrl(
    "/tileset.json"
  );
  viewer.scene.primitives.add(tileset);
} catch (e) {
  console.error("模型加载失败", e);
  return;
}
获取模型中心并飞向模型

一旦模型加载完成,我们可以通过其边界球体获取模型的中心点,并调整相机视角以聚焦于该位置:

ts 复制代码
const centerCartesian = tileset.boundingSphere.center;
const centerCarto = Cesium.Cartographic.fromCartesian(centerCartesian);
const lon = Cesium.Math.toDegrees(centerCarto.longitude);
const lat = Cesium.Math.toDegrees(centerCarto.latitude);
const height = centerCarto.height + tileset.boundingSphere.radius * 2;

setTimeout(() => {
  viewer.camera.flyTo({
    destination: Cesium.Cartesian3.fromDegrees(lon, lat, height),
    duration: 4,
    orientation: {
      heading: 0,
      pitch: -Cesium.Math.PI_OVER_TWO,
      roll: 0,
    },
  });
}, 1000);
其他设置

最后,对场景进行一些额外的优化设置,比如关闭地形深度测试、启用自动适配屏幕大小的功能、调整模型颜色混合模式以及设置光源:

ts 复制代码
viewer.scene.globe.depthTestAgainstTerrain = false;
autofit.init({
  el: "#cesiumContainer1",
  dw: 1920,
  dh: 1080,
});
tileset.colorBlendMode = Cesium.Cesium3DTileColorBlendMode.MIX;
tileset.colorBlendAmount = 0.2;
viewer.scene.light = new Cesium.SunLight();
清理工作

在组件卸载前,记得清理相关资源,尤其是与第三方库(如 autofit.js)相关的事件监听器:

ts 复制代码
onBeforeUnmount(() => {
  autofit.off();
});
总结

以上就是基于 Vue 和 Cesium 构建 3D 地图应用的基本流程。通过这些步骤,你可以实现一个具备基础交互功能的 3D 地球应用,并支持加载自定义模型。

相关推荐
创世虚拟世界1 天前
从零打通 MCP 访问创世虚拟世界CRM的 3D 数据,我搭了一个可直接调用的演示站
3d
李游Leo2 天前
HarmonyOS 7 + Spatial Recon Kit-C++:3DGS 高斯参数的非有限值隔离与可渲染性门禁【鸿蒙心迹】
开发语言·c++·3d·harmonyos
迁移科技2 天前
小体积蕴含大能量:Epic Eye Pixel Mini轻量化相机的应用美学
人工智能·3d·自动化·视觉检测
Martina_03212 天前
同一片森林换个镜头就忽冷忽暖?用6步统一曝光、LUT与相机后处理
人工智能·游戏·数学建模·3d·自然语言处理·aigc·游戏策划
Better Bench2 天前
奇异值分解(SVD)在3D骨骼旋转中的应用:原理与实现
3d·人体姿态估计·骨骼关键点
追烽少年x2 天前
从零构建一个3D点云预览器:Python + PySide6 + pyqtgraph 实战
python·3d
西红柿炖牛腩3543 天前
Three.js 模型体积优化:Draco/Meshopt 压缩与 DRACOLoader 配置的 4 个步骤
javascript·3d·性能优化
JAI科研3 天前
CT重建(二) | 3D高斯泼溅:实时渲染的革命
图像处理·人工智能·计算机视觉·3d·视觉检测·ct重建
李游Leo3 天前
HarmonyOS 7 + Spatial Recon Kit-C++:3DGS 输入帧内参与位姿的版本一致性门禁【鸿蒙心迹】
c++·3d·harmonyos
HwJack203 天前
【共创稿事节】HarmonyOS 7空间信息层级:焦点、景深与注意力引导
3d·华为·harmonyos·空间计算