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,可视化测试。

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

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

相关文章

头歌——数据库系统原理(数据高级查询实验2)

文章目录 AVG() 函数的使用代码 COUNT() 函数的使用代码 MAX() 函数和 MIN() 函数的使用代码 SUM() 函数的使用代码 AVG() 函数的使用 返回某一字段的平均值 AVG() 函数通过计算某字段(列)内容(行)的个数和它们的数值之和来返回某…

【基于轻量型架构的WEB开发】课程 12.5 数据回写 Java EE企业级应用开发教程 Spring+SpringMVC+MyBatis

12.5 数据回写 12.5.1 普通字符串的回写 接下来通过HttpServletResponse输出数据的案例,演示普通字符串的回写,案例具体实现步骤如下。 1 创建一个数据回写类DataController,在DataController类中定义 showDataByResponse()方法&#xff…

软件测试 软考

在软件测试中,覆盖准则是衡量测试用例是否充分覆盖程序各个部分的标准。不同的覆盖准则有不同的强度。按覆盖强度从低到高排序,常见的覆盖准则如下: 语句覆盖(Statement Coverage):要求测试用例至少执行一次…

DirectShow过滤器开发-写AVI视频文件过滤器

下载本过滤器DLL 本过滤器将视频流和音频流写入AVI视频文件。 过滤器信息 过滤器名称:写AVI 过滤器GUID:{2EF49957-37DF-4356-A2A0-ECBC52D1984B} DLL注册函数名:DllRegisterServer 删除注册函数名:DllUnregisterServer 过滤器有…

uniapp实现H5和微信小程序获取当前位置(腾讯地图)

之前的一个老项目,使用 uniapp 的 uni.getLocation 发现H5端定位不准确,比如余杭区会定位到临平区,根据官方文档初步判断是项目的uniapp的版本太低。 我选择的方式不是区更新uniapp的版本,是直接使用高德地图的api获取定位。 1.首…

【WRF理论第七期】WPS预处理

【WRF理论第七期】WPS预处理 运行WPS(Running the WPS)步骤1:Define model domains with geogrid步骤2:Extracting meteorological fields from GRIB files with ungrib步骤3:Horizontally interpolating meteorologic…

机器学习(一)——基本概念、模型的评估与选择

目录 1 关于2 概念2.1 基础概念2.2 学习过程2.3 预测与评估2.4 标记与分类2.4.1 标记2.4.2 分类 2.5 回归分析2.6 聚类分析2.7 学习类型2.8 泛化能力2.9 统计学概念 3 模型评估与选择3.1 经验误差与过拟合3.2 评估方法3.2.1 留出法3.2.2 交叉验证法3.2.3 自助法3.2.4 调参与最终…

小白docker入门简介

Dockerfile入门使用分享 一、docker是啥二、镜像仓库三、自定义镜像四、动手做机甲玩偶五、帮我做数学题六、计算功能的写法七、咒语翻译器八、放屁九、解决问题 一、docker是啥 最开始我和你一样,围着镜像、容器、docker的名词团团转,其实没那么复杂。…

gitlab无法创建合并请求是所有分支都不显示

点击Merge Requests ------> New merge request 创建新的合并请求时,在Source branch和Target branch中一个分支都不显示 排查思路: 1.怀疑是权限问题。 发现只有我的一个账号出现,检查了账号的权限,尝试了master、develop角色…

macOS15.1及以上系统bug:开发者证书无法打开,钥匙串访问无法打开一直出现图标后立马闪退

团队紧跟苹果最新系统发现bug:今日设备信息如下,希望能带给遇到这个问题的开发者一点帮助。 错误图如下: 点击证书文件后,先出现钥匙串访问图标,后立马闪退消失 中间试过很多方法,都是一样的表现,最后好在解决了,看网上也没有相关的帖子,这里直接写解决办法和导致原因…

python实战案例——爬取A站视频,m3u8格式视频抓取(内含完整代码!)

1、任务目标 目标网站:A站视频(https://www.acfun.cn/v/ac40795151) 要求:抓取该网址下的视频,将其存入本地,视频如下: 2、网页分析 进入目标网站,打开开发者模式,我们发…

【基于轻量型架构的WEB开发】课程 12.4 页面跳转 Java EE企业级应用开发教程 Spring+SpringMVC+MyBatis

12.4 页面跳转 12.4.1 返回值为void类型的页面跳转 返回值为void类型的页面跳转到默认页面 当Spring MVC方法的返回值为void类型,方法执行后会跳转到默认的页面。默认页面的路径由方法映射路径和视图解析器中的前缀、后缀拼接成,拼接格式为“前缀方法…

濮良贵《机械设计》第十版课后习题答案全解PDF电子版

《机械设计》(第十版)是“十二五”普通高等教育本科国家级规划教材, 是在《机械设计》(第九版)的基础上修订而成的。本次修订主要做了以下几项工作: 1. 内容的适当更新——自本书第九版出版以来, 机械工程及相关领域的新理论、新技术和新标准…

【Unity基础】Unity中如何导入字体?

在Unity中,不能像其他软件一样直接使用字体文件,需要通过FontAssetCreator将其转换成Texture的Asset文件,然后才能使用。 本文介绍了使用FontAssetCreator导入字体的过程,并对其参数设置进行了说明。 Font Asset Creator 是 Uni…

2024年11月8日上海帆软用户大会

2024年11月8日上海帆软用户大会 2024年11月8日,上海成功举办了帆软用户大会,主题为“数字聚力,绽放新机”。大会汇聚了众多行业专家和企业代表,共同探讨数字化转型和商业智能领域的最新趋势和实践。 大会亮点: 专家…

注意力机制的目的:理解语义;编码器嵌入高纬空间计算;注意力得分“得到S*V”;解码器掩码和交叉注意力层用于训练;最终的编码器和输出实现大模型

目录 注意力机制的目的:理解语义中的它是小白兔 词编码器嵌入高纬空间 计算注意力得分“得到S*V” 权重QKV:连接权重 训练阶段使用解码器:翻译后的语句 解码器掩码和交叉注意力层用于训练 最终的编码器和输出实现大模型 Transformer模型中,QKV QKV的作用 举例说明…

纯前端实现在线预览excel文件(插件: LuckyExcel、Luckysheet)

概述 在实际开发中,遇到需要在线预览各种文件的需求,最近遇到在线预览excel文件的需求,在此记录一下!本文主要功能实现,用于插件 LuckyExcel ,Luckysheet!废话不多说,上代码&#xf…

WPF自定义翻页控件

XAML文件如下&#xff1a; <UserControlx:Class"CTMVVMDemo.View.UserControls.DataPager"xmlns"http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x"http://schemas.microsoft.com/winfx/2006/xaml"xmlns:d"http://s…

Linux中.NET读取excel组件,不会出现The type initializer for ‘Gdip‘ threw an exception异常

组件&#xff0c;可通过nuget安装&#xff0c;直接搜名字&#xff1a; ExcelDataReader using ConsoleAppReadFileData.Model; using ExcelDataReader; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Task…

qt QColorDialog详解

1、概述 QColorDialog是Qt框架中的一个对话框类&#xff0c;专门用于让用户选择颜色。它提供了一个标准的颜色选择界面&#xff0c;其中包括基本的颜色选择器&#xff08;如调色板和颜色轮&#xff09;、自定义颜色输入区域以及预定义颜色列表。QColorDialog支持RGB、HSV和十六…