初学Cesium_Day01

675 阅读5分钟

一. 什么是 Cesium?它的主要用途是什么?

Cesium 是一款面向三维地球地图的世界级开源 JavaScript 产品,它提供了基于 JavaScript 语言的开发包,方便用户快速搭建零插件的虚拟地球 Web 应用,具有高性能、高精度、渲染质量高以及多平台、易用性强等特点

1.主要用途

1.1 地理空间数据可视化

可创建逼真的 3D 地球、地图以及其他行星甚至月球的 3D 模型,支持展示多种数据格式,如矢量数据(点、线、多边形)、光栅数据(卫星图像、高程数据)、3D 模型数据等,使用户能够直观地理解和分析地理空间信息,适用于教育、科研等领域的地理信息展示

1.2 位置分析

能够对地理空间数据进行分析,帮助用户识别趋势和模式,从而为城市规划、环境管理、应急响应等工作提供决策支持。例如,通过分析人口分布数据和地理环境数据,为城市基础设施建设规划提供参考。

1.3 实时监控

可用于实时监控地理空间数据的变化,如交通流量、天气状况等,在交通管理、公共安全和灾害管理等方面具有重要应用价值。比如实时监测交通事故现场附近的交通流量,以便及时调整交通疏导方案。

1.4 游戏和模拟

凭借其强大的渲染功能和对 3D 场景的支持,可用于创建逼真的游戏和模拟场景,用于娱乐和培训目的,如飞行模拟训练、军事战术模拟等

二、 Cesium 的核心组件有哪些?

2.1 Viewer

  • Cesium 的主视图组件,负责初始化和管理场景、相机、地形、影像图层等。它是使用 Cesium 的入口点。

2.2 Scene

  • 场景管理器,负责渲染 3D 场景。它包含了地形、影像、实体、光源等。

2.3 Camera

  • 相机组件,用于控制视图的角度、位置和方向。可以通过相机来实现视图的平移、旋转和缩放。

2.4 Entity

  • 实体系统,用于管理和渲染场景中的对象。每个实体可以包含几何体、材质、位置、姿态等属性。

2.5 ImageryLayer

  • 影像图层,用于在地球表面叠加影像数据,如卫星图像、地图瓦片等。

2.6 TerrainProvider

  • 地形提供者,用于加载和渲染地形数据。Cesium 支持多种地形数据格式。

2.7 DataSource

  • 数据源接口,用于加载和管理不同格式的数据,如 GeoJSON、KML、CZML 等。

2.8 Globe

  • 地球模型,负责渲染地球的表面,包括地形和影像。

2.9 Clock

  • 时间管理器,用于控制场景中的时间流逝,支持时间动画和时间轴。

2.10 CesiumWidget

  • 基础的 Cesium 组件,提供了一个简单的 3D 地球视图,适合需要自定义场景管理的应用。

三、如何在 Cesium 中加载 3D Tiles?

在 Cesium 中加载 3D Tiles 的步骤如下:

  • 初始化 Cesium Viewer:首先,需要创建一个 Cesium Viewer 实例。

  • 加载 3D Tileset:使用 Cesium3DTileset 类加载 3D Tileset,提供指向 tileset JSON 文件的 URL。

  • 将 Tileset 添加到场景中:加载完成后,将其添加到场景中进行渲染。

// 创建 Cesium Viewer 实例
const viewer = new Cesium.Viewer('cesiumContainer');

// 加载 3D Tileset
const tileset = new Cesium.Cesium3DTileset({
  url: 'https://example.com/path/to/tileset.json'
});

// 将 tileset 添加到场景中
viewer.scene.primitives.add(tileset);

// 可选:飞到 tileset 的位置
tileset.readyPromise.then(() => {
  viewer.zoomTo(tileset);
}).otherwise((error) => {
  console.error(error);
});

解释:

  • Cesium.Viewer:初始化 Cesium 的主视图容器,用于显示 3D 场景。

  • Cesium.Cesium3DTileset:用于加载和管理 3D Tiles。需要提供 tileset.json 文件的 URL 作为入口。

  • viewer.scene.primitives.add(tileset):将 tileset 添加到场景中,以便进行渲染。

  • tileset.readyPromise:这是一个 Promise,当 tileset 准备好时会被解析。可以用来在加载完成后执行操作,比如飞到 tileset 的位置。

请确保将 'example.com/path/to/til…' 替换为实际的 3D Tileset 的 UR

四、 Cesium 中的相机控制是如何实现的?

在 Cesium 中,相机控制是通过 Camera 类实现的。Cesium 提供了多种方式来控制相机,以便用户可以灵活地查看 3D 场景。以下是一些常见的相机控制方法和功能:

1. 基本相机属性

  • 位置和方向:相机的位置由 position 属性定义,方向由 directionupright 向量定义。

  • 视角:可以通过 frustum 属性设置相机的视角,包括视锥体的宽度、高度、近裁剪面和远裁剪面。

2. 相机操作方法

  • flyTo:平滑地飞到指定位置。

    viewer.camera.flyTo({
      destination: Cesium.Cartesian3.fromDegrees(longitude, latitude, height),
      orientation: {
        heading: Cesium.Math.toRadians(heading),
        pitch: Cesium.Math.toRadians(pitch),
        roll: 0.0
      }
    });
    
  • setView:立即设置相机视图。

    viewer.camera.setView({
      destination: Cesium.Cartesian3.fromDegrees(longitude, latitude, height),
      orientation: {
        heading: Cesium.Math.toRadians(heading),
        pitch: Cesium.Math.toRadians(pitch),
        roll: 0.0
      }
    });
    
  • lookAt:使相机朝向特定目标。

    viewer.camera.lookAt(
      Cesium.Cartesian3.fromDegrees(targetLongitude, targetLatitude, targetHeight),
      new Cesium.Cartesian3(offsetX, offsetY, offsetZ)
    );
    
  • lookAtTransform:使用变换矩阵来设置相机的视图。

    viewer.camera.lookAtTransform(Cesium.Matrix4.IDENTITY);
    

3. 事件监听

Cesium 提供了相机事件监听器,可以在相机移动时执行特定操作:

  • camera.moveStart:相机开始移动时触发。

  • camera.moveEnd:相机停止移动时触发。

viewer.camera.moveStart.addEventListener(() => {
  console.log('Camera started moving');
});

viewer.camera.moveEnd.addEventListener(() => {
  console.log('Camera stopped moving');
});

4. 用户交互

Cesium 的默认用户交互包括:

  • 鼠标拖动:旋转视图。

  • 鼠标滚轮:缩放视图。

  • Shift + 拖动:平移视图。

这些交互可以通过 ScreenSpaceEventHandler 进行自定义。

5. 限制相机

可以通过设置 camera.constrainedAxis 和 camera.maximumZoomDistance 等属性来限制相机的移动范围和缩放级别。通过这些方法和功能,Cesium 提供了强大的相机控制能力,允许开发者根据应用需求自定义相机行为。