cesium雷达扫描圈

import * as Cesium from "cesium";
let lastStage="";
// 圆扩散
export function showCircleScan(viewer,lon, lat,color,maxRadius,height) {var cartographicCenter = new Cesium.Cartographic(Cesium.Math.toRadians(lon), Cesium.Math.toRadians(lat), height?height:2);var scanColor = new Cesium.Color.fromCssColorString(color)lastStage = addCircleScanPostStage(viewer, cartographicCenter, maxRadius?maxRadius:100, scanColor, 1000);
}
// showRadarScan() // 雷达扫描
export function showRadarScan(lon, lat,color,height) {var cartographicCenter = new Cesium.Cartographic(Cesium.Math.toRadians(lon), Cesium.Math.toRadians(lat), height?height:32);var scanColor = new Cesium.Color(color);lastStage = addRadarScanPostStage(viewer, cartographicCenter, 1000, scanColor, 3000);
}/*添加扩散效果扫描线viewercartographicCenter 扫描中心radius  半径 米scanColor 扫描颜色duration 持续时间 毫秒
*/
function addCircleScanPostStage(viewer, cartographicCenter, maxRadius, scanColor, duration) {var _Cartesian3Center = Cesium.Cartographic.toCartesian(cartographicCenter);var _Cartesian4Center = new Cesium.Cartesian4(_Cartesian3Center.x, _Cartesian3Center.y, _Cartesian3Center.z, 1);var _CartograhpicCenter1 = new Cesium.Cartographic(cartographicCenter.longitude, cartographicCenter.latitude, cartographicCenter.height + 500);var _Cartesian3Center1 = Cesium.Cartographic.toCartesian(_CartograhpicCenter1);var _Cartesian4Center1 = new Cesium.Cartesian4(_Cartesian3Center1.x, _Cartesian3Center1.y, _Cartesian3Center1.z, 1);var _time = (new Date()).getTime();var _scratchCartesian4Center = new Cesium.Cartesian4();var _scratchCartesian4Center1 = new Cesium.Cartesian4();var _scratchCartesian3Normal = new Cesium.Cartesian3();var ScanPostStage = new Cesium.PostProcessStage({fragmentShader: getScanSegmentShader(),uniforms: {u_scanCenterEC: function () {var temp = Cesium.Matrix4.multiplyByVector(viewer.camera._viewMatrix, _Cartesian4Center, _scratchCartesian4Center);return temp;},u_scanPlaneNormalEC: function () {var temp = Cesium.Matrix4.multiplyByVector(viewer.camera._viewMatrix, _Cartesian4Center, _scratchCartesian4Center);var temp1 = Cesium.Matrix4.multiplyByVector(viewer.camera._viewMatrix, _Cartesian4Center1, _scratchCartesian4Center1);_scratchCartesian3Normal.x = temp1.x - temp.x;_scratchCartesian3Normal.y = temp1.y - temp.y;_scratchCartesian3Normal.z = temp1.z - temp.z;Cesium.Cartesian3.normalize(_scratchCartesian3Normal, _scratchCartesian3Normal);return _scratchCartesian3Normal;},u_radius: function () {return maxRadius * (((new Date()).getTime() - _time) % duration) / duration;},u_scanColor: scanColor}});viewer.scene.postProcessStages.add(ScanPostStage);return ScanPostStage;
}
//扩散效果Shader
function getScanSegmentShader() {var scanSegmentShader = "\n\uniform sampler2D colorTexture;\n\uniform sampler2D depthTexture;\n\varying vec2 v_textureCoordinates;\n\uniform vec4 u_scanCenterEC;\n\uniform vec3 u_scanPlaneNormalEC;\n\uniform float u_radius;\n\uniform vec4 u_scanColor;\n\\n\vec4 toEye(in vec2 uv,in float depth)\n\{\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\{\n\vec3 v01 = point - planeOrigin;\n\float d = dot(planeNormal,v01);\n\return (point-planeNormal * d);\n\}\n\float getDepth(in vec4 depth)\n\{\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\void main()\n\{\n\gl_FragColor = texture2D(colorTexture,v_textureCoordinates);\n\float depth = getDepth(texture2D(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\{\n\float f = 1.0-abs(u_radius - dis )/ u_radius;\n\f = pow(f,4.0);\n\gl_FragColor = mix(gl_FragColor,u_scanColor,f);\n\}\n\} \n\ ";return scanSegmentShader;
}/*添加雷达扫描线viewercartographicCenter 扫描中心radius  半径 米scanColor 扫描颜色duration 持续时间 毫秒
*/
function addRadarScanPostStage(viewer, cartographicCenter, radius, scanColor, duration) {var _Cartesian3Center = Cesium.Cartographic.toCartesian(cartographicCenter);var _Cartesian4Center = new Cesium.Cartesian4(_Cartesian3Center.x, _Cartesian3Center.y, _Cartesian3Center.z, 1);var _CartographicCenter1 = new Cesium.Cartographic(cartographicCenter.longitude, cartographicCenter.latitude, cartographicCenter.height + 500);var _Cartesian3Center1 = Cesium.Cartographic.toCartesian(_CartographicCenter1);var _Cartesian4Center1 = new Cesium.Cartesian4(_Cartesian3Center1.x, _Cartesian3Center1.y, _Cartesian3Center1.z, 1);var _CartographicCenter2 = new Cesium.Cartographic(cartographicCenter.longitude + Cesium.Math.toRadians(0.001), cartographicCenter.latitude, cartographicCenter.height);var _Cartesian3Center2 = Cesium.Cartographic.toCartesian(_CartographicCenter2);var _Cartesian4Center2 = new Cesium.Cartesian4(_Cartesian3Center2.x, _Cartesian3Center2.y, _Cartesian3Center2.z, 1);var _RotateQ = new Cesium.Quaternion();var _RotateM = new Cesium.Matrix3();var _time = (new Date()).getTime();var _scratchCartesian4Center = new Cesium.Cartesian4();var _scratchCartesian4Center1 = new Cesium.Cartesian4();var _scratchCartesian4Center2 = new Cesium.Cartesian4();var _scratchCartesian3Normal = new Cesium.Cartesian3();var _scratchCartesian3Normal1 = new Cesium.Cartesian3();var ScanPostStage = new Cesium.PostProcessStage({fragmentShader: getRadarScanShader(),uniforms: {u_scanCenterEC: function () {return Cesium.Matrix4.multiplyByVector(viewer.camera._viewMatrix, _Cartesian4Center, _scratchCartesian4Center);},u_scanPlaneNormalEC: function () {var temp = Cesium.Matrix4.multiplyByVector(viewer.camera._viewMatrix, _Cartesian4Center, _scratchCartesian4Center);var temp1 = Cesium.Matrix4.multiplyByVector(viewer.camera._viewMatrix, _Cartesian4Center1, _scratchCartesian4Center1);_scratchCartesian3Normal.x = temp1.x - temp.x;_scratchCartesian3Normal.y = temp1.y - temp.y;_scratchCartesian3Normal.z = temp1.z - temp.z;Cesium.Cartesian3.normalize(_scratchCartesian3Normal, _scratchCartesian3Normal);return _scratchCartesian3Normal;},u_radius: radius,u_scanLineNormalEC: function () {var temp = Cesium.Matrix4.multiplyByVector(viewer.camera._viewMatrix, _Cartesian4Center, _scratchCartesian4Center);var temp1 = Cesium.Matrix4.multiplyByVector(viewer.camera._viewMatrix, _Cartesian4Center1, _scratchCartesian4Center1);var temp2 = Cesium.Matrix4.multiplyByVector(viewer.camera._viewMatrix, _Cartesian4Center2, _scratchCartesian4Center2);_scratchCartesian3Normal.x = temp1.x - temp.x;_scratchCartesian3Normal.y = temp1.y - temp.y;_scratchCartesian3Normal.z = temp1.z - temp.z;Cesium.Cartesian3.normalize(_scratchCartesian3Normal, _scratchCartesian3Normal);_scratchCartesian3Normal1.x = temp2.x - temp.x;_scratchCartesian3Normal1.y = temp2.y - temp.y;_scratchCartesian3Normal1.z = temp2.z - temp.z;var tempTime = (((new Date()).getTime() - _time) % duration) / duration;Cesium.Quaternion.fromAxisAngle(_scratchCartesian3Normal, tempTime * Cesium.Math.PI * 2, _RotateQ);Cesium.Matrix3.fromQuaternion(_RotateQ, _RotateM);Cesium.Matrix3.multiplyByVector(_RotateM, _scratchCartesian3Normal1, _scratchCartesian3Normal1);Cesium.Cartesian3.normalize(_scratchCartesian3Normal1, _scratchCartesian3Normal1);return _scratchCartesian3Normal1;},u_scanColor: scanColor}});viewer.scene.postProcessStages.add(ScanPostStage);return ScanPostStage;
}//雷达扫描线效果Shader
function getRadarScanShader() {var scanSegmentShader ="uniform sampler2D colorTexture;\n" +"uniform sampler2D depthTexture;\n" +"varying vec2 v_textureCoordinates;\n" +"uniform vec4 u_scanCenterEC;\n" +"uniform vec3 u_scanPlaneNormalEC;\n" +"uniform vec3 u_scanLineNormalEC;\n" +"uniform float u_radius;\n" +"uniform vec4 u_scanColor;\n" +"vec4 toEye(in vec2 uv, in float depth)\n" +" {\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" +"bool isPointOnLineRight(in vec3 ptOnLine, in vec3 lineNormal, in vec3 testPt)\n" +"{\n" +"vec3 v01 = testPt - ptOnLine;\n" +"normalize(v01);\n" +"vec3 temp = cross(v01, lineNormal);\n" +"float d = dot(temp, u_scanPlaneNormalEC);\n" +"return d > 0.5;\n" +"}\n" +"vec3 pointProjectOnPlane(in vec3 planeNormal, in vec3 planeOrigin, in vec3 point)\n" +"{\n" +"vec3 v01 = point -planeOrigin;\n" +"float d = dot(planeNormal, v01) ;\n" +"return (point - planeNormal * d);\n" +"}\n" +"float distancePointToLine(in vec3 ptOnLine, in vec3 lineNormal, in vec3 testPt)\n" +"{\n" +"vec3 tempPt = pointProjectOnPlane(lineNormal, ptOnLine, testPt);\n" +"return length(tempPt - ptOnLine);\n" +"}\n" +"float getDepth(in vec4 depth)\n" +"{\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" +"void main()\n" +"{\n" +"gl_FragColor = texture2D(colorTexture, v_textureCoordinates);\n" +"float depth = getDepth( texture2D(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" +"float twou_radius = u_radius * 2.0;\n" +"if(dis < u_radius)\n" +"{\n" +"float f0 = 1.0 -abs(u_radius - dis) / u_radius;\n" +"f0 = pow(f0, 64.0);\n" +"vec3 lineEndPt = vec3(u_scanCenterEC.xyz) + u_scanLineNormalEC * u_radius;\n" +"float f = 0.0;\n" +"if(isPointOnLineRight(u_scanCenterEC.xyz, u_scanLineNormalEC.xyz, prjOnPlane.xyz))\n" +"{\n" +"float dis1= length(prjOnPlane.xyz - lineEndPt);\n" +"f = abs(twou_radius -dis1) / twou_radius;\n" +"f = pow(f, 3.0);\n" +"}\n" +"gl_FragColor = mix(gl_FragColor, u_scanColor, f + f0);\n" +"}\n" +"}\n";return scanSegmentShader;
}

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

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

