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

cesium特效扩散圆

前言

今天主要和大家介绍一下cesium中怎么实现一个扩散圆的效果!

基本原理

如果有一个红色的圆形,我们希望在shader里面把这个圆形变成一个从四周向中心透明渐变的圆应该怎么做呢?我们只需要通过"UV"去计算导中心(0.5,0.5)的距离就可以得到。在这里插入图片描述在这里插入图片描述

    //伪代码float dis = distance(uv, vec2(0.5, 0.5)); color.a = fract(dis); 

如果我希望圆形呈现一个慢慢变大的效果应该怎么做呢?我们只需要判断当dis大于某个阈值的时候透明度为零,否则不变,这个阈值随时间不断从0-1就行。

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

    //伪代码//fract函数去time的小数,范围0-1float per1 = fract(time); float dis = distance(uv, vec2(0.5, 0.5)); //step函数当dis大于per1的时候返回1,小于就返回0,float pass1 = step(per1, dis) == 0.0? color.a * dis / per1: 0.0;color.a = pass1; 

cesium实现

基本的原理就是这样,那接下来就让我们自cesium实现这个效果。

1.先用 primetive 创建一个圆形

    const instance = new Cesium.GeometryInstance({geometry: new Cesium.EllipseGeometry({center: Cesium.Cartesian3.fromDegrees(118, 23, 0),semiMinorAxis: 500,semiMajorAxis: 500,}),});

2.创建一个 MaterialAppearance,更具上面的原理修改 material 的 source,注意下面的代码我优化了一下效果,增加了两道波纹,并且实现了一个渐变消失的过程。

const appearance = new Cesium.MaterialAppearance({material: new Cesium.Material({fabric: {uniforms: {color: Cesium.Color.fromCssColorString(color),speed: 1,},source: `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 per1 = fract(czm_frameNumber * 0.032 * speed); float per2 = fract((czm_frameNumber * 0.032 * speed) - 0.3); float per3 = fract((czm_frameNumber * 0.032 * speed) - 0.6); float pass1 = step(per1 * 0.3, dis) == 0.0? color.a * dis / per1: 0.0;float pass2 = step(per2 * 0.3, dis) == 0.0? color.a * dis / per2: 0.0;float pass3 = step(per3 * 0.3, dis) == 0.0? color.a * dis / per3: 0.0;//实现每道扩散渐变消失的效果pass1 = pass1* (1.0 - per1) * 2.0;pass2 = pass2* (1.0 - per2) * 2.0;pass3 = pass3* (1.0 - per3) * 2.0;material.alpha = pass1; return material; }`,}}),
})

3.最终添加场景就行了

 let primitive = viewer.scene.primitives.add(new Cesium.Primitive({geometryInstances: instance,appearance: appearance})
);

扩散圆的效果到这里就介绍完毕啦,希望能对大家有所帮助!有问题可以在评论区留言~小编会定时回复大家的问题
在这里插入图片描述


http://www.mrgr.cn/news/74706.html

相关文章:

  • .net 支持跨平台(桌面)系列技术汇总
  • Git 多仓库提交用户信息动态设置
  • appscan使用
  • 「Mac玩转仓颉内测版27」基础篇7 - 字符串类型详解
  • 什么是 C++ 中的智能指针?有哪些类型的智能指针?
  • 佛山三水戴尔R740服务器黄灯故障处理
  • springboot濒危野生植物信息管理系统-计算机毕业设计源码06463
  • 使用Python实现对接Hadoop集群(通过Hive)并提供API接口
  • 丹摩征文活动|Llama3.1:零障碍部署,尽享无忧使用!
  • 鸿蒙学习基本概念
  • 【go从零单排】Spawning Processes 、Exec‘ing Processes
  • 01、Spring MVC入门程序
  • 室内定位论文精华-无人机与机器人在地下与室内环境中的自主导航与定位新技术
  • 高阶智驾「血拼」,跨域融合开启淘汰,谁会冲出重围,谁将出局?
  • RocketMQ-02 集群架构部署
  • jenkins使用cli发行uni-app到h5
  • ChatGPT提问prompt范例模板
  • ArkTs面向对象编程
  • 网络基础协议理论(SSH协议)
  • 校友会系统的实现ssm+论文源码调试讲解
  • PHP Session
  • 猫头虎分享: 小米大模型升级第二代MiLM2:从一代到二代,能力飞跃提升
  • 【postgresql初级使用】逻辑复制是对数据库对象进行复制,非常灵活的完成数据归集与分发
  • [经典] Sessionstorage用法?
  • 问:数据库的六种锁机制实践总结?
  • 系统安全第十一次作业题目及答案