Cesium 实现点光源

Cesium 本身主要提供太阳光、环境光以及基于材质的场景渲染,并没有直接提供一个能够照亮 3D Tiles 的通用点光源接口。要在不修改 3D Tiles 原始材质的前提下实现动态点光源,可以使用一套“屏幕空间光照 + 点光源阴影贴图”的方案。

本文实现的效果包括:

  • 支持动态添加多个点光源;
  • 支持设置光源位置、颜色、强度和作用半径;
  • 光照强度会随距离衰减;
  • 建筑物能够遮挡灯光并产生阴影;
  • 光源可以跟随鼠标在模型表面移动;
  • 不需要修改 3D Tiles 的原始材质。
阅读更多

cesium indexDB缓存模型

Cesium 3D Tiles 缓存技术:使用 IndexedDB 和 localforage 提升加载性能

在 Cesium 开发过程中,3D Tiles 模型加载是一个常见的性能瓶颈。尤其是当 3D 模型较大或网络条件不佳时,重复加载相同的模型会浪费带宽并降低用户体验。本文介绍如何利用浏览器的 IndexedDB 和 localforage 库来实现 Cesium 3D Tiles 的本地缓存,显著提升加载性能和用户体验。

技术原理

我们将通过以下技术和方法实现 3D Tiles 缓存:

阅读更多

cesium 加载4490坐标系

1.修改 ArcGisMapServerImageryProvider.js 源码

读取切片元数据时增加支持 wkid 4490 坐标系的判断,同时将切片信息也传

1
2
3
4
5
6
7
if (data.fullExtent.spatialReference.wkid === 4490) {
that._tilingScheme = new GeographicTilingScheme({
ellipsoid: imageryProviderBuilder.ellipsoid,
tileInfo: data.tileInfo, // 传入tileInfo,用于后面GeographicTilingScheme的计算
});
//SmartEarth 修改
}
阅读更多

Cesium 根据目标点和距离飞行

在 Cesium 三维可视化开发中,经常需要精确控制相机的位置和视角。本文将介绍如何根据目标点位置、相机与目标的距离、视角方向等参数,计算出相机的精确位置,并实现相机飞行定位的功能。

阅读更多

cesium 重心插值生成线框

为了在你的自定义**CityPrimitive**中添加重心坐标,你需要修改你的几何体数据,为每个顶点增加这些坐标。重心坐标是一个在三角形顶点上为**[1, 0, 0]**,**[0, 1, 0]**,**[0, 0, 1]**,并在内部插值的属性。这样,三角形的每个边上的坐标都会接近零,并且可以在片段着色器中用来判断一个片段是否接近边缘。

首先,你需要为你的几何体的每个三角形的顶点生成这些坐标。在 Cesium 中,可以在你创建顶点属性的时候添加这些坐标。例如:

阅读更多

cesium修改CesiumTerrainProvider源码

问题背景
在实际开发中,我们经常遇到这样的需求:加载一个地形数据后,希望视图自动定位到该地形覆盖的区域,以便用户直观地看到完整的地形数据。默认情况下,Cesium 并不提供这样的功能,加载地形后视图不会自动调整,用户需要手动寻找地形所在位置。
这个问题的关键在于:

CesiumTerrainProvider 默认不接收地形边界(bounds)参数
即使有了 bounds 信息,也缺少一个自动飞行到该区域的便捷方法
不同坐标系(EPSG:4326 和 EPSG:3857)的 bounds 处理方式不同

阅读更多

cesium加载SEM纹理合并

在使用 Cesium 进行三维可视化开发时,纹理处理是影响应用性能和视觉质量的关键因素。尤其是在加载大规模三维模型时,如何有效管理和优化纹理资源变得尤为重要。本文将详细介绍纹理合并(Texture Atlas)技术在 Cesium 中的实现,以及如何通过这一技术显著提升渲染性能。

为什么需要纹理合并?

是因为这个一个 cityjson 里边有多张图片,而一个 cityjson 是一个 drawcommand, 里边只能创建一个 Texture 对象,需要把多张图合并成一张大图传入着色器里边

但是这种方法也不太好,图片大的时候就会占的显存多,应该使用纹理压缩技术,例如 KTX 压缩

阅读更多

cesium修改源码支持月球坐标系

随着各国探月任务的不断推进,月球地图可视化的需求日益增长。Cesium 作为一款功能强大的三维地球可视化框架,默认只支持地球坐标系(主要是 WGS84),无法直接用于月球数据的展示与分析。本文将详细介绍如何通过修改 Cesium 源码,为其添加月球坐标系的支持,实现月球数据的准确可视化。

月球与地球坐标系的差异

在进行修改前,我们需要理解月球与地球坐标系的主要区别:
  1. 形状差异:地球是扁球体,而月球更接近于标准球体
  2. 尺寸差异:月球半径约为 1737.4 公里,远小于地球的 6378.137 公里
  3. 扁率差异:地球的扁率约为 1/298.257,而月球的扁率可以忽略不计
  4. 坐标系统:月球通常使用基于它自身参数的坐标系,如 MOON2000
阅读更多

cesium加载SEM解决模型抖动问题

Cesium 高精度渲染:转换为局部坐标系的实现方案

在 Cesium 开发中,当需要渲染大量高精度模型或远离地球原点的模型时,经常会遇到浮点精度问题,导致模型抖动、撕裂或位置偏移。这种情况下,将模型转换为局部坐标系(Local Coordinate System)是一种行之有效的解决方案。本文将详细介绍如何在 Cesium 中实现世界坐标到局部坐标的转换,以提高渲染精度和性能。

为什么需要局部坐标系?

Cesium 默认使用 ECEF(Earth-Centered, Earth-Fixed)坐标系,即地心地固坐标系。这是一个以地球中心为原点的笛卡尔坐标系。当模型距离原点很远时,会出现以下问题:

阅读更多

Cesium实现可拖拽图标及连接线

在 Cesium 三维地图应用中,灵活的用户交互功能对于提升用户体验至关重要。本文将详细介绍如何在 Cesium 中实现可拖拽的信息标签功能,包括标签与目标实体之间的动态连接线,以及如何优雅地处理视角变化时的位置更新问题。这种交互方式特别适合展示动态目标(如车辆、飞机等)的实时信息。

需求背景

在展示如车辆轨迹、飞行路径等动态场景时,我们通常需要同时显示目标的详细信息。直接将信息附加在目标上往往会造成视觉混乱,而允许用户自由拖动信息标签则可以:

  1. 避免信息遮挡重要视图内容
  2. 允许用户根据自己的喜好整理界面
  3. 在多目标场景下提高信息的可读性
阅读更多