cesium圆形扩散扫描效果封装

效果

在这里插入图片描述

封装类

优化了着色器代码;增加了边框大小调整参数,增加了清除效果方法
注:在页面销毁时需要调用清除方法

CircleDiffusion.clear()
/*** circleDiffusion:圆扩散特效封装类**/// 圆扩散
class CircleDiffusion {viewer;lastStageList;constructor(viewer) {this.viewer = viewer;this.lastStageList = [];// js语法的每行结尾的“分号”可写可不写}add(position,scanColor,maxRadius,duration,border) {this.lastStageList.push(this.showCircleScan(position, scanColor, maxRadius, duration, border))}clear() {this.lastStageList.forEach((ele) => {this.clearScanEffects(ele)})this.lastStageList = []}/*** 圆扩散* @param {*} position  扫描中心 如[117.270739,31.84309,32]* @param {*} scanColor 扫描颜色 如"rgba(0,255,0,1)"* @param {*} maxRadius 扫描半径,单位米 如1000米* @param {*} duration 持续时间,单位毫秒 如4000* @param {*} border 边框,如10*/showCircleScan(position,scanColor,maxRadius,duration,border) {const cartographicCenter = new Cesium.Cartographic(Cesium.Math.toRadians(position[0]),Cesium.Math.toRadians(position[1]),position[2])scanColor = new Cesium.Color.fromCssColorString(scanColor)const lastStage = this._addCircleScanPostStage(cartographicCenter,maxRadius,scanColor,duration,border)return lastStage}/*** 添加扩散效果扫描线* @param {*} cartographicCenter  扫描中心* @param {*} maxRadius 扫描半径* @param {*} scanColor  扫描颜色* @param {*} duration  持续时间* @param {*} border 边框,如10*/_addCircleScanPostStage(cartographicCenter,maxRadius,scanColor,duration,border) {const _Cartesian3Center =Cesium.Cartographic.toCartesian(cartographicCenter)const _Cartesian4Center = new Cesium.Cartesian4(_Cartesian3Center.x,_Cartesian3Center.y,_Cartesian3Center.z,1)const _CartograhpicCenter1 = new Cesium.Cartographic(cartographicCenter.longitude,cartographicCenter.latitude,cartographicCenter.height + 500)const _Cartesian3Center1 =Cesium.Cartographic.toCartesian(_CartograhpicCenter1)const _Cartesian4Center1 = new Cesium.Cartesian4(_Cartesian3Center1.x,_Cartesian3Center1.y,_Cartesian3Center1.z,1)const _time = new Date().getTime()const _scratchCartesian4Center = new Cesium.Cartesian4()const _scratchCartesian4Center1 = new Cesium.Cartesian4()const _scratchCartesian3Normal = new Cesium.Cartesian3()const _this = thisconst ScanPostStage = new Cesium.PostProcessStage({fragmentShader: _this._getScanSegmentShader(border),uniforms: {u_scanCenterEC: function() {const temp = Cesium.Matrix4.multiplyByVector(_this.viewer.camera._viewMatrix,_Cartesian4Center,_scratchCartesian4Center)return temp},u_scanPlaneNormalEC: function() {const temp = Cesium.Matrix4.multiplyByVector(_this.viewer.camera._viewMatrix,_Cartesian4Center,_scratchCartesian4Center)const temp1 = Cesium.Matrix4.multiplyByVector(_this.viewer.camera._viewMatrix,_Cartesian4Center1,_scratchCartesian4Center1)_scratchCartesian3Normal.x = temp1.x - temp.x_scratchCartesian3Normal.y = temp1.y - temp.y_scratchCartesian3Normal.z = temp1.z - temp.zCesium.Cartesian3.normalize(_scratchCartesian3Normal,_scratchCartesian3Normal)return _scratchCartesian3Normal},u_radius: function() {return ((maxRadius * ((new Date().getTime() - _time) % duration)) / duration)},u_scanColor: scanColor,},})this.viewer.scene.postProcessStages.add(ScanPostStage)return ScanPostStage}/*** 扩散效果Shader*/_getScanSegmentShader(border) {const scanSegmentShader =" uniform sampler2D colorTexture;\n\uniform sampler2D depthTexture;\n\in vec2 v_textureCoordinates;\n\uniform vec4 u_scanCenterEC;\n\uniform vec3 u_scanPlaneNormalEC;\n\uniform float u_radius;\n\out vec4 myOutputColor;\n\uniform vec4 u_scanColor;\n\\n\vec4 toEye(in vec2 uv, in float depth){\n\vec2 xy = vec2((uv.x * 2.0 - 1.0),(uv.y * 2.0 - 1.0));\n\vec4 posInCamera = czm_inverseProjection * vec4(xy, depth, 1.0);\n\posInCamera =posInCamera / posInCamera.w;\n\return posInCamera;\n\}\n\\n\vec3 pointProjectOnPlane(in vec3 planeNormal, in vec3 planeOrigin, in vec3 point){\n\vec3 v01 = point - planeOrigin;\n\float d = dot(planeNormal, v01) ;\n\return (point - planeNormal * d);\n\}\n\\n\float getDepth(in vec4 depth){\n\float z_window = czm_unpackDepth(depth);\n\z_window = czm_reverseLogDepth(z_window);\n\float n_range = czm_depthRange.near;\n\float f_range = czm_depthRange.far;\n\return (2.0 * z_window - n_range - f_range) / (f_range - n_range);\n\}\n\\n\void main(){\n\myOutputColor = texture(colorTexture, v_textureCoordinates);\n\float depth = getDepth(texture(depthTexture, v_textureCoordinates));\n\vec4 viewPos = toEye(v_textureCoordinates, depth);\n\vec3 prjOnPlane = pointProjectOnPlane(u_scanPlaneNormalEC.xyz, u_scanCenterEC.xyz, viewPos.xyz);\n\float dis = length(prjOnPlane.xyz - u_scanCenterEC.xyz);\n\if(dis < u_radius){\n\float f = 1.0 - abs(u_radius - dis) / u_radius;\n\f = pow(f, float(" +border  +"));\n\myOutputColor = mix(myOutputColor, u_scanColor, f);\n\}\n\}\n\"return scanSegmentShader}/*** 清除特效对象* @param {*} lastStage 特效对象*/clearScanEffects(lastStage) {this.viewer.scene.postProcessStages.remove(lastStage)}
}

调用方式

