Cesium绘制流动管线

目录

一、第一种方式 

二、第二种方式

1.安装gsap 

 2.引入


一、第一种方式 

使用viewer.clock

Clock文档

viewer.clock文档

vec4 colorImage = texture2D(image, vec2(fract(st.s - time), st.t));这里,因为使用的是高版本的cesium1.108,直接写texture2D会报错:

报错原因:Cesium 自 1.102.0 开始,为了更好支持跨平台,尤其是移动端,Cesium 默认使用 WebGL2 上下文,如果想使用 WebGL1 上下文,需要在地球初始化的时候设置相应的参数。为了在 WebGL2 上下文中工作,任何自定义材质、自定义图元和自定义着色器都需要升级到使用 GLSL 300。

1. 初始化地球时(不推荐),传入参数,使用 WebGL1 上下文 

const viewer = new Viewer("cesiumContainer", {
  // 指定上下文
  contextOptions: {
    requestWebgl1: true,
  },
});

 2. 修正 GLSL 代码(推荐)

   错误代码(texture2D)

vec4 colorImage = texture2D(image, vec2(fract(st.s - time), st.t))

   修正为:

vec4 colorImage = texture(image, vec2(fract(st.s - time), st.t));

Cesium 对象已经被其他库或代码修改为不可扩展,导致你无法向它添加新的属性或方法。为了解决这个问题,可以考虑使用另一个对象来替代 Cesium 对象,并向它添加你需要的属性和方法,就可以了  

import * as Cesium from "cesium";
 
// 创建一个新对象,包含所有原始的 Cesium 属性和方法
const CesiumExtensions = Object.assign({}, Cesium);
 
// 向该对象添加新的属性和方法
CesiumExtensions.myCustomMethod = function() {
  // ...
};
 
// 将原始的 Cesium 对象替换为新的对象
window.Cesium = CesiumExtensions;

首先需要使用import("./data/基础管线.json").then(res=>{})异步加载json文件,其次依次遍历,使用Cesium.Cartesian3.fromDegreesArray()方法将经纬度坐标转换为笛卡尔坐标,设置geometry的默认颜色、线宽,Cesium.PolylineGeometry创建线段的几何实例,创建一个新的Cesium.Material对象,并设置其fabric属性,用于定义材质的外观和行为。

在czm_material czm_getMaterial(czm_materialInput materialInput)函数中,使用texture()函数获取当前时间下的纹理颜色,并将其作为材质的漫反射颜色。再将纹理颜色的alpha值设置为材质的透明度。最后,同时将材质返回给Cesium进行渲染。然后将单个geometry合并一次传输,提高渲染效率。最后通过CesiumViewer.clock.onTick事件,根据当前时间更新材质中的time属性。这个属性用于控制纹理的平移,从而实现流动线的效果。 

