Skip to content

CloudUltraEffect 体积云 Ultra ​

CloudUltraEffect 使用世界空间多层云、Perlin-Worley 三维噪声、Bruneton 大气散射、级联云阴影及时间抗锯齿,移动镜头时云体保持地理空间位置。

组件案例 ​

示例使用 ArcGIS 影像,低空镜头及固定白天时刻,便于观察云体和阴影;退出后恢复原时钟。SDK 本身不调整相机、时钟、地形或 Cesium Token。

使用示例 ​

Ultra 以独立 npm 包发布,按需安装:

bash
npm install @b-map-viewer/cloud-ultra

它可以与 b-map-viewer 配合使用,也可以直接使用已有的 Cesium Viewer;不依赖 Vue。

js
import { CloudUltraEffect } from '@b-map-viewer/cloud-ultra'

const cloud = new CloudUltraEffect(viewer, {
  coverage: 0.3,
  exposure: 10,
  windSpeed: 10,
  windDirection: 0,
  steps: 500,
  temporalUpscale: true,
  perfOptimize: true,
  layers: [
    { altitude: 750, height: 650, shadow: true },
    { altitude: 1000, height: 1200, shadow: true },
  ],
  onProgress: (percent) => console.log(`资源准备 ${percent}%`),
  onError: (error) => console.error(error),
})

try {
  await cloud.readyPromise
  cloud.setOptions({ coverage: 0.45, windSpeed: 15 })
} catch (error) {
  cloud.destroy()
  throw error
}

// 页面退出时
// cloud.destroy()

创建前可用 CloudUltraEffect.isSupported(viewer) 检查硬件能力。Ultra 需要 WebGL 2 及浮点渲染目标等能力。

主包 b-map-viewer 不再导出 CloudUltraEffect,WeatherEffects 和 WeatherSystem 也不再包含 Ultra。升级旧代码时,请改为上面的独立包导入方式。

构造参数 ​

new CloudUltraEffect(viewer, options)

字段默认值作用
enabledtrue初始是否显示云及配套大气
coverage0.3云量覆盖度,0~1
exposure10云与大气合成曝光,0.1~40
windSpeed10风速,米/秒,0~100
windDirection0风向角,0 北、90 东,单位:度
layers三个活动层及一个空层1~4 个云层配置
steps500主视线最大步进次数,16~1024
shadowSteps50云阴影最大步进次数,8~256
maxDistance200000最远光线步进距离,米
temporalUpscalefalse以低分辨率计算云并通过时间升采样输出完整画面
perfOptimizefalse阴影贴图从 512 降至 256 像素
enableShadowtrue是否计算级联云阴影
enableCloudShadowtrue是否将云阴影投射到地表
cloudShadowStrength1地表云影强度,0~1
enableGlobeLightingtrue云显示期间是否启用地表太阳光照
enableAerialPerspectivetrue是否启用地表空气透视
aerialPerspectiveScale1空气透视强度,0~2
terrainCliptrue是否按当前场景地形深度裁剪云
scatteringCoefficient1散射系数
absorptionCoefficient0吸收系数
temporalAlpha0.05时间抗锯齿当前帧混合权重
varianceGamma2历史帧裁剪范围
timeout120000首次资源准备超时,毫秒
onProgress—资源准备进度回调,0~100
onError—加载或运行错误回调

默认沿用迁入管线的质量参数;示例开启时间升采样和阴影降采样以降低计算量。enableShadow: false 时地表云影也不生效。

云层字段 ​

layers 按顺序替换云层,未提供的层关闭。setOptions({ layers }) 同样按整组替换,最多四层。

字段作用
altitude云底高度,米
height云层厚度,米;0 关闭该层
densityScale云层密度倍率
shadow此层是否参与云阴影
shapeAmount大尺度三维形状强度
shapeDetailAmount小尺度形状细节强度
weatherExponent天气纹理分布指数
shapeAlteringBias云形偏移
coverageFilterWidth覆盖度过渡宽度
densityProfile垂直密度剖面,含 expTerm、exponent、linearTerm、constantTerm

高度依据云管线的地球大气模型,不是随地形抬升的离地高度。山区应将云底设置在当地地形以上。

生命周期 ​

接口作用
readyPromise等待资源和初始渲染就绪;加载失败或取消时拒绝
ready / progress / error查询当前就绪状态、进度和错误
load(options?)释放旧管线并重新加载,返回新的 Promise
setOptions(options)更新参数,返回当前实例
getOptions()返回独立配置副本,包含云层和密度剖面
getStage()返回本效果的多阶段云管线,不是单个 PostProcessStage
show() / start()显示云、大气及配套光照
hide() / stop()暂停云渲染、保留 GPU 资源,并恢复原天空与光照
remove()中止加载、移除监听、释放 GPU 资源并恢复场景;可再次 load()
destroy()永久销毁实例;重复调用安全
isDestroyed()查询实例是否已永久销毁

同一场景只允许一个 Ultra 管线。hide 不触发重新烘焙,remove / destroy 会释放噪声纹理、大气 LUT、帧缓冲、历史纹理、着色程序及 Worker。首次加载中切换示例或卸载页面也会中止当前任务。

按需加载与资源管理 ​

也可以在进入云场景时才加载代码:

js
const { CloudUltraEffect } = await import('@b-map-viewer/cloud-ultra')
const cloud = new CloudUltraEffect(viewer, {
  temporalUpscale: true,
})
await cloud.readyPromise
cloud.setOptions({ coverage: 0.4 })
cloud.hide()
cloud.show()
// 离开云场景或切换到其他天气前释放
cloud.destroy()

噪声和大气资源随独立包发布,并由 CloudUltraEffect 自动加载,无需配置 assetUrl、复制资源或引入 cloudUltraAssets 插件。仅安装 b-map-viewer 不会下载这些资源;安装 Ultra 包后,其资源仍会占用本地空间,创建效果时才请求资源模块。

Vite 应用继续使用 vite-plugin-cesium 处理 Cesium 自身的运行时资源。直接以 UMD 脚本使用时,全局入口为 BMapViewerCloudUltra.CloudUltraEffect,部署时需保留 dist 下入口脚本与 assets 的相对目录关系。

基于 Apache-2.0 许可发布