	circleDiffusion = new CircleDiffusion(this.c_viewer);circleDiffusion.add([104.08985268964015, 30.635443158056148, 10.0], "rgba(0,255,0,1)", 3000, 3500,10);

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

docker容器安装nexus3以及nexus3备份迁移仓库数据

一、安装步骤 1.搜索nexus3镜像 docker search nexus3 2.拉取镜像 docker pull sonatype/nexus3或者指定版本 docker pull sonatype/nexus3:3.68.0 3.查看拉取的镜像 docker images | grep "nexus3" 4.启动nexus服务 直接启动 docker run -d --name nexus3 -…

怎么查看公网IP?

在网络通信中&#xff0c;每个设备都会被分配一个IP地址&#xff0c;用于在互联网上进行唯一标识和通信。公网IP是指可以被公开访问的IP地址&#xff0c;可以用来建立远程连接或者进行网络访问等操作。怎么查看公网IP呢&#xff1f;下面将介绍几种常用的方法。 使用命令行查询公…

LabVIEW高温往复摩擦测试系统中PID控制

在LabVIEW开发高温往复摩擦测试系统中实现PID控制&#xff0c;需要注意以下几个方面&#xff1a; 1. 系统建模与参数确定 物理模型建立: 首先&#xff0c;需要了解被控对象的物理特性&#xff0c;包括热惯性、摩擦系数等。这些特性决定了系统的响应速度和稳定性。实验数据获取…

吉时利Keithley 2010数字万用表7.5 位

Keithley 2010数字万用表&#xff0c;7.5 位 吉时利 2010 数字万用表、7.5 位、低噪声万用表将高分辨率与生产应用所需的高速度和高准确度相结合&#xff0c;例如测试精密传感器、换能器、A/D 和 D/A 转换器、调节器、参考、连接器、开关和继电器。2010 基于与吉时利 2000、20…

人工智能应用-实验6-卷积神经网络分类minst手写数据集

文章目录 &#x1f9e1;&#x1f9e1;实验内容&#x1f9e1;&#x1f9e1;&#x1f9e1;&#x1f9e1;代码&#x1f9e1;&#x1f9e1;&#x1f9e1;&#x1f9e1;分析结果&#x1f9e1;&#x1f9e1;&#x1f9e1;&#x1f9e1;实验总结&#x1f9e1;&#x1f9e1; &#x1f9…

521源码-在线客服-CRMChat网页版客服系统 UNIAPP 全方位在线客服系统源码与管理体系平台

CRMChat客服系统&#xff1a;基于Swoole4Tp6RedisVueMysql构建的高效沟通桥梁 CRMChat是一款独立且高性能的在线客服系统&#xff0c;它结合了Swoole4、Tp6、Redis、Vue以及Mysql等先进技术栈&#xff0c;为用户提供了卓越的在线沟通体验。该系统不仅支持在Pc端、移动端、小程…

列表页9大样式,保准你看了就能掌握。

上文&#xff1a;一张图集齐B端列表页的16大组件&#xff0c;召唤神龙&#xff0c;看后恍然大悟。 普通列表/基础列表/常规列表 不适合移动端展示 复杂列表 加入了统计 适合移动端 项目列表 适合移动端 应用列表 适合移动端 多级列表 复杂的多级结构&#xff0c;下图展示了…

美国教育数据分析

文章目录 第1关&#xff1a;认识数据第2关&#xff1a;数据预处理第3关&#xff1a;数学成绩预测 第1关&#xff1a;认识数据 编程要求 根据提示&#xff0c;在右侧Begin-End区域补充代码&#xff0c;查看数据属性名称。 测试说明 程序会调用你实现的方法&#xff0c;查看数据…

SpringBoot——整合MyBatis

目录 MyBatis 项目总结 1、创建SQL表 2、新建一个SpringBoot项目 3、pom.xml添加依赖 4、application.properties配置文件 5、User实体类 6、UserMapper接口 7、UserMapper.xml映射文件 8、UserController控制器 9、SpringBootMyBatisApplication启动类 10、使用Po…

C语言 | Leetcode C语言题解之第98题验证二叉搜索树

题目&#xff1a; 题解&#xff1a; /*** Definition for a binary tree node.* struct TreeNode {* int val;* struct TreeNode *left;* struct TreeNode *right;* };*/ bool isValid(struct TreeNode * root,long left,long right){if(!root){return true;}long…

一个超级简单的Python UI库:NiceGUI

大家好&#xff0c;图形用户界面&#xff08;GUI&#xff09;的开发往往被看作是一项复杂且繁琐的任务。Python作为一门强大的编程语言&#xff0c;提供了许多优秀的库来帮助开发者实现这一目标。今天&#xff0c;我们将介绍一个名为NiceGUI的库&#xff0c;它能帮助你轻松构建…

Science Robotics 封面论文:一种使用半球形纳米线阵列实现机器人视觉的超宽视场针孔复眼

研究背景 从生物复眼中汲取灵感&#xff0c;拥有一系列生动多样视觉功能特征的人工视觉系统最近脱颖而出。然而&#xff0c;这些人工系统中的大多数都依赖于可转换的电子设备&#xff0c;这些电子设备受到全局变形的复杂性和受限几何形状的影响&#xff0c;以及光学和探测器单元…

好的架构是进化来的,不是设计来的

很多年前&#xff0c;读了子柳老师的《淘宝技术这十年》。这本书成为了我的架构启蒙书&#xff0c;书中的一句话像种子一样深埋在我的脑海里&#xff1a;“好的架构是进化来的&#xff0c;不是设计来的”。 2015 年&#xff0c;我加入神州专车订单研发团队&#xff0c;亲历了专…

Wav2Vec 2.0:语音表示自监督学习框架

Wav2Vec 2.0是目前自动语音识别的模型之一。 Wav2Vec 2.0 代表了无监督预训练技术在语音识别领域的重大进步。这些方法通过直接从原始音频中学习&#xff0c;无需人工标记&#xff0c;因此可以有效利用大量未标记的语音数据集。相比于传统的监督学习数据集通常只有大约几百小时…

文章解读与仿真程序复现思路——电力系统保护与控制EI\CSCD\北大核心《基于改进Q学习算法和组合模型的超短期电力负荷预测》

本专栏栏目提供文章与程序复现思路&#xff0c;具体已有的论文与论文源程序可翻阅本博主免费的专栏栏目《论文与完整程序》 论文与完整源程序_电网论文源程序的博客-CSDN博客https://blog.csdn.net/liang674027206/category_12531414.html 电网论文源程序-CSDN博客电网论文源…

Cookie 和 Session概念及相关API

目录 1.Cookie概念 2.理解会话机制 (Session) 3.相关API 3.1HttpServletRequest 3.2HttpServletResponse 3.3HttpSession 3.4Cookie 4.代码示例: 实现用户登陆 1.Cookie概念 Cookie 是存储在用户本地终端&#xff08;如计算机、手机等&#xff09;上的数据片段。 它…

反射获取或修改对象属性的值

利用反射既可以获取也可以写入&#xff0c;首先咱们先写几个获取的例子。 一&#xff1a;利用反射修改各数据(利用resultField.set修改) 首先定义实体类 public class Dog {private String dogUser;private int age;把DogUser的"hahaha"改为"geggegegege&quo…

LiveGBS流媒体平台GB/T28181用户手册-版本信息:查看机器码、切换查看流媒体服务

LiveGBS流媒体平台GB/T28181用户手册--版本信息:查看机器码、切换查看流媒体服务 1、版本信息1.1、查看机器码1.2、多个流媒体服务1.3、提交激活 2、搭建GB28181视频直播平台 1、版本信息 版本信息页面&#xff0c;可以查看到信令服务 流媒体服务相关信息&#xff0c;包含硬件…

免费分享一套微信小程序旅游推荐(智慧旅游)系统(SpringBoot后端+Vue管理端)【论文+源码+SQL脚本】,帅呆了~~

大家好&#xff0c;我是java1234_小锋老师&#xff0c;看到一个不错的微信小程序旅游推荐(智慧旅游)系统(SpringBoot后端Vue管理端)【论文源码SQL脚本】&#xff0c;分享下哈。 项目视频演示 【免费】微信小程序旅游推荐(智慧旅游)系统(SpringBoot后端Vue管理端) Java毕业设计…

小程序丨数据功能如何使用

查询发布完成后&#xff0c;如发现信息有误或想要修改信息&#xff0c;老师可以使用数据功能在线修改已发布的查询内容。 数据功能包含导出、添加、编辑、更多操作&#xff0c;下面来教大家如何使用吧。 &#x1f4cc;使用教程 数据功能主要用于在线修改已发布的查询内容&#…