Cesium着色器的创意和方法(五——Polyline)

不接受反驳,线段在三维里面的渲染比多边形的渲染更复杂。因为线是没有宽度的,并且还需要时时刻刻向着你。

首先看下Cesium的线段的一些效果。这条线段非常宽(20个像素),有两个需要留意观察的。一是线段并非实时面对我,到了某个角度会重新调整朝向。二是远处跟地形还有点叠加冲突。

20241107_224526

1、线段是矩形

这个道理很多人都理解的。当前WebGL并不能凭空添加未知的点,因此需要用线段去模拟带宽度的线。

当然也不能直接是固定的矩形,因为这条线段还需要随着视野远近不断的改变,使之保持视觉上的一致。因此,线段的VertexArray(GeometryAttributes)跟普通的矩形不一样,它存储了position、prevPosition、nextPosition、expandAndWidth等数据。其中prevPosition和nextPosition是为了动态计算而进行存储的。

线段在渲染的顶点数是   顶点数*4-4。即一条线段(2个顶点)共计4个渲染顶点,两条线段(3个顶点)共计8个渲染顶点。亦即不考虑节点处的共享顶点情况。

2、expandAndWidth

它的存储数量跟渲染顶点数量一致,记录每个渲染顶点的朝向,或者说序号。对每个顶点它存储两个值,第一个值交替记录-1或者1,第二个值存储正负线宽(±lineWidth)。具体情况看下图。

3、 getPolylineWindowCoordinates

顾名思义,这个函数是要计算线段在屏幕上的位置。在这个函数中,Cesium会对每段线段进行空间判断,看看是否会被截断或丢弃。

这部分代码比较晦涩难懂。需要首先理解的是点投影到平面的公式,即

vec4 positionEC = czm_translateRelativeToEye(position.xyz, new vec3(0f));
vec4 positionPEC = czm_modelViewRelativeToEye * positionEC;
vec4 positionWC = czm_eyeToWindowCoordinates(positionPEC);

这里第一行是把全球空间笛卡尔位置转换到摄像头的相对位置,第二行是调整旋转角度,是一个View矩阵,第三行是把坐标转换为屏幕坐标,其中positionWC.xy是屏幕像素的位置。

其中EC为EyeCoordinate的简写,PEC是ProjectEyeCoordinate的简写,WC是windowCoordinate的简写。

Cesium判断线段被截断或丢弃的代码是clipLineSegmentToNearPlane函数,这个函数首先判断线段是否在近裁剪平面之前,方法是判断 czm_currentFrustum.x + positionPEC .z是否大于0。如果小于0,则表示不会被近裁剪面裁剪,反之会被截断或“灯下黑”。

czm_currentFrustum.x是近裁剪面的距离,为正值,Cesium在距离地面很远的情况,这个值并不是0.1,而可能是几万的值。

positionPEC .z是已经跟摄像头观察矩阵一致的坐标,因为Z轴代表正视方向。

4、线段宽度

第二部分谈论了线段宽度的传递,第三部分讨论了线段顶点在屏幕的坐标。设置线段宽度并不是像素级±宽度,而是需要利用线段前后节点的方向。因此计算方法可以简单的理解为

(positionWCPre-positionWCNext)的垂直向量*线段宽度

当然具体过程又复杂了,包括首尾节点的处理情况、垂直向量为Zero、顶点重叠等异常情况。

5、测试工具

glsl代码理解是很费神的一件事情,因为缺乏调试器。不过我为此做了一个小工具,采用C#来动态调试glsl。在开源项目里面,后面单独写篇文章介绍该程序的使用。ReprojectWebMercator: 仿照Cesium 的ReprojectWebMercator,可视化测试。

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

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

相关文章

独立开发者赚钱心法

一、独立开发者的身份转变 开发者到多重角色:独立开发者不仅是程序员,还是产品经理、设计师、文案、销售、运营、客服,最重要的是成为“老板”。思维转变:将开发程序视为一门生意,而非单纯的技术实现。 二、赚钱的核…

Hook小程序

下载: https://github.com/JaveleyQAQ/WeChatOpenDevTools-Python 配置: pip install -r requirements 实现: 开启小程序开发者模式,类似浏览器F12 效果: 使用: 退出微信,进入安装的目录…

【Spring Security系列】10分钟实现 SpringSecurity + CAS 完美单点登录方案

作者:后端小肥肠 🍇 我写过的文章中的相关代码放到了gitee,地址:xfc-fdw-cloud: 公共解决方案 🍊 有疑问可私信或评论区联系我。 🥑 创作不易未经允许严禁转载。 姊妹篇: 【Spring Security系列…

Spring Boot编程训练系统:构建可扩展的应用

摘要 随着信息技术在管理上越来越深入而广泛的应用,管理信息系统的实施在技术上已逐步成熟。本文介绍了编程训练系统的开发全过程。通过分析编程训练系统管理的不足,创建了一个计算机管理编程训练系统的方案。文章介绍了编程训练系统的系统分析部分&…

提升AI性能的关键大型语言模型(LLM)压缩策略

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗?订阅我们的简报,深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同,从行业内部的深度分析和实用指南中受益。不要错过这个机会,成为AI领…

「IDE」集成开发环境专栏目录大纲

