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

前端~三维地图(cesium)动态材质扩散圆环

定义自定义材质
import * as Cesium from "cesium";// 着色器代码抽离为常量
const DiffuseCircleShaderSource = `uniform vec4 color;uniform float speed;uniform float count;uniform float gradient;czm_material czm_getMaterial(czm_materialInput materialInput){czm_material material = czm_getDefaultMaterial(materialInput);material.diffuse = 1.5 * color.rgb;vec2 st = materialInput.st;float dis = distance(st, vec2(0.5, 0.5));float per = fract(czm_frameNumber * speed / 1000.0);if(count == 1.0){if(dis > per * 0.5){discard;} else {material.alpha = color.a * dis / per / 2.0;}} else {vec3 str = materialInput.str;if(abs(str.z) > 0.001){discard;}if(dis > 0.5){discard;} else {float perDis = 0.5 / count;float disNum;float bl = 0.0;for(int i = 0; i <= 999; i++){if(float(i) <= count){disNum = perDis * float(i) - dis + per / count;if(disNum > 0.0){if(disNum < perDis){bl = 1.0 - disNum / perDis;} else if(disNum - perDis < perDis){bl = 1.0 - abs(1.0 - disNum / perDis);}material.alpha = pow(bl, (1.0 + 10.0 * (1.0 - gradient)));}}}}}return material;}
`;// 参数类型定义
type DiffuseCircleOptions = {color: Cesium.Color;speed: number;circleCount: number;gradient: number;
};// 材质类定义
export class DiffuseCircleMaterial extends Cesium.Material {constructor(options: DiffuseCircleOptions) {const { color, speed, circleCount, gradient } = options; // 解构参数super({translucent: false,fabric: {type: "DiffuseCircle",uniforms: {color,speed,count: circleCount,gradient,},source: DiffuseCircleShaderSource, // 使用抽离的着色器代码},});}
}
调用自定义材质
// 测试自定义材质const circleGeometry = new Cesium.CircleGeometry({center: Cesium.Cartesian3.fromDegrees(125.310767, 43.820491, 1000000),radius: 10000,});const circleInstance = new Cesium.GeometryInstance({geometry: circleGeometry,});// 创建外观const appearance = new Cesium.EllipsoidSurfaceAppearance({material: new DiffuseCircleMaterial({color: new Cesium.Color(1.0, 0.0, 0.0, 1.0),speed: 5.0,circleCount: 5,gradient: 0.4,}),});// 创建圆形图元const circlePrimitive = new Cesium.Primitive({geometryInstances: circleInstance,appearance: appearance,});// 添加到场景viewer.scene.primitives.add(circlePrimitive);

相关文章:

  • 编译openssl源码
  • LLM定制新路径:微调与上下文学习的博弈与融合
  • JS中本地存储(LocalStorage)和会话存储(sessionStorage)的使用和区别
  • python使用matplotlib画图
  • 交易所功能设计的核心架构与创新实践
  • 日语学习-日语知识点小记-构建基础-JLPT-N4阶段(21):复习
  • 一般枚举题目合集
  • 【HALCON】 HALCON 教程:正确使用 `get_dict_tuple` 获取字典内容
  • gd32e230c8t6 keil6工程模板
  • loss = -F.log_softmax(logits[:, -1, :], dim=1)[0, irrational_id]
  • 快消零售AI转型:R²AIN SUITE如何破解效率困局
  • CK-S654-PA60一拖四分体式半导体电子货架专用RFID读写器|读码器接线使用说明
  • java day 11
  • acwing 1488. 最短距离 超级源点 最短路 堆优化Dijkstra
  • 03_朴素贝叶斯分类
  • The 2022 ICPC Asia Xian Regional Contest(E,L)题解
  • 鸿蒙:DevEco Studio配置ohpm时,cmd正常,在终端出现‘ohpm‘ 不是内部或外部命令,也不是可运行的程序 或批处理文件。
  • PHP 编程:现代 Web 开发的基石与演进
  • Vue.js 组件开发指南
  • vim启动的时候,执行gg
  • 伊朗最高领袖顾问:伊朗愿承诺永不制造核武,换取美解除制裁
  • 上海虹桥国际咖啡文化节周五开幕,来看Coffeewalk通关攻略
  • 中国巴西关于乌克兰危机的联合声明
  • 75万买299元路由器后续:重庆市纪委、财政局、教委联合调查
  • 熊出没!我驻日本札幌总领馆提示中国公民注意人身安全
  • 郑州通报涉“健康证”办理有关问题查处进展情况