相关文章

内衣洗衣机和手洗哪个干净?最好用的迷你洗衣机

随着大家工作的压力越来越大&#xff0c;下了班之后只能想躺平&#xff0c;在洗完澡之后看着还需要手洗的内衣裤真的很头疼。有些小伙伴还有会攒几天再丢进去洗衣机里面一起&#xff0c;而且这样子是非常不好的&#xff0c;用过的内衣裤长时间不清洗容易滋生细菌&#xff0c;而…

单片机学习3——数码管

数码管&#xff0c;根据内部结构&#xff0c;可分为共阴极数码管和共阳极数码管。七段发光管加上一个小数点&#xff0c;共计8段。因此&#xff0c;我们对它编程的时候&#xff0c;刚好是用一个字节。 数码管的显示方式&#xff1a; 1&#xff09;静态显示&#xff1b; 2&…

QT网络协议知识体系(一)

//获取主机的名称和ip地址 //获取主机的所有信息

终于等到你!常用的组织架构图模板,高清图片一键导出

组织架构图是一种用来展示一个组织内部人员和职责关系的图表。通过组织架构图&#xff0c;我们可以清晰地了解一个组织的层级架构和各个部门之间的关系。在本文中&#xff0c;我们将向大家推荐8个常用的组织架构图模板&#xff0c;帮助你快速制作出专业的组织架构图。 1. 市场营…

