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

Cesium中实现流光线

概要

Cesium中实现流光线,本质上是在特定的时间改变颜色等属性即可。可以通过MaterialProperty实现,但是它是用在Entity上的,如果要用Primitvie上就得通过自定义的Material实现。要想Material实现会动的效果,需要借助Cesium的一些内置函数实现,比如:czm_frameNumber等。

一、Primitive流光线

class SpriteLineMaterial extends Cesium.Material { constructor(options) { options = SpriteLineMaterial.getDefaultOptions(options) const props = { fabric: { type: SpriteLineMaterial.TYPE, uniforms: options, source: SpriteLineMaterial.SOURCE } } super(props) } } SpriteLineMaterial.SOURCE = ` czm_material czm_getMaterial(czm_materialInput materialInput) { czm_material material = czm_getDefaultMaterial(materialInput); vec2 st = materialInput.st; float time = czm_frameNumber * animationSpeed; // 获取小数部分,负数小数部分+1 float s = fract(st.s - time); vec4 colorImage = texture(image, vec2(s, st.t)); material.alpha = colorImage.a; // 混色 material.diffuse = mix(colorImage.rgb, baseColor.rgb, 1.0); // 光泽 material.emission = baseColor.rgb * 0.5; return material; } ` SpriteLineMaterial.getDefaultOptions = function (options) { return Object.assign({ // 一张线性渐变图片。颜色无所谓,但要有透明度;尺寸无所谓,比如:200*1 image: DEFAULT_SPRITE_LINE, animationSpeed: 0.01, baseColor: Cesium.Color.YELLOW, }, options) } SpriteLineMaterial.TYPE = 'SpriteLine' // 使用 const primitive = new Cesium.Primitive({ geometryInstances: [...], // MaterialAppearance,PolylineMaterialAppearance appearance: new Cesium.PolylineMaterialAppearance({ material: new SpriteLineMaterial(options) }) })

二、Entity流光线

class SpriteLineMaterialProperty { constructor(options) { this._definitionChanged = new Cesium.Event() this._time = performance.now() options = SpriteLineMaterial.getDefaultOptions(options) this._animationSpeed = options.animationSpeed this._baseColor = options.baseColor this._image = options.image // 主要是这里,其他的照搬Cesium相关的MaterialProperty代码即可 Cesium.Material._materialCache.addMaterial(SpriteLineMaterial.TYPE, { fabric: { type: SpriteLineMaterial.TYPE, uniforms: options, source: SpriteLineMaterial.SOURCE } }) } getType() { return SpriteLineMaterial.TYPE } ...... } Object.defineProperties(SpriteLineMaterial.prototype, { isConstant: { get: function() { return false } }, definitionChanged: { get: function() { return this._definitionChanged } }, ...... }) // 使用 const entity = new Cesium.Entity({ polyline: { material: new SpriteLineMaterialProperty(options), ...... } })

效果

复杂些的效果,可依据上述代码实现,此处仅作简单实现

Cesium中实现流光线

http://www.cnnetsun.cn/news/9013.html

相关文章:

  • 为什么你的图片选择器总是出问题?这5个预防技巧让Bug无处可逃
  • 专业做PC耐力板的源头厂家哪个好
  • Wan2.2-T2V-A14B生成丝绸之路历史变迁动态地图
  • [Windows] 自动剪辑音频气口空隙工具
  • ANTLR4 C++目标终极实战指南:从零构建高性能语法解析器
  • 小兔鲜儿UniApp微信小程序开发实战:从零到上线的完整指南
  • HackRF PortaPack H1固件配置完整指南
  • GPT-5.2的发布:将如何影响未来的创作与文化传播?
  • 2025年内容优化工具选型指南:5款热门产品实测,精准匹配全场景需求
  • ArkOS开源游戏系统完整指南:从入门到精通
  • 从开发转到安全渗透工程师,是我做的最对的决定
  • 60亿消息表如何分库分表?
  • 干货分享,大厂内部压测方案设计
  • Python_work3
  • AFLplusplus模糊测试实战:10个高效调试技巧解决常见问题
  • 探索三电平T型LCL并网逆变器的双闭环PI + SVPWM控制仿真之旅
  • VSCode如何实时连接IBM Quantum?一文掌握核心配置参数(含实操代码)
  • python如何获取字符串最后一个字符
  • 赋能个体,智创全球——CCF 程序员大会“个人出海论坛”圆满落幕
  • 零基础学CMD:从关机命令开始的Windows命令行入门
  • Wan2.2-T2V-A14B与Runway Gen-3的技术差异全面对比
  • 为什么90%的工程师写不好Agentic Apps配置?Docker Compose权威解析
  • 【Azure量子开发权威解析】:掌握这8个考点,轻松拿下MCP认证
  • 第三方接口调用不用愁!JNPF 数据接口神技,鉴权 + 变量提取一键搞定
  • LED显示屏话筒生产厂家
  • 企业级Java开发:Eclipse定制化安装全攻略
  • 字节面试:如何测试RocketMQ、RocketMQ?测试点有哪些?
  • 访答:数字化时代的知识管理新范式
  • 基于Hadoop的游戏在线时长大数据分析系统毕业设计项目源码
  • 《智能座舱时代:车载HMI渲染引擎的选型、架构与实践》第 1 章 车载座舱对渲染的特殊要求