viewer.clock.onTick.addEventListener(function (clock) {
          const startTime = Cesium.JulianDate.toDate(
            viewer.clock.startTime
          ).getTime();
          const currentTime = Cesium.JulianDate.toDate(
            clock.currentTime
          ).getTime();
          const elapsedTime = (currentTime - startTime) / 1000.0;
          material.uniforms.time = elapsedTime;
        });

 DrawGaspAnimatGroundPolylinePrimitiveFun4() {
      import("./data/基础管线.json").then((res) => {
        console.log("res", res);
        let InitXList = [];
        let InitYList = [];
        this.primitiveCollection = new Cesium.PrimitiveCollection();
        let instanceList = [];
        res.Response.Pipe.map((ele, index) => {
          let PipeLists = [];
          ele.map((el) => {
            PipeLists.push(+el.X, +el.Y);
            InitXList.push(+el.X);
            InitYList.push(+el.Y);
          });
          
          const polyline = new Cesium.PolylineGeometry({
            positions: Cesium.Cartesian3.fromDegreesArray(PipeLists),
            width: 2,
            vertexFormat: Cesium.PolylineMaterialAppearance.VERTEX_FORMAT,
          });
          const polygon = new Cesium.GeometryInstance({
            geometry: polyline,
            id: index + Math.random(new Date()),
          });
          instanceList.push(polygon);
        });
        /* ********************** */
        let imageUrl = require("./data/Water_1_M_Flow3.jpg");
        const material = new Cesium.Material({
          fabric: {
            type: "Spriteline1",
            uniforms: {
              color: Cesium.Color.WHITE,
              image: imageUrl,
              transparent: true,
              time: 0,
            },
            source: `
        czm_material czm_getMaterial(czm_materialInput materialInput)
        {
            czm_material material = czm_getDefaultMaterial(materialInput);
            vec2 st = materialInput.st;
            vec4 colorImage = texture(image, vec2(fract(st.s - time), st.t));
            material.alpha = colorImage.a;
            material.diffuse = colorImage.rgb / 2.0;
            return material;
        }
      `,
          },
        });

        this.primitiveCollection.add(
          new Cesium.Primitive({
            geometryInstances: instanceList,
            appearance: new Cesium.PolylineMaterialAppearance({
              flat: true,
              material: material,
            }),
          })
        );
        viewer.scene.primitives.add(this.primitiveCollection);
        let XList = InitXList.sort((a, b) => a - b);
        let YList = InitYList.sort((a, b) => a - b);
        viewer.camera.setView({
          destination: Cesium.Rectangle.fromDegrees(
            XList[0],
            YList[0],
            XList[XList.length - 1],
            YList[YList.length - 1]
          ),
        });
        viewer.clock.onTick.addEventListener(function (clock) {
          const startTime = Cesium.JulianDate.toDate(
            viewer.clock.startTime
          ).getTime();
          const currentTime = Cesium.JulianDate.toDate(
            clock.currentTime
          ).getTime();
          const elapsedTime = (currentTime - startTime) / 1000.0;
          material.uniforms.time = elapsedTime;
        });

        /* ********************** */
      });
    },

二、第二种方式

1.安装gsap 

npm install gsap

 2.引入

import gsap from "gsap";

 DrawGaspAnimatGroundPolylinePrimitiveFun3() {
      import("./data/基础管线.json").then((res) => {
        console.log("res", res);
        let InitXList = [];
        let InitYList = [];
        this.primitiveCollection = new Cesium.PrimitiveCollection();
        let instanceList = [];
        res.Response.Pipe.map((ele, index) => {
          let PipeLists = [];
          ele.map((el) => {
            PipeLists.push(+el.X, +el.Y);
            InitXList.push(+el.X);
            InitYList.push(+el.Y);
          });
          
          const polyline = new Cesium.PolylineGeometry({
            positions: Cesium.Cartesian3.fromDegreesArray(PipeLists),
            width: 2,
            vertexFormat: Cesium.PolylineMaterialAppearance.VERTEX_FORMAT,
          });
          const polygon = new Cesium.GeometryInstance({
            geometry: polyline,
            id: `Polyline${index}`,
          });
          instanceList.push(polygon);
        });

        /* ********************** */
        let imageUrl = require("./data/Water_1_M_Flow3.jpg");
        const material = new Cesium.Material({
          // fabric: {
          //   type: "Color",
          //   uniforms: {
          //     color: new Cesium.Color(0.0, 1.0, 0.0, 1.0),
          //   },
          // },
          fabric: {
            //type: "Spriteline1",
            uniforms: {
              color: Cesium.Color.BLACK,
              transparent: true,
              uTime: 0,
              uImg: imageUrl,
            },
            source: `
            czm_material czm_getMaterial(czm_materialInput materialInput)
                            {
                                // 生成默认的基础材质
                                czm_material material = czm_getDefaultMaterial(materialInput);
                                vec2 st = materialInput.st;
                                // 定义动画持续时间,从0到1
                                float durationTime = 1.0;
                                // 获取当前帧数,fract(x) 返回x的小数部分
                                float time = fract(czm_frameNumber / (60.0 * durationTime));
                                // 根据uv采样颜色
                                vec4 color = texture(uImg,vec2(fract(st.s - time),st.t));
                                material.alpha = color.a;
                                material.diffuse = color.rgb;
                                return material;
                            }
      `,
          },
        });
        /* ********************** */
        //使用gasp实现补间动画,完成动画效果
        gsap.to(material.uniforms, {
          uTime: 1,
          duration: 0.1,
          repeat: -1,
          ease: "linear",
          yoyo: false,
        });
        /* ********************** */
        this.primitiveCollection.add(
          new Cesium.Primitive({
            geometryInstances: instanceList,
            appearance: new Cesium.PolylineMaterialAppearance({
              flat: true,
              material: material,
            }),
          })
        );
        viewer.scene.primitives.add(this.primitiveCollection);
        let XList = InitXList.sort((a, b) => a - b);
        let YList = InitYList.sort((a, b) => a - b);
        viewer.camera.setView({
          destination: Cesium.Rectangle.fromDegrees(
            XList[0],
            YList[0],
            XList[XList.length - 1],
            YList[YList.length - 1]
          ),
        });
      });
    },

