点击查看:最新Cesium可视化系统实战视频课程

20250206190655089ceca04508b2fd68cd415802b17a1d786Cesium是一个强大的Web地球引擎,提供了丰富的3D地球可视化功能。在Cesium中,通过后处理效果(Post-Processing)可以增强场景的视觉效果,给用户提供更丰富的交互体验。本文将介绍如何在Cesium中实现交互选中物体并给物体添加轮廓效果,帮助用户在进行3D地球交互时突出显示被选中的物体。

目标

我们将通过添加轮廓后处理效果来突出显示用户点击的物体。用户通过鼠标点击可以选中物体,选中的物体将被添加轮廓,并且通过设置轮廓的颜色和粗细来让选中的物体更加明显。

主要步骤

  1. 创建后处理阶段:后处理阶段是实现轮廓效果的核心,我们将使用Cesium.PostProcessStageLibrary.createSilhouetteStage()来创建轮廓效果。
  2. 监听鼠标点击事件:通过监听鼠标的左键点击事件,获取用户点击的物体,并在该物体上应用轮廓效果。
  3. 设置轮廓的属性:设置轮廓的颜色和厚度等属性,以便根据需求调整轮廓的外观。
  4. 动态选中物体:当用户点击物体时,通过动态调整选中的物体列表来给选中的物体添加轮廓效果。

代码示例

以下是实现该功能的完整代码示例:


// 获取Cesium Viewer对象
const stages = viewer.scene.postProcessStages;

// 创建一个轮廓后处理阶段
const stage = stages.add(
  Cesium.PostProcessStageLibrary.createSilhouetteStage()
);

// 设置轮廓的颜色和厚度
stage.uniforms.color = Cesium.Color.YELLOW;  // 轮廓的颜色为黄色
stage.uniforms.thickness = 5;  // 轮廓的厚度为5

// 启用轮廓效果
stage.enabled = true;

// 初始化选中物体列表为空
stage.selected = [];

// 监听鼠标左键点击事件
let handler = new Cesium.ScreenSpaceEventHandler(viewer.scene.canvas);
handler.setInputAction((movement) => {
  console.log(movement);
  
  // 获取用户点击位置的物体
  let pickedObject = viewer.scene.pick(movement.position);
  
  // 判断用户是否点击到有效的物体
  if (Cesium.defined(pickedObject)) {
    // 如果点击了有效物体,给该物体添加轮廓效果
    stage.selected = [pickedObject.primitive];
  } else {
    // 如果没有点击有效物体,清空选中的物体
    stage.selected = [];
  }
}, Cesium.ScreenSpaceEventType.LEFT_CLICK);

代码讲解

1. 创建后处理阶段


const stages = viewer.scene.postProcessStages;
const stage = stages.add(
  Cesium.PostProcessStageLibrary.createSilhouetteStage()
);

首先,我们获取了viewer.scene.postProcessStages,它代表了场景中的后处理阶段(PostProcess Stages)。后处理阶段用于对渲染后的场景进行进一步的效果处理,比如模糊、阴影或轮廓效果等。

Cesium.PostProcessStageLibrary.createSilhouetteStage()是Cesium提供的一个函数,用来创建轮廓后处理效果。我们将其添加到场景中的后处理阶段。

2. 设置轮廓的颜色和厚度

stage.uniforms.color = Cesium.Color.YELLOW;
stage.uniforms.thickness = 5;

在创建后处理阶段后,我们通过uniforms属性来设置轮廓的颜色和厚度。uniforms属性用于传递给着色器的参数。

  • color: 用于设置轮廓的颜色。这里我们选择了黄色(Cesium.Color.YELLOW)。
  • thickness: 用于设置轮廓的厚度。可以根据需要调整此值,5是一个相对较粗的轮廓。

3. 启用轮廓效果

javascript
stage.enabled = true;

通过设置enabled属性为true来启用轮廓效果。只有启用后,轮廓才会被应用到选中的物体上。

4. 监听鼠标左键点击事件


let handler = new Cesium.ScreenSpaceEventHandler(viewer.scene.canvas);
handler.setInputAction((movement) => {
  console.log(movement);
  let pickedObject = viewer.scene.pick(movement.position);
  if (Cesium.defined(pickedObject)) {
    stage.selected = [pickedObject.primitive];
  } else {
    stage.selected = [];
  }
}, Cesium.ScreenSpaceEventType.LEFT_CLICK);

接下来,我们创建了一个Cesium.ScreenSpaceEventHandler对象,用来处理用户的输入事件(如鼠标点击)。我们监听了鼠标左键点击事件(Cesium.ScreenSpaceEventType.LEFT_CLICK),并在事件处理函数中获取了用户点击的物体。

  • viewer.scene.pick(movement.position):该方法根据点击位置返回场景中的物体。如果用户点击了一个有效物体(即pickedObject不为空),我们将该物体添加到stage.selected数组中,这样该物体就会应用轮廓效果。
  • 如果用户没有点击有效物体,我们清空stage.selected数组,从而移除所有物体的轮廓效果。

5. 轮廓效果的更新

当用户点击不同的物体时,stage.selected会动态更新,从而给选中的物体添加或移除轮廓。这个操作使得用户与Cesium场景的交互变得更加直观和可视化。

调整轮廓的视觉效果

除了设置轮廓的颜色和厚度,您还可以根据需求进一步定制轮廓效果。比如,可以通过调整stage.uniforms.color来使用不同的颜色,或者通过thickness来改变轮廓的粗细。此外,如果您想让轮廓效果更具动感,可以结合其他的后处理效果来实现更多的视觉增强功能,如渐变、发光等。

总结

本文通过一个简单的示例展示了如何在Cesium中实现交互式物体轮廓效果。通过后处理阶段,我们可以在用户点击物体时动态地为物体添加轮廓,突出显示选中的物体。这种效果不仅增强了用户的交互体验,而且在3D地图或地球场景中尤其重要,能够有效地引导用户关注特定物体。

通过此方法,您可以进一步优化Cesium中的视觉效果,为用户提供更加直观和高效的交互方式。

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注