133:vue+cesium 实现水波纹效果

作者: 还是大剑师兰特 ,曾为美国某知名大学计算机专业研究生,现为国内GIS领域高级前端工程师,优快云知名博主,深耕openlayers、leaflet、mapbox、cesium,canvas,echarts等技术开发,欢迎加微信(gis-dajianshi),一起交流。

查看本专栏目录 - 本文是第 133个示例

一、示例效果

二、示例简介

本示例介绍如何在vue+cesium中实现水波纹效果。水波纹效果通常是指在视觉设计、计算机图形学或者用户界面交互中模拟水面上产生的波动效果。这种效果可以用来增强用户的视觉体验。

三、配置方式

1)查看基础设置:https://xiaozhuanlan.com/topic/1374609285
或者同样查看:

/* * @Description: 波纹圆效果(和水波纹扩散类似,参考开源代码) * @Version: 1.0 */ class CircleRippleMaterialProperty { constructor(options) { this._definitionChanged = new Cesium.Event(); this._color = undefined; this._speed = undefined; this.color = options.color; this.speed = options.speed; this.count = options.count; this.gradient = options.gradient; }; get isConstant() { return false; } get definitionChanged() { return this._definitionChanged; } getType(time) { return Cesium.Material.CircleRippleMaterialType; } getValue(time, result) { if (!Cesium.defined(result)) { result = {}; } result.color = Cesium.Property.getValueOrDefault(this._color, time, Cesium.Color.RED, result.color); result.speed = Cesium.Property.getValueOrDefault(this._speed, time, 10, result.speed); result.count = this.count; result.gradient = this.gradient; return result } equals(other) { return (this === other || (other instanceof CircleRippleMaterialProperty && Cesium.Property.equals(this._color, other._color) && Cesium.Property.equals(this._speed, other._speed) && Cesium.Property.equals(this.count, other.count) && Cesium.Property.equals(this.gradient, other.gradient)) ) } } Object.defineProperties(CircleRippleMaterialProperty.prototype, { color: Cesium.createPropertyDescriptor('color'), speed: Cesium.createPropertyDescriptor('speed'), count: Cesium.createPropertyDescriptor('count'), gradient: Cesium.createPropertyDescriptor('gradient') }) Cesium.CircleRippleMaterialProperty = CircleRippleMaterialProperty; Cesium.Material.CircleRippleMaterialProperty = 'CircleRippleMaterialProperty'; Cesium.Material.CircleRippleMaterialType = 'CircleRippleMaterialType'; Cesium.Material.CircleRippleMaterialSource = ` 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; } ` Cesium.Material._materialCache.addMaterial(Cesium.Material.CircleRippleMaterialType, { fabric: { type: Cesium.Material.CircleRippleMaterialType, uniforms: { color: new Cesium.Color(1.0, 0.0, 0.0, 1.0), speed: 3.0, count: 4, gradient: 0.2 }, source: Cesium.Material.CircleRippleMaterialSource }, translucent: function(material) { return true; } }) 这是circleRippleMaterialProperty.js文件,结合这个我想在vue文件实现在指定坐标创建波纹圆的效果,以下为vue文件:<template> <div id="cesiumContainer" class="cesium-container"></div> </template> <script> import 'cesium/Build/Cesium/Widgets/widgets.css'; import * as Cesium from 'cesium'; let viewer = new Cesium.Viewer('cesiumContainer'); let entity = viewer.entities.add({ name:'圆形波纹', position: Cesium.Cartesian3.fromDegrees(116.397289 , 39.968679, 0 ), ellipse: { height: 200, // 短半轴、长半轴设置 semiMinorAxis: 300, semiMajorAxis: 300, material: new Cesium.CircleRippleMaterialProperty({ color: Cesium.Color.fromCssColorString("#00FFFF"), speed: 5, count: 4, gradient: 0 }) } }); viewer.flyTo(entity) 基于上述代码你修改一下然后告诉我完整的两个正确的代码
最新发布
07-06
评论 53
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

还是大剑师兰特

打赏一杯可口可乐

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值