或者

    DrawGaspAnimatGroundPolylinePrimitiveFun2() {
      import("./data/基础管线.json").then((res) => {
        console.log("res", res);
        let InitXList = [];
        let InitYList = [];
        this.primitiveCollection = new Cesium.PrimitiveCollection();
        let instanceList = [];
        res.Response.Pipe.map((ele, index) => {
          let PipeLists = [];
          ele.map((el) => {
            PipeLists.push(+el.X, +el.Y);
            InitXList.push(+el.X);
            InitYList.push(+el.Y);
          });
          //console.log("PipeLists", PipeLists);
          let instance = new Cesium.GeometryInstance({
            geometry: new Cesium.GroundPolylineGeometry({
              positions: Cesium.Cartesian3.fromDegreesArray(PipeLists),
              loop: true,
              width: 4.0,
              height: 300000,
              extrudedHeight: 400000,
            }),
            attributes: {
              // color: index % 2 ? Cesium.ColorGeometryInstanceAttribute.fromColor(Cesium.Color.fromCssColorString('blue').withAlpha(0.9)) : Cesium.ColorGeometryInstanceAttribute.fromColor(Cesium.Color.fromCssColorString('red').withAlpha(0.9)),
              color: Cesium.ColorGeometryInstanceAttribute.fromColor(
                Cesium.Color.fromCssColorString("#318ee4")
              ),
              distanceDisplayCondition:
                new Cesium.DistanceDisplayConditionGeometryInstanceAttribute(
                  1000,
                  30000
                ),
            },
            id: `Polyline${index}`,
          });
          instanceList.push(instance);
        });
        /* ********************** */
        /*  material */
        let img = require("./data/Water_1_M_Flow3.jpg");
        let material = new Cesium.Material({
          fabric: {
            uniforms: {
              uTime: 0,
              uImg: img,
            },
            source: `
                            czm_material czm_getMaterial(czm_materialInput materialInput)
                            {
                                // 生成默认的基础材质
                                czm_material material = czm_getDefaultMaterial(materialInput);
                                vec2 st = materialInput.st;
                                // 定义动画持续时间,从0到1
                                float durationTime = 1.0;
                                // 获取当前帧数,fract(x) 返回x的小数部分
                                float time = fract(czm_frameNumber / (60.0 * durationTime));
                                // 根据uv采样颜色
                                vec4 color = texture(uImg,vec2(fract(st.s - time),st.t));
                                material.alpha = color.a;
                                material.diffuse = color.rgb;
                                return material;
                            }
                            `,
          },
        });
        /*********************** */
        //使用gasp实现补间动画,完成动画效果
        gsap.to(material.uniforms, {
          uTime: 1,
          duration: 0.1,
          repeat: -1,
          ease: "linear",
          yoyo: false,
        });
        /* ********************** */
        let appearance = new Cesium.PolylineMaterialAppearance({
          material: material,
          aboveGround: false,
          translucent: true,
        });
        this.groundPolylinePrimitive = new Cesium.GroundPolylinePrimitive({
          geometryInstances: instanceList,
          appearance: appearance,
        });
        this.primitiveCollection.add(this.groundPolylinePrimitive);
        this.Tileset = viewer.scene.groundPrimitives.add(
          this.primitiveCollection
        );
        let XList = InitXList.sort((a, b) => a - b);
        let YList = InitYList.sort((a, b) => a - b);
        viewer.camera.setView({
          destination: Cesium.Rectangle.fromDegrees(
            XList[0],
            YList[0],
            XList[XList.length - 1],
            YList[YList.length - 1]
          ),
        });
      });
    },

