Cesium阴影相关

目的

记录一下自己学习 Cesium 阴影相关的内容,避免以后又重复踩坑

阴影的加载

阴影的加载其实很简单,只需要加载地球的时候设置对应的参数即可

viewer.scene.globe.enableLighting = true; //是否开启全局光照
viewer.shadows = true; //是否开启阴影
viewer.shadowMap.darkness = 0.6; //阴影透明度--越大越透明

这样阴影就出来了,如下图所示
img
但是没那么简单,放大看,可以看到明显的锯齿和毛刺【后面有机会再尝试增加软阴影的效果】
img

日照分析也是同理,如下图所示,日照阴影随着时间流逝,阴影所在的地方发生变化
img

日照分析

原理

改变 viewer 所在的 clockViewModel 即可让太阳所在的位置随着时间的改变而改变

JulianDate

想要改变cesium世界所在的时间,就需要改变通过JulianDate进行改变

其实JulianDate与JS中的Date是差不多的,首先在js中获取当前所在时间

let t = new Date()//t即为当前所在的时间
let mitert = t.getTime()//返回的是毫秒数

其次把当前时间转换为JulianDate的代码

Cesium.JulianDate.fromDate(new Date(mitert));

下面日照分析的代码就是通过毫秒数加setInterval来改变当前时间,进而影响日照的阴影

日照分析的代码

const openSunLight = () => {
  const option = {
    date: new Date().getTime(), //当前所在的时间
    darkness: 0.4, //阴影透明度
  };
  viewer.scene.globe.enableLighting = true;
  viewer.shadows = true;
  viewer.terrainShadows = Cesium.ShadowMode.RECEIVE_ONLY;
  viewer.shadowMap.darkness = option.darkness; //阴影透明度--越大越透明
  let time = 0
  inter = setInterval(() => {
    let date = option.date + time;
    if (null == option.date) {
      //时间传空的时候,就从当前时间开始
      date = new Date().getTime();
    }
    let utc = Cesium.JulianDate.fromDate(new Date(date));
    viewer.clockViewModel.currentTime = Cesium.JulianDate.addHours(
      utc,
      0,
      new Cesium.JulianDate()
    );
    // time = time + 1000 * 60;.
    // time = time + 60 * 60;
  }, option.speed);
};

取消日照分析,同理把相关的参数关闭即可

const closeSunLight = () => {
  viewer.scene.globe.enableLighting = false;

  viewer.shadows = false;

  viewer.terrainShadows = Cesium.ShadowMode.DISABLED;

  if (inter) {
    clearInterval(inter);

    inter = null;
  }
};
posted @ 2022-11-23 19:10  百年内必成大牛  阅读(539)  评论(0编辑  收藏  举报