【Android知识笔记】性能优化专题(二)

Android 内存泄漏原因总结 单例模式持有 Context 对象:由于单例的静态特性使得单例的生命周期和应用的生命周期一样长,如果一个对象已经不需要使用了,而单例对象还持有该对象的引用,那么这个对象将不能被正常回收,这就导致了内存泄漏。 非静态内部类创建的静态成员变量持有…

解决Linux Visual Studio Code显示字体有问题/Liunx下Visual Studio Code更换字体

01、具体问题 在Linux下VsCode控制台与代码区显示异常&#xff0c;如下图所示&#xff1a; 代码显示 终端显示 02、解决方案 下载字体 [rootlocalhost mhzzj]$ cd /usr/share/fonts # 进入目录 [rootlocalhost fonts]$ sudo yum install git # 下载字体 [rootlocalhost fo…

多种 React 组件通信方式实践

在React中&#xff0c;组件之间的通信是一个非常重要的话题。当我们构建复杂的应用程序时&#xff0c;经常需要不同的组件之间共享数据或者进行相互协作。React提供了几种方式来实现跨组件通信&#xff0c;下面我将详细其中几种通信方式&#xff0c;并提供实际的代码示例。 使…

React入门使用 (官方文档向 Part1)

文章目录 React组件:万物皆组件 JSX: 将标签引入 JavaScriptJSX 规则1. 只能返回一个根元素2. 标签必须闭合3. 使用驼峰式命名法给 ~~所有~~ 大部分属性命名&#xff01;高级提示&#xff1a;使用 JSX 转化器 在 JSX 中通过大括号使用 JavaScript使用引号传递字符串使用大括号&…

