当前位置: 首页 > news >正文

Cesium.SceneTransforms分析

一、核心概念:Cesium 中的坐标空间

在讲解SceneTransforms前,先明确 Cesium 中涉及的关键坐标空间(新手必懂):

坐标空间含义
世界坐标(Cartesian3)Cesium 中最核心的坐标,基于 WGS84 椭球体(经纬度转笛卡尔坐标),表示地球表面/空间的绝对位置
窗口坐标(Window Coordinates)以浏览器视口为基准的 2D 坐标,原点在视口左上角,单位是像素(受浏览器缩放、CSS 布局影响)
绘图缓冲区坐标(Drawing Buffer)以 WebGL 绘图缓冲区为基准的 2D 坐标,原点在画布左上角,单位是像素(与硬件渲染分辨率强相关)

SceneTransforms的核心作用:把 3D 世界中的点(Cartesian3)映射到 2D 屏幕上的点(Cartesian2),是实现「3D 点位绑定 2D DOM 元素」「鼠标拾取」「标注跟随」的基础。


二、两个核心方法的关键差异

你提到的worldToWindowCoordinatesworldToDrawingBufferCoordinates是最常用的两个方法,看似相似,实则适用场景完全不同:

1. 核心差异对比

特性worldToWindowCoordinates(窗口坐标)worldToDrawingBufferCoordinates(绘图缓冲区坐标)
基准浏览器视口(Viewport)WebGL 绘图缓冲区(Canvas 实际渲染区域)
受影响因素浏览器缩放、CSS 缩放/偏移、Canvas 样式(如width/height仅受 Canvas 渲染分辨率、设备像素比(DPR)影响
典型场景绑定 HTML DOM 元素(如弹窗、标注)原生 WebGL 操作、精确的像素拾取、离屏渲染
返回值失效场景点位在椭球中心、点位被遮挡、点位超出相机视锥与左侧一致

2. 关键细节:为什么会有两个方法?

  • 设备像素比(DPR):高分辨率屏幕(如 Retina 屏)的 DPR=2,此时 1 个 CSS 像素对应 2 个物理像素。worldToWindowCoordinates返回的是 CSS 像素(适配页面布局),而worldToDrawingBufferCoordinates返回的是物理像素(适配渲染精度)。
  • 浏览器缩放:当浏览器缩放(如 150%)时,worldToWindowCoordinates的结果会随缩放比例变化,而worldToDrawingBufferCoordinates不受影响(只和 Canvas 渲染缓冲区有关)。

3. 失效场景说明

两个方法都可能返回undefined,原因包括:

  • 点位位于椭球中心(地下/地球内部);
  • 点位被相机视锥剔除(超出视野);
  • 点位被地形/模型遮挡(深度检测不通过)。

三、完整实操教程:从基础到进阶

前置准备

确保你已引入 Cesium 并初始化场景(基础代码):

// 1. 初始化 Cesium 场景constviewer=newCesium.Viewer("cesiumContainer",{terrainProvider:Cesium.createWorldTerrain(),// 加载地形(可选,更贴近真实场景)baseLayerPicker:false,animation:false,timeline:false,});// 简化场景引用(后续代码复用)constscene=viewer.scene;constcanvas=viewer.canvas;

示例 1:基础用法——将经纬度坐标转屏幕坐标

需求:将北京天安门(经纬度:116.403874, 39.914885)的 3D 坐标,实时转换为屏幕坐标并打印。

// 步骤 1:经纬度转世界坐标(Cartesian3)consttiananmen=Cesium.Cartesian3.fromDegrees(116.403874,39.914885,50// 高程,单位米(可选,默认0));// 步骤 2:实时监听场景变化,打印坐标viewer.scene.postRender.addEventListener(()=>{// 转换为窗口坐标(适配 DOM 元素)constwindowPos=Cesium.SceneTransforms.worldToWindowCoordinates(scene,tiananmen);// 转换为绘图缓冲区坐标(适配 WebGL 操作)constdrawingBufferPos=Cesium.SceneTransforms.worldToDrawingBufferCoordinates(scene,tiananmen);if(windowPos&&drawingBufferPos){console.log("窗口坐标(DOM 布局用):",`X:${windowPos.x.toFixed(2)}, Y:${windowPos.y.toFixed(2)}`);console.log("绘图缓冲区坐标(WebGL 用):",`X:${drawingBufferPos.x.toFixed(2)}, Y:${drawingBufferPos.y.toFixed(2)}`);}else{console.log("点位超出视野/被遮挡,转换失败");}});

示例 2:进阶应用——3D 点位绑定 2D DOM 弹窗

这是SceneTransforms最经典的应用场景:让 HTML 弹窗始终跟随 3D 场景中的某个点位。

步骤 1:创建 DOM 弹窗(CSS + HTML)
<!-- HTML --><divid="popup"style="position: absolute; background: white; padding: 8px 12px; border-radius: 4px; box-shadow: 0 2px 8px rgba(0,0,0,0.2); display: none; pointer-events: none; /* 避免遮挡 Cesium 交互 */">天安门</div>
步骤 2:编写坐标转换+DOM 定位逻辑
// 获取弹窗 DOM 元素constpopup=document.getElementById("popup");// 监听场景渲染(每一帧更新弹窗位置)viewer.scene.postRender.addEventListener(()=>{// 1. 转换世界坐标到窗口坐标(DOM 布局用这个!)constwindowPos=Cesium.SceneTransforms.worldToWindowCoordinates(scene,tiananmen);if(windowPos){// 2. 设置弹窗位置(注意:窗口坐标原点在左上角,需适配 DOM 定位)popup.style.display="block";popup.style.left=`${windowPos.x}px`;popup.style.top=`${windowPos.y}px`;// 优化:让弹窗中心对准点位(可选)popup.style.transform="translate(-50%, -50%)";}else{// 点位不可见时隐藏弹窗popup.style.display="none";}});// 可选:调整相机视角,测试弹窗跟随效果viewer.camera.flyTo({destination:Cesium.Cartesian3.fromDegrees(116.403874,39.914885,1000),orientation:{heading:Cesium.Math.toRadians(0),pitch:Cesium.Math.toRadians(-30),},});

示例 3:进阶应用——鼠标拾取+坐标反推

需求:点击 3D 场景中的点位,获取其经纬度和屏幕坐标,并在点击位置显示标注。

// 1. 监听鼠标左键点击事件consthandler=newCesium.ScreenSpaceEventHandler(canvas);handler.setInputAction((event)=>{// 2. 从鼠标点击的屏幕坐标(windowPosition)拾取 3D 世界坐标constwindowPosition=event.position;constray=viewer.camera.getPickRay(windowPosition);consthitResult=scene.globe.pick(ray,scene);if(hitResult){// 3. 世界坐标转经纬度(方便展示)constcartographic=Cesium.Cartographic.fromCartesian(hitResult);constlon=Cesium.Math.toDegrees(cartographic.longitude).toFixed(6);constlat=Cesium.Math.toDegrees(cartographic.latitude).toFixed(6);// 4. 世界坐标转回屏幕坐标(验证)constscreenPos=Cesium.SceneTransforms.worldToWindowCoordinates(scene,hitResult);console.log(`点击位置:经纬度(${lon},${lat}),屏幕坐标(${screenPos.x.toFixed(2)},${screenPos.y.toFixed(2)})`);// 5. 在点击位置添加标注(Cesium 原生标注)viewer.entities.add({position:hitResult,label:{text:`(${lon},${lat})`,font:"14px sans-serif",pixelOffset:newCesium.Cartesian2(0,-20),// 标注偏移(避免遮挡)fillColor:Cesium.Color.RED,},});}},Cesium.ScreenSpaceEventType.LEFT_CLICK);

四、避坑指南(新手常犯错误)

  1. DOM 定位用错方法
    • 绑定 HTML 元素(如弹窗、按钮)必须用worldToWindowCoordinates,而非worldToDrawingBufferCoordinates(后者是给 WebGL 用的,会导致 DOM 位置偏移)。
  2. 忽略点位失效场景
    • 转换前必须判断返回值是否为undefined,否则会导致 DOM 位置异常(如点位在地球背面、被地形遮挡)。
  3. 高 DPI 屏幕适配
    • 如果需要精确的像素操作(如截图、像素拾取),优先用worldToDrawingBufferCoordinates,并结合canvas.clientWidth/canvas.width计算设备像素比。

五、进阶应用场景

掌握SceneTransforms后,可实现这些核心功能:

  1. 自定义标注跟随:替代 Cesium 原生 Label,用 HTML/CSS 实现更美观的 3D 标注(如带箭头、背景的弹窗);
  2. 鼠标悬停提示:监听鼠标移动,实时转换鼠标拾取的 3D 点位到屏幕坐标,显示该点位的属性信息;
  3. 2D/3D 联动:将 Cesium 中的 3D 点位同步到 2D 地图(如百度地图、高德地图),实现双屏联动;
  4. 屏幕空间交互:如「拖拽 3D 模型到指定屏幕位置」「绘制多边形时的屏幕坐标转世界坐标」。

总结

  1. SceneTransforms是 Cesium 中 3D 世界坐标与 2D 屏幕坐标转换的核心工具,核心是worldToWindowCoordinates(DOM 布局)和worldToDrawingBufferCoordinates(WebGL 渲染);
  2. 转换前必须判断返回值是否为undefined(处理点位失效场景),绑定 HTML DOM 优先用窗口坐标,WebGL 操作优先用绘图缓冲区坐标;
  3. 核心应用场景是「3D 点位绑定 2D DOM」「鼠标拾取」「标注跟随」,是 Cesium 交互开发的基础技能。
http://www.jsqmd.com/news/421448/

相关文章:

  • 2026国内最新云石胶五大源头厂家实力排行榜:聚焦全屋健康,基于环保性能与市场口碑的权威推荐榜单 - 十大品牌榜
  • GitHub 10万星的OpenCode,正在悄悄改变程序员的工作流
  • 2026嘉兴工装装修公司推荐:从100家筛出的6家干货榜单 - 企师傅推荐官
  • 2026年驻车空调品牌推荐,主要有哪些在浙江制冷量高的生产厂家? - 睿易优选
  • SpringBoot整合秘笈:让Mybatis用上Calcite,实现统一SQL查询
  • 生成式人工智能渗透进IBM 工程生命周期管理/应用生命周期管理和研发领域
  • 基于MATLAB的简单卷积神经网络(CNN)实现代码
  • vLLM v0.16.0 重磅发布:吞吐量提升30%,异步调度+流水线并行全面整合
  • 2026年气体检测与扬尘检测采购平台推荐:采购量大/供应商多的热门B2B平台盘点 - 品牌推荐大师1
  • Geovia Surpac、Whittle 与 MineSched 完全指南
  • 北京小程序开发服务指南:2026年企业数字化转型的定制之选 - 品牌2025
  • 2026年一体成型/贴片/功率/大电流/共模电感厂家推荐榜:适配电源管理、汽车电子与通信模块多场景应用 - 品牌推荐官
  • AI视频制作大师课:从脚
  • 汽车配件海外营销代运营:推荐几家擅长TikTok与ins代运营的服务商 - 品牌2025
  • 2026年AI仓储软件(WMS)推荐:高效管理解决方案 - 品牌排行榜
  • 北京小程序开发深度解析:2026年定制化服务如何赋能行业转型 - 品牌2025
  • 别再踩坑!如何选择短信接口服务商?可以从这几点判断 - Qqinqin
  • 上海B2B企业出海营销服务商推荐:涵盖Linkedin海外营销推广与Google代运营 - 品牌2025
  • 偌米品牌知名度高吗? - 中媒介
  • 2026年仓储软件(WMS)值得推荐的实用参考 - 品牌排行榜
  • 北京小程序开发攻略:2026年企业如何锁定优质定制服务商 - 品牌2025
  • 2026年全国二手中央空调回收哪家靠谱? 覆盖多区域专业处置更放心 - 深度智识库
  • 2026精选|四大全国知名的GEO优化公司推荐,AI时代获客不踩坑 - 品牌推荐大师1
  • 2026国内最新五大MS胶品牌实力排行榜:聚焦全屋健康,基于环保性能与市场口碑的权威推荐榜单 - 十大品牌榜
  • 今日 总 结
  • 2026性价比最高的仓储软件(WMS)推荐 - 品牌排行榜
  • 怎样禁止dbeaver点击导航中数据库自动切换sql编辑器所属的数据库
  • 2026国内最新高弹胶五大厂商实力排行榜:聚焦全屋健康,基于环保性能与市场口碑的权威推荐榜单 - 十大品牌榜
  • 2026国内最新门窗胶五大厂家实力排行榜:聚焦全屋健康,基于环保性能与市场口碑的权威推荐榜单 - 十大品牌榜
  • 今日总 结