news 2026/4/16 15:58:32

Cesium快速入门25:自定义MaterialProperty

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Cesium快速入门25:自定义MaterialProperty

上一节课,我们能在 Primitive 里徒手写着色器;今天把“魔杖”伸回Entity——让它也用上完全自定义的材质。
思路一句话:Entity 只认MaterialProperty接口,我们手写一个类,把 Fabric + GLSL 塞进去,就能像官方材质一样随取随用。


一、MaterialProperty 接口长啥样?

官方把MaterialProperty当“抽象基类”,规定必须实现:

  • getType()—— 返回材质字符串 ID;

  • getValue(time, result)—— 每帧把最新 uniform 值写进 result;

  • definitionChanged—— 事件对象,通知 Entity“我变了,请重绘”。

照猫画虎,自己写个类即可。


二、最小能跑的案例:CustomMaterialProperty

步骤:

  1. 先在 Cesium 材质缓存里注册一个同名 Fabric;

  2. 再在getValue里不停刷新 uniform;

  3. Entity 里当普通材质用。

class CustomMaterialProperty { constructor() { // 1. 通知系统“我要变”的事件 this.definitionChanged = new Cesium.Event(); // 2. 把 Fabric 写进全局缓存,ID 叫 'CustomMaterial' Cesium.Material._materialCache.addMaterial('CustomMaterial', { fabric: { type: 'CustomMaterial', uniforms: { uTime: 0.0 // 初始值 }, source: ` czm_material czm_getMaterial(czm_materialInput materialInput) { czm_material mat = czm_getDefaultMaterial(materialInput); mat.diffuse = vec3(materialInput.st, uTime); // UV+时间当颜色 return mat; } ` } }); } // 3. 返回材质 ID getType() { return 'CustomMaterial'; } // 4. 每帧被 Entity 调用,把最新时间写回 uniform getValue(time, result) { result.uTime = (performance.now() / 1000) % 1; // 0~1 循环 return result; } }

代码写完后,当普通材质直接用:

const customMaterial = new CustomMaterialProperty(); viewer.entities.add({ name: 'Red translucent rectangle', rectangle: { coordinates: Cesium.Rectangle.fromDegrees(114.0, 23.4, 114.4, 23.6), extrudedHeight: 30000.0, material: customMaterial, // 自己的材质 }, });

刷新场景,矩形立刻带上“UV 彩条”,并且红色通道随时间流动——自定义成功!


三、想更平滑?交给 GSAP 去补间

performance.now()虽然简单,但节奏固定。
想要“呼吸”效果,可把 uniform 外包给 GSAP:

// 1. 先在构造函数里准备参数对象 this.params = { uTime: 0.0 }; gsap.to(this.params, { uTime: 1.0, duration: 2.0, repeat: -1, ease: 'linear' }); // 2. getValue 只负责“搬运” getValue(time, result) { result.uTime = this.params.uTime; return result; }

现在条纹会像扫描线一样来回走动,完全平滑。


四、常见坑提醒

  • ID 必须对应:Fabric 的type/getType()/ 缓存 key 三处要完全一致;

  • getValue里一定要return result,否则 Entity 拿不到新值;

  • 想刷新画面就触发this.definitionChanged.raiseEvent(this),Entity 才会重绘。


五、小结与展望

  • Entity 自定义材质 = 实现MaterialProperty接口 + 注册同名 Fabric。

  • 时间动画既能用performance.now(),也能让 GSAP 补间参数。

  • 下一步:把“UV+时间”换成“距离+时间”,一个标准“雷达扫描圈”就呼之欲出了。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/15 11:35:19

BGP的跨区域连接和同区域连接

目前为R1与R2、R3建立邻居关系AS200内部的邻居关系建立下面是相关配置R1ip route-static 2.2.2.0 255.255.255.0 1.1.1.2(R1与R3建立连接需要静态路由)R2R3R4同一个区域内需要做OSPF才能相互建立区域

作者头像 李华
网站建设 2026/4/16 10:13:17

单臂路由的实现

实验使用设备:一台AR2220路由器,一台S3700交换机,两台PC机第一步配置PC1和PC2,PC1:IP192.168.10.1 24位掩码,网关:192.168.10.254PC2:IP:192.168.20.1 24位掩码 网关…

作者头像 李华
网站建设 2026/4/15 14:35:12

TikTok运营能否带动B2B外贸?易营宝客户案例与效果分析

本文以易营宝客户案例,分析TikTok运营对B2B外贸、多语言SEO与外贸网站建设的带动与转化效果。文章面向信息调研者、采购人员、企业决策者、项目管理者及经销商等角色,围绕外贸获客链路、流量成本、线索质量与合规风险给出可执行洞见。通过案例数据、行业…

作者头像 李华
网站建设 2026/4/16 10:13:40

MindSpore开发之路(三):搭建开发环境

1. 基础环境评估:我的电脑能跑MindSpore吗? 在安装任何软件之前,了解其对“居住环境”的要求至关重要。MindSpore对硬件和操作系统有一定的要求,但门槛并不高,对初学者非常友好。 1.1 硬件需求 CPU: MindSpore对CPU…

作者头像 李华
网站建设 2026/4/16 10:17:36

大模型微调完全指南:从理论到LLaMA Factory实战,小白也能轻松掌握!

简介 本文详细介绍了大模型微调的概念、方法和实践流程。首先解释了微调相比完整训练的成本优势,然后介绍了微调的基本步骤。重点讲解了使用LLaMA Factory进行微调的完整过程,包括数据准备、格式转换和图形界面操作。最后说明了如何在Ollama中部署微调后…

作者头像 李华
网站建设 2026/4/16 12:05:55

内存的艺术:Ascend C算子开发中的高效内存管理与优化策略

目录 🎯 开篇摘要 一、 内存优化的认知升级:从功能正确到性能极致 1.1 为什么内存优化比计算优化更重要? 1.2 昇腾内存架构的硬件真相 二、 🏗️ 技术原理:内存优化的系统方法论 2.1 三段式流水线:As…

作者头像 李华