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

【CesiumJS材质】(1)圆扩散

效果示例

最佳实践:
请添加图片描述

其他效果:
请添加图片描述
要素说明: 在这里插入图片描述

代码

/** @Date: 2023-07-21 15:15:32* @LastEditors: ReBeX  420659880@qq.com* @LastEditTime: 2023-07-27 11:13:17* @FilePath: \cesium-tyro-blog\src\utils\Material\EllipsoidFadeMaterialProperty.js* @Description: 扩散圆材质*/
import * as Cesium from 'cesium'export default class EllipsoidFadeMaterialProperty {constructor(options) {this._definitionChanged = new Cesium.Event();this._color = undefined;this._colorSubscription = undefined;this._time = (new Date()).getTime();this.color = options.color;this.duration = options.duration;};get isConstant() {return false;}get definitionChanged() {return this._definitionChanged;}getType(time) {return Cesium.Material.EllipsoidFadeMaterialType;}getValue(time, result) {if (!Cesium.defined(result)) {result = {};}result.color = Cesium.Property.getValueOrClonedDefault(this._color, time, Cesium.Color.WHITE, result.color);result.time = (((new Date()).getTime() - this._time) % this.duration) / this.duration;return result;}equals(other) {return (this === other ||(other instanceof EllipsoidFadeMaterialProperty &&Property.equals(this._color, other._color)))}
}Object.defineProperties(EllipsoidFadeMaterialProperty.prototype, {color: Cesium.createPropertyDescriptor('color'),
})// Cesium.EllipsoidFadeMaterialProperty = EllipsoidFadeMaterialProperty;
Cesium.Material.EllipsoidFadeMaterialProperty = 'EllipsoidFadeMaterialProperty';
Cesium.Material.EllipsoidFadeMaterialType = 'EllipsoidFadeMaterialType';
Cesium.Material.EllipsoidFadeMaterialSource =`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(time);if(dis > per * 0.5){material.alpha = 0.0;discard;}else {material.alpha = color.a  * dis / per / 1.0;}return material;}`Cesium.Material._materialCache.addMaterial(Cesium.Material.EllipsoidFadeMaterialType, {fabric: {type: Cesium.Material.EllipsoidFadeMaterialType,uniforms: {color: new Cesium.Color(1.0, 0.0, 0.0, 1),time: 0},source: Cesium.Material.EllipsoidFadeMaterialSource},translucent: function (material) {return true;}
})
console.log('成功加载扩散圆材质');// ? 如何使用
// import EllipsoidFadeMaterialProperty from '@/utils/Material/EllipsoidFadeMaterialProperty.js'// material: new EllipsoidFadeMaterialProperty({
//   color: new Cesium.Color(1.0, 1.0, 0.0, 0.8),
//   duration: 3000,
// })

用例

import EllipsoidFadeMaterialProperty from '@/utils/Material/EllipsoidFadeMaterialProperty.js' // 引入这个材质类
import { viewer } from '@/utils/createCesium.js' // 引入地图对象
import * as Cesium from 'cesium'const ellipse= viewer.entities.add({position: Cesium.Cartesian3.fromDegrees(50, 50),ellipse: {semiMajorAxis: 150000.0, // 长半轴距离semiMinorAxis: 150000.0, // 短半轴距离// ! 重点material: new EllipsoidFadeMaterialProperty({color: new Cesium.Color(1.0, 1.0, 0.0, 0.8),duration: 3000,}),}
});
viewer.zoomTo(ellipse);

着色器

实现一个自定义材质的核心,是fabric对象的source属性,下面是本材质的基于GLSL语法的着色器代码:

  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(time);if(dis > per * 0.5){material.alpha = 0.0;discard;}else {material.alpha = color.a  * dis / per / 1.0;}return material;}

代码的主要功能是根据输入的 materialInput 创建一个材质对象 material,然后根据一些逻辑对该材质进行修改,并最终返回修改后的材质。

以下是代码的解释:

  1. 创建默认材质:通过调用函数 czm_getDefaultMaterial(materialInput) 创建一个默认的材质对象,并将其赋值给变量 material
  2. 修改漫反射颜色:将 material.diffuse 设置为当前的颜色值 color.rgb 的 1.5 倍。这可以改变材质的漫反射颜色。
  3. 计算距离和比例:通过 materialInput.st 获取纹理坐标,并计算该纹理坐标到 (0.5, 0.5) 的距离 dis。然后使用全局变量 time 计算当前时间的小数部分 per
  4. 判断距离条件:如果 dis 大于 per 乘以 0.5,进入 if 语句块。在该语句块中,将 material.alpha 设置为 0.0,表示完全透明,并使用 discard 关键字丢弃当前片段(绘制无效)。这个条件语句的目的是根据距离和当前时间来控制透明度和可见性。
  5. 计算透明度:如果不满足上述距离条件,进入 else 语句块。在该语句块中,将 material.alpha 设置为 color.a 乘以 dis 除以 per 除以 1.0 的结果。意味着根据距离、时间和颜色的透明度来动态调整材质的透明度。
  6. 返回修改后的材质:将修改后的材质 material 返回作为函数的结果。

参考

  1. Cesium自定义材质Material以及一些思考_czm_material_GhostPaints的博客-CSDN博客
http://www.lryc.cn/news/100897.html

相关文章:

  • 实战-单例模式和创建生产者相结合
  • [SQL挖掘机] - 窗口函数介绍
  • 原生js实现锚点滚动顶部
  • 使用mysql接口遇到点问题
  • excel绘制折线图或者散点图
  • ChatGPT长文本对话输入方法
  • FFmpeg-swresample的更新
  • 回答网友 修改一个exe
  • 数据可视化 - 动态柱状图
  • 【JVM】JVM五大内存区域介绍
  • 自动驾驶感知系统--惯性导航定位系统
  • Netty简介
  • 基于TCP/IP对等模型对计算机网络知识点的整合
  • 【SQL应知应会】表分区(一)• Oracle版
  • PostgreSQL 常用空间处理函数
  • ubuntu初始化/修改root密码
  • 【Linux后端服务器开发】select多路转接IO服务器
  • 支持向量机(iris)
  • 24考研数据结构-第二章:线性表
  • Mybatis 动态 sql 是做什么的?都有哪些动态 sql?能简述动态 sql 的执行原理不?
  • 250_C++_typedef std::function<int(std::vector<int> vtBits)> fnChkSstStt
  • 无涯教程-jQuery - Transfer方法函数
  • openGauss学习笔记-24 openGauss 简单数据管理-模式匹配操作符
  • JAVASE---数据类型与变量
  • IDEA Groovy 脚本一键生成实体类<mybatisplus>
  • 无涯教程-jQuery - Puff方法函数
  • 什么叫前后端分离?为什么需要前后端问题?解决了什么问题?
  • Vector<T> 动态数组(随机访问迭代器)(答案)
  • Istio 故障注入与重试的实验
  • Java设计模式-中介者模式