参考链接:icon-default.png?t=N7T8https://blog.csdn.net/qq_37435704/article/details/130928690

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/348738.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

计数指针:shared_ptr (共享指针)与函数 笔记

推荐B站视频: 4.shared_ptr计数指针_哔哩哔哩_bilibilihttps://www.bilibili.com/video/BV18B4y187uL?p4&vd_sourcea934d7fc6f47698a29dac90a922ba5a3 5.shared_ptr与函数_哔哩哔哩_bilibilihttps://www.bilibili.com/video/BV18B4y187uL?p5&vd_sourcea…

JavaScript基础之输入输出与变量常量详解

输入和输出 输出和输入也可理解为人和计算机的交互,用户通过键盘、鼠标等向计算机输入信息,计算机处理后再展示结果给用户,这便是一次输入和输出的过程。 举例说明:如按键盘上的方向键,向上/下键可以滚动页面&#x…

C语言实现插入排序算法(附带源代码)

插入排序 插入排序(英语:Insertion Sort)是一种简单直观的排序算法。它的工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。插入排序在实现上,通常…

opencv012 滤波器04 中值滤波,双边滤波

中值滤波 取中位数,可以处理椒盐噪音 CV自带medianBlur函数dst cv2.medianBlur(src, ksize) 参数说明:1.src: 需要滤波的图片;2.ksize:核大小,必须是比1大的奇数【举个例子:3,5,7……

【RT-DETR有效改进】 | 主干篇 | RevColV1可逆列网络(特征解耦助力小目标检测)

前言 大家好,这里是RT-DETR有效涨点专栏。 本专栏的内容为根据ultralytics版本的RT-DETR进行改进,内容持续更新,每周更新文章数量3-10篇。 专栏以ResNet18、ResNet50为基础修改版本,同时修改内容也支持ResNet32、ResNet101和PP…

JDBC(Java DataBase Connectivity )

图片来源:动力节点老杜的JDBC视频讲解 JDBC(Java DataBase Connectivity ) 一、JDBC 的本质二、开始前的准备工作三、关于 JDBC 中的事务四、JDBC 编程六步1.注册驱动2.获取连接3.获取数据库操作对象4.执行SQL语句5.处理结果查询集6.释放资源…

SpringBoot_基础

学习目标 基于SpringBoot框架的程序开发步骤 熟练使用SpringBoot配置信息修改服务器配置 基于SpringBoot的完成SSM整合项目开发 一、SpringBoot简介 1. 入门案例 问题导入 SpringMVC的HelloWord程序大家还记得吗? SpringBoot是由Pivotal团队提供的全新框架&…

docker指令存档

目录 Docker 1、概念 2、架构图 3、安装 4、Docker怎么工作的? 5、Docker常用命令 帮助命令 镜像命令 1、查看镜像 2、帮助命令 3、搜索镜像 4、拉取镜像 5、删除镜像 容器命令 1、启动 2、查看运行的容器 3、删除容器 4、启动&停止 其他命令…

苹果Find My市场需求火爆,伦茨科技ST17H6x芯片助力客户量产

