Cesium制作雷达MaterialProperty

效果图如下

import * as Cesium from 'cesium'
import gsap from 'gsap'
export default class RadarMaterialProperty {
  name: string
  params: {
    uTime: number
  }

  definitionChanged = new Cesium.Event()
  isConstant = false

  constructor(name: string = 'radar') {
    this.params = {
      uTime: 0
    }
    this.name = name
    ;(Cesium.Material as any)._materialCache.addMaterial(
      'RadarMaterialProperty',
      {
        fabric: {
          type: 'RadarMaterialProperty',
          uniforms: {
            uTime: this.params.uTime
          },
          source: `
        czm_material czm_getMaterial(czm_materialInput materialInput)
        {
          // 生成默认的基础材质
          czm_material material = czm_getDefaultMaterial(materialInput);
          // 旋转uv
          vec2 newSt = mat2(cos(uTime),-sin(uTime),sin(uTime),cos(uTime))*(materialInput.st - 0.5) + 0.5;
          vec2 st = newSt;
          // 设置圆,外部透明,内部不透明
          float alpha = step(distance(st,vec2(0.5,0.5)),0.5) * 0.5;
          material.alpha = alpha;
          material.diffuse = vec3(1.0,0.0,0.0);
          // 按照角度来设置强弱
          float angle = atan(st.s-0.5,st.t-0.5);
          float strength = smoothstep(3.1416,-3.1416,angle);
          // 将强弱与透明度结合
          material.diffuse = material.diffuse * strength;
          material.alpha = material.alpha * strength;
         
          return material;
        }
        `
        }
      }
    )
    this.animate()
  }
  getType(time?: Cesium.JulianDate) {
    return 'RadarMaterialProperty'
  }
  getValue(time: Cesium.JulianDate, result: { [key: string]: number }) {
    result.uTime = this.params.uTime
    return result
  }
  equals(other: Cesium.Property): boolean {
    // 判断两个材质是否相等
    return other instanceof RadarMaterialProperty && this.name === other.name
  }
  animate() {
    gsap.to(this.params, {
      uTime: Cesium.Math.PI * 2,
      duration: 1,
      repeat: -1,
      ease: 'linear'
    })
  }
}

 atan(y,x) : 用于将XY坐标转换为角度

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值