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

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+时间”换成“距离+时间”,一个标准“雷达扫描圈”就呼之欲出了。

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

相关文章:

  • Day 42 复习日
  • 大模型Memory模块深度解析:从基础实现到高级应用!
  • 53.自定义工作队列传参
  • 安全VR:靠谱的VR安全体验馆厂商品牌榜,技术实力与落地案例
  • 灵遁者:我对于探索的热爱,从来没有减少过
  • 右值引用和移动语义
  • 基于PLC的智能路灯控制系统的设计
  • N-乙酰神经氨酸——连接生命与健康的“智慧糖链”核心组分 CAS:131-48-6
  • ZooKeeper:enableACL和requireClientSASLAuth
  • 为什么K8s 1.24 的容器时间调整会影响宿主机的时间啊?
  • AI时代核心竞争力:手写多智能体系统,不依赖LangChain/LlamaIndex
  • WebSocket 对比 MQTT通信优势
  • 基于springboot面料花型试衣系统
  • 域名被污染是什么意思?还能不能继续使用?
  • Python大数据基于深度学习的音乐推荐系统-250326--论文
  • Python大数据影评情感分析可视化及推荐系统的设计与实现_u5ck1y17_论文
  • AI Agent设计模式大揭秘:9种架构让你从编程小白变身架构师!
  • Python大数据基于Spark的南昌房价数据分析系统的设计与实现_45i0b357_论文
  • 9 个降AI率工具,自考人必备的降重神器!
  • 9 个降AI率工具,自考人必备!
  • 旅行记录应用新建旅行 - Cordova OpenHarmony 混合开发实战
  • 9 个降AI率工具推荐,继续教育学生必备
  • Java八股文(Java基础面试题)
  • 邦芒忠告:职场中没有好人缘的10种人
  • 基于Spring Boot人才招聘管理系统
  • 拒绝“魔法值”注入:手把手教你实现 Spring Boot 高性能枚举校验注解 @InEnum
  • 国内容易上手的claudecode一键配置指南
  • 复原IP地址
  • Redis 发布订阅
  • JQuery支持WebUploader完成百万文件断点续传的原理?