招投标信息可以用CRM系统来查看吗?

对于B2B企业来说获客难、获客成本高是共识。做大客户的企业通过招投标获取商机是一个重要获客途径&#xff0c;然而传统方式管理招投标信息问题很多&#xff0c;例如资料丢失、手工录入出错、信息分散、信息查找费时费力。为了解决这些难题小编推荐CRM系统&#xff0c;CRM系统需…

Java基础之集合类

Java基础之集合类 一、集合的框架1.1、集合概述1.2、集合与数组区别1.3、数组的缺点&#xff1a;1.4、常用集合分类1.5、Collection常用方法 二、List集合2.1、ArrayList2.2、LinkedList2.3、Vector2.4、区别 三、Set集合3.1、HashSet集合3.2、LinkedHashSet集合3.3、TreeSet集…

Qt 网络通信

获取本机网络信息 &#xff08;1&#xff09;在 .pro 文件中加入 QT network&#xff08;2&#xff09; #ifndef WIDGET_H #define WIDGET_H#include <QWidget> #include <QDebug> #include <QLabel> #include <QLineEdit> #include <QPu…

C#中openFileDialog控件的使用方法

目录 一、OpenFileDialog基本属性 二、使用 OpenFile 从筛选的选择中打开文件 1.示例源码 2.生成效果 3. 其它示例 三、使用 StreamReader 以流的形式读取文件 1.示例源码 2.生成效果 四、一种新颖的Windows窗体应用文件设计方法 在C#中&#xff0c;OpenFileDialog控件…

