Cesium快速入门17:与entity和primitive交互

上节课我们学会了"一个图元里塞多个物体"。

新问题来了:鼠标随便点一下,我怎么知道到底点中了谁?能不能像 Three.js 那样"指谁打谁"?

答案当然是可以,套路还是那条老路------屏幕射线拾取(pick)

Cesium 已经把鼠标事件封装得服服帖帖,我们直接拿来用就行。

下面分三步:

  1. 先建"鼠标监听器";

  2. 再拿屏幕坐标去拾取;

  3. 拾到谁,就改谁的颜色,给它一个"被选中的"反馈。


一、创建鼠标监听器

Cesium 贴心地提供了 ScreenSpaceEventHandler,专门对付鼠标、触摸、键盘组合键。

它能监听左键按下、抬起、双击、右键、中键滚轮等十几种事件,今天咱们只关心"左键单击"。

复制代码
/* 1. 在 canvas 上布一个监听器 */
const handler = new Cesium.ScreenSpaceEventHandler(viewer.scene.canvas);

二、监听左键单击

监听器建好后,给它注册一个回调:

只要用户在地球任意处"咔哒"一下,我们就把鼠标位置拿出来做拾取。

复制代码
/* 2. 注册左键单击事件 */
handler.setInputAction((movement) => {
  console.log(movement);                       // 先打印看一眼结构,心里有底
  const pick = viewer.scene.pick(movement.position); // 核心:拾取函数
  /* 3. 如果拾到东西,并且是个带 id 的实例,就换颜色 */
  if (Cesium.defined(pick) && typeof pick === 'object' && Object.hasOwn(pick, 'id')) {
    rectPrimitive.getGeometryInstanceAttributes(pick.id).color =
      Cesium.ColorGeometryInstanceAttribute.toValue(Cesium.Color.ORANGE);
  }
}, Cesium.ScreenSpaceEventType.LEFT_CLICK);

代码讲解:

  • movement.position 就是屏幕二维坐标(左上角为原点)。

  • viewer.scene.pick(...) 会返回一个对象,若没点中则返回 undefined

  • 点中 Primitive 里的某个实例时,返回的对象自带 id 字段,内容就是我们当初在 GeometryInstance 里填的字符串 id。

  • 拿到 id 后,用 getGeometryInstanceAttributes(id) 就能直接改颜色,无需重建 Primitive。


三、拾取结果长啥样

复制代码
{
  position: Cartesian2 {x: 1234, y: 567}, // 屏幕坐标
  // 可能还有 ctrlKey、shiftKey 等组合键标志
}

{
  id: 'ellipsoid',          // 我们之前写的实例 id
  primitive: rectPrimitive, // 所属图元
  // 其余内部字段略
}

只要 pick.id 是字符串,就能确定"点中的是 Primitive 里的某个实例",后续想高亮、隐藏、改大小,都照这个套路来。


四、小结

  • 任何鼠标交互,先上 ScreenSpaceEventHandler

  • 想拾取,就 scene.pick(屏幕坐标),返回对象里自带 id。

  • 拾到后,实例属性随便改,颜色、显隐、矩阵都能实时生效。

  • 同一套代码既适用于 Primitive,也适用于 Entity,只是字段略有差异,下节课再展开。

把这条"监听 → 拾取 → 改属性"的流水线记住,后面做点击高亮、弹窗、属性编辑,全都照搬即可。

相关推荐
遇见~未来6 小时前
第三篇_现代布局_从弹性到网格
前端·css3
geovindu6 小时前
go:Template Method Pattern
开发语言·后端·设计模式·golang·模板方法模式
前端那点事6 小时前
Vue前端SEO优化全攻略(实操落地版,新手也能上手)
前端·vue.js
卷Java7 小时前
上下文压缩
开发语言·windows·python
日取其半万世不竭7 小时前
Minecraft Java版社区服搭建教程(Windows版)
java·开发语言·windows
Dxy12393102167 小时前
HTML 如何使用 SVG 画曲线
前端·算法·html
wjs20247 小时前
HTML 文本格式化
开发语言
白夜11177 小时前
C++任务调度与状态机
开发语言·c++·笔记
用户2367829801687 小时前
从零实现 GIF 制作工具:LZW 压缩与 Median Cut 色彩量化
前端·javascript
南宫萧幕7 小时前
MATLAB/Simulink 从零打通:HEV 能量管理 GA 联合仿真保姆级建模指南
开发语言·算法·matlab·汽车·控制·pid