✨博客主页何曾参静谧的博客📌文章专栏「IDE」集成开发环境📚全部专栏「Win」Windows程序设计「IDE」集成开发环境「UG/NX」BlockUI集合「C/C」C/C程序设计「DSA」数据结构与算法「UG/NX」NX二次开发「QT」QT5程序设计「File」数据文件格式「UG/NX」NX定…

关于 npm 更新镜像源问题

npm(Node Package Manager),是一个NodeJS包管理和分发工具,已经成为了非官方的发布Node模块(包)的标准。) 查看当前npm版本 npm -v 10.9.0 执行以下命令报错 npm install --registryhttp…

Worldly平台更新Higg FEM 2024模块价格及购买指南

近日,LEVERAGE供应链管理从美国可持续服装联盟(Cascale)验证官方Worldly平台模块订阅更新中获悉,FEM2024模块价格更新的重要信息。此次更新涉及工厂环境模块(FEM)和工厂社会劳工模块(FSLM&#…

MQ的实际使用

前言: 在这一篇文章当中我会以RcoketMQ来对其的使用的场景进行一个仔细地说明,这个里面也会涉及到一些额外的知识,看完之后对面试而言的话那么就是直接拿捏,当然在看这篇文章之前要先看MQ的基础知识-CSDN博客 毕竟基础才是王道,下面就是开始我们的正菜 在我的基础的那篇文章中就…

MFC图形函数学习08——绘图函数的重载介绍

在《MFC图形函数学习06——画椭圆弧线函数》中介绍了CPoint类、POINT结构体;在《MFC图形函数学习07——画扇形函数》中介绍了CRect类、RECT结构体。在介绍完后,没有介绍它们怎样使用。实际上,这些类和结构体对象或指针也是我们学习过的绘图函…

SAP-ABAP开发-BAPI

BAPI基于数据库表的操作函数传入传出数据,本身函数有接口与增强无关 目录 一、BAPI接口定义 二、业务对象 三、查询方法 四、调用 五、BAPI创建 (1)在DDIC中创建一个结构 (2)创建BAPI函数模块和函数或API方法 …

Ceph MDS高可用架构探索:从零到一构建多主一备MDS服务

文章目录 Ceph实现MDS服务多主一备高可用架构当前 mds 服务器状态添加 MDS 服务器验证ceph集群当前状态当前的文件系统状态设置处于激活状态 mds 的数量MDS 高可用优化分发配置文件并重启 mds 服务 Ceph实现MDS服务多主一备高可用架构 Ceph 的元数据服务(MDS&#…

python实战(八)——情感识别(多分类)

一、任务目标 本文使用的是来自Kaggle的一个情感识别数据集,这个数据集的总数据量是5934条,标签为anger、fear、joy三种情感的其中一种,很明显是一个多分类任务。这里,我们将使用微调技巧进行深度学习建模,同时我们会比…

价格战背后:即时零售三小龙的致命伤

价格战,从来就不仅仅是低价,低价前面永远要加上定语:确保品质和服务的。价格战是减法,更是加法。减去的是价格水分,加上的是品质和服务保障。 转载|原创新熵 作者丨宜新 编辑丨赛柯 今年双十一的热点,让人…

sd1.5/sdxl的推理,训练

1.sd1.5/sdxl的推理 主要讲述一下unet的降噪,以及采样器的作用,已sd1.5为例,sdxl类似 unet的降噪过程中,如20步降噪,这20个unet共用的一个权重 1.1 timesteps 根据unet的降噪步数,即num_inference_steps…

有哪些工具可以快速压缩图片呢?分享三个简单好用的图片压缩工具

现在的图片经常会因为图片过大的问题,影响在网上的上传使用,一般在平台上传图片时需要比较小的图片。但是随着现在图片质量的提升,导致图片的文件也越来越大,想要缩小图片大小,可以选择使用压缩图片的方法来处理。下面…

Java集合 List——针对实习面试

目录 Java集合 ListJava List的三种主要实现是什么?它们各自的特点是什么?Java List和Array(数组)的区别?Java List和Set有什么区别?ArrayList和Vector有什么区别?什么是LinkedList?…

请求接口时跨域问题详细解决方案

浏览器中的报错: 跨域问题通常需要前端和后端协作解决。以下是一些常用的解决方法,分别从前端和后端的角度进行讲解: 一. 后端解决方案 设置 CORS 头部: 最常用和推荐的方法是后端服务器设置 Access-Control-Allow-Origin 响应头…

同三维T610UDP-4K60 4K60 DP或HDMI或手机信号采集卡

1路DP/HDMI/TYPE-C(手机/平板等)视频信号输入1路MIC1路LINE OUT,带1路HDMI环出,USB免驱,分辨率4K60,可采集3路信号中其中1路,按钮切换,可采集带TYPE-C接口的各品牌手机/平板/笔记本电脑等 同三维…

初级数据结构——顺序表

目录 前言一、定义与特点二、类型三、基本操作四、应用场景五、优缺点六、元素插入和删除动态图解插入删除 七、代码模板八、使用顺序表的经典例题1.求奇数的乘积代码题解 2.数值统计代码题解 九、总结结语 前言 顺序表示最基础的数据结构之一,它也是我们学习开始学…