vue3+tsx的使用

<template><div><xiaoman on-click"getItem" name"似懂非懂"></xiaoman></div> </template><script setup langts>import xiaoman from "./App"const getItem(item:any)>{console.log(item,it…

redis引发的一次生产事故,内存爆满

redis引发的一次生产事故 问题描述&#xff1a; 发版后回归测试&#xff0c;不定时出现token失效&#xff0c;导致自动退出到登录界面。如果操作的人员较多&#xff0c;token失效的就比较快&#xff0c;操作的人员较少token失效的相对较慢。 问题复现&#xff1a; 同一账号…

【LeeCode】*904.水果成篮

你正在探访一家农场&#xff0c;农场从左到右种植了一排果树。这些树用一个整数数组 fruits 表示&#xff0c;其中 fruits[i] 是第 i 棵树上的水果 种类 。 你想要尽可能多地收集水果。然而&#xff0c;农场的主人设定了一些严格的规矩&#xff0c;你必须按照要求采摘水果&…

《C++PrimePlus》第10章 对象和类

10.1 过程性编程和面向对象编程 10.2 抽象和类 10.3 类的构造函数和析构函数 类的定义和使用&#xff08;买卖股票&#xff09; 头文件stock10.h #ifndef __STOCK00__H__ #define __STOCK00__H__#include <string>class Stock { // pravate的内容只能通过public访问 p…

简易地铁自动机售票系统实现(C++)

该程序具有以下功能 (1) 一个地铁路线类 Router&#xff0c;包含路线编号&#xff0c;途中的各个站点。可以新增、删除、查询路线&#xff0c;可以根据线路名称&#xff0c;显示线路图片。 (2) 一个地图类 Map&#xff0c;可以显示所有可以乘坐的地铁站名&#xff0c;以及线路…

leetcode 不同的二叉搜索树

给你一个整数 n &#xff0c;求恰由 n 个节点组成且节点值从 1 到 n 互不相同的 二叉搜索树 有多少种&#xff1f;返回满足题意的二叉搜索树的种数。 示例 1&#xff1a; 输入&#xff1a;n 3 输出&#xff1a;5 示例 2&#xff1a; 输入&#xff1a;n 1 输出&#xff1a;…

MybatisBatchUtils功能介绍

MybatisBatchUtils 是一个 MyBatis 框架的工具类&#xff0c;主要用于简化 MyBatis 中批量操作的代码编写。该工具类封装了 MyBatis 中的批量操作方法&#xff0c;可以方便地进行批量插入、更新和删除等操作。 一般来说&#xff0c;使用 MyBatis 进行批量操作需要先设置 JDBC 驱…

展锐Android10,R,lmk怎么添加白名单

展锐Android10,R,lmk怎么添加白名单 低内存lmk时,怎么添加白名单 [ANSWER] 如果要保活进程,使之不被lowmemorykiller杀掉,可以将要保活的进程加到白名单中: lmkd_param.conf文件是lmkd杀进程的白名单配置文件,其中配置的应用是不会被lmkd杀掉的 请在device/sprd目录中…