苹果发布AirTag发布以来,大家都更加注重物品的防丢,苹果的 Find My 就可以查找 iPhone、Mac、AirPods、Apple Watch,如今的Find My已经不单单可以查找苹果的设备,随着第三方设备的加入,将丰富Find My Network的版图。产…

蓝桥杯备战——3.定时器前后台

1.STC15F2k61S2的定时器 阅读STC15系列的手册,我们可以看到跟STC89C52RC的定时器还是有不同之处的: 由上图可以看到我们可以通过AUXR寄存器直接设置定时器的1T/12T模式了 在定时器0/1模式上也可以设置为16位自动重装载。 另外需要注意IAP15F2K61S2只有…

python 学习之 re库的基本使用(正则匹配)上

目录 一、基本用法 二、函数介绍 1、match函数 2、search 函数 3、compile 函数 4、findall 和 finditer 函数 5、sub 函数和 subn 函数 6、split 函数 一、基本用法 首先我们需要引入 re 库 代码基本框架使用两行代码实现 测试代码: import reret re.m…

Linux管道学习(无名管道)

目录 1、概述 2、管道的创建 3、管道读写行为 3.1、管道读 在linux中管道有两种,一是无名管道(匿名管道),第二种是有名管道;无名管道主要用于有血缘关系的父子进程间通信,有名管道则不受该限制&#xf…

描绘未知:数据缺乏场景的缺陷检测方案

了解更多方案内容,欢迎您访问官网:neuro-T | 友思特 机器视觉 光电检测;或联系销售经理:18124130753 导读: 深度学习模型帮助工业生产实现更加精确的缺陷检测,但其准确性可能受制于数据样本的数量。友思特…

Gradle学习笔记:Gradle的简介、下载与安装

文章目录 一、什么是Gradle二、为什么选择Gradle三、下载并安装Gradle四、Gradle的bin目录添加到环境变量五、测试Gradle是否安装正常 一、什么是Gradle Gradle是一个开源构建自动化工具,专为大型项目设计。它基于DSL(领域特定语言)编写&…

科大讯飞 再次引爆Ai

去年「科大讯飞版ChatGPT」星火大模型刚上线的时候,小编给大家推荐过一波,演示了其强大的功能,不少小伙伴都立马申请体验了一把,有小伙伴还私信我说功能非常强大,工作效率提高不少,支持国产大模型之类赞扬。…

idea 打包跳过测试

IDEA操作 点击蓝色的小球 手动命令 mvn clean package -Dmaven.test.skiptrue

音频格式之AAC:(2)AAC封装格式ADIF,ADTS,LATM,extradata及AAC ES存储格式

系列文章目录 音频格式的介绍文章系列: 音频编解码格式介绍(1) ADPCM:adpcm编解码原理及其代码实现 音频编解码格式介绍(2) MP3 :音频格式之MP3:(1)MP3封装格式简介 音频编解码格式介绍(2) MP3 :音频格式之MP3&#x…

unity学习笔记----游戏练习07

一、僵尸攻击和植物的掉血和销毁 当僵尸接触到植物开始攻击时会持续削减植物的血量,当植物血量为零时就销毁当前植物。 在plantManager中, 为植物添加一个血量HP 100, public int HP 100; 在写一个减少血量的方法,来减少血…

【RabbitMQ】交换机的概念及使用

一、引言 1、什么是交换机 RabbitMQ中,交换机是一个核心概念,主要用来将生产者生产出来的消息,传送到对应的队列中。实际上,生产者生产的消息从不会直接发送到队列,而是发送到交换机。交换机一方面接收来自生产者的消…

golang入门

学习方法 1、在实践中学 2、适当的囫囵吞枣,有可能学到后面,对前面的疑问焕然大悟 3、注重整体,刚开始不要去扣细节 安装 需要配置3个环境变量,如果.msi文件安装时设置好了就不需要了,自己可以检查下 GOROOT&…