Cesium的一些神奇概念及技术流程(1)

近期要深度研究Cesium。关于Cesium的用法、渲染流程等方面我看很多人都写过。我就写写其中一些可能平时用不到但是比较有趣的内容。因为边研究边写,所以会陆续出几集,然后合并在一起,欢迎大家跟踪。

我的这些文章不打算把一些基本概念展开解释,因此读者在必要时可能需要自己寻找源码进行匹配阅读。如有不对,欢迎指出。

1、多棱台表现

我们一般会认为,一个三维视图就只有一个裁剪体(ViewFrustum)。但是Cesium可以有多个,可以从View.updateFrustums函数名称看的出来。比如下面图中存在4个裁剪体,分别用不同的颜色表示。

多棱台表现会把视野的划分逻辑,有点类似如下图的效果,它把一个椎体切法为多个长度不一的棱台。由于每个棱台可以有自己的深度缓冲阈值,因此可以针对比较远的对象一个独立的棱台,这样其Z值冲突会少一些,效果更好一点。可以用在陡峭的山峰和山谷、非常长的管道。不过经初步测试,效果并不明显,不需要针对一般情况(如500M高建筑等)调整该设置。

2、 剖切

剖切是三维平台最基本的需求,但难度系数也比较大。在Cesium中,剖切的渲染排序是COMPUTE,是第二组渲染对象(PASS.COMPUTE),可见它的统筹性多强(意思是后面对象的渲染需要考虑它的存在)。

三维模型剖切的基本流程是:a) 根据模型包围盒判断是否被剖切干掉(在函数Cesium3DTile.visibility中),b)在模型片元着色器阶段,逐个像素判断是否被剖切干掉(在着色器ModelClippingPlanesStageFS中)。

在片元着色器的剖切方法中(getClippingFunction.Clip)。先反推像素对应的的世界坐标(代码czm_windowToEyeCoordinates(fragCoord)),然后在通过计算点与平面的关系(正面、反面,距离),得到这个片元是否被干掉。

剖切是一个平面,但是Cesium的剖切却构建了一个材质,这是为什么呢?这是因为Cesium把剖切平面存储在一个图片中(材质中),如第0号像素存储第1个剖切面的参数。

3、Cesium如何控制瓦片在内存的容量 

Tileset有个参数,叫maximumScreenSpaceError,默认是16。如果瓦片的平面几何误差超过这个值,就会被加载。

如果屏幕范围有非常多的瓦片都达到了这个值,那么内存(含显存)一定会爆,这就好像每年都固定的高考录取分数线肯定会“旱的旱死、涝的涝死”。

因此Cesium对Tileset定义了一个并行于maximumScreenSpaceError的屏幕几何误差memoryAdjustedScreenSpaceError。这个参数会基于maximumScreenSpaceError上下浮动,当内存够,则变小,反正变大。从而实现瓦片内存的控制。

if (tileset.totalMemoryUsageInBytes < cacheBytes) {decreaseScreenSpaceError(tileset);
} else if (memoryExceeded && tiles.length > 0) {increaseScreenSpaceError(tileset);
}

 4、Tileset的兄弟谁先加载?

我们经常会遇到远处的先加载、小的先加载等等“倒转天罡”的事情。这其中有一定的玄学,要分析的原因比较多。但有几个是可以留意的。

a)“太子的优先级大于其他皇子”。意思是排在Tileset.json前面的会比后面的占优势。

b)眼睛看到的比余光看到的有优势。详见参数“tile._foveatedFactor”,这个参数为0表示眼睛射线射穿了这个瓦片的包围球,其他正值表示眼睛射线到这个瓦片包围球的扭曲度。

c)  瓦片在屏幕正中心比屏幕周边有优势。会给屏幕中心一定范围的瓦片几何误差宽松值(sseRelaxation)。当然这个屏幕中心的角度是需要设置的,详见(foveatedConeSize )参数。

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

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

【判断推理】逻辑基础

1.1 命题 用语言、符号或者式子表达的&#xff0c;可以判断真假的陈述句称为命题&#xff0c;一般写为 若p&#xff0c;则q 真命题&#xff1a;判断为真的语句假命题&#xff1a;判断为假的语句 eg1&#xff1a;小张是中国人&#xff08;若是小张&#xff0c;则是中国人&#…

【操作系统考研】2进程管理(1)

在翻看操作系统知识框架的时候&#xff0c;对一些概念的理解还比较模糊&#xff0c;现在我来理清他们的关系。 操作系统、处理器、进程、线程、内存、存储器、设备、文件的关系 咱们可以把计算机系统想象成一个大工厂&#xff0c;来理解这些概念之间的关系。 操作系统&#xf…

Error:WPF项目中使用oxyplot,错误提示命名空间中不存在“Plot”名称

在OxyPlot中&#xff0c;<oxy:PlotView>和<oxy:Plot>都是用来显示图表的控件&#xff0c;在WPF项目中使用oxyplot之前&#xff0c;先通过NuGet安装依赖包&#xff1a;OxyPlot.Wpf。 <oxy:PlotView>和<oxy:Plot>使用示例&#xff1a; <oxy:PlotVie…

使用Markdown Here插件生成邮件样式

使用Markdown Here插件生成邮件样式 通常大学生们都有给老师、助教使用邮箱发送作业的情景&#xff0c;怎样让自己发送的邮件美观呢&#xff0c;我们可以使用Markdown Here插件美化 以下为结果展示 Markdown Here 插件 官网地址 html代码 <font size"7", face…

复杂度分析复习(C语言版)

一.算法复杂度 算法在编写成可执行程序以后&#xff0c;运行时需要耗费时间资源和&#xff08;内存&#xff09;资源。因此衡量一个算法的好坏&#xff0c;一般是从时间、空间两个维度来衡量的&#xff0c;即时间复杂度和空间复杂度。 现如今&#xff0c;计算机内存越来越大&am…

数学公式编辑器免费版下载,mathtype和latex哪个好用

选择适合自己的公式编辑器需要考虑多个因素。首先&#xff0c;您需要确定编辑器支持的功能和格式是否符合您的需求&#xff0c;例如是否可以插入图片、导出各种文件格式等。其次&#xff0c;您可以考虑编辑器的易用性和界面设计是否符合您的个人喜好。另外&#xff0c;您还可以…

基于LORA的一主多从监测系统_框架搭建

第一节、框架搭建 打开CubeMAX&#xff0c;选择好芯片&#xff0c;进行基础配置 第一步、先配置时钟源 第二步、配置SYS选项 配置debug口以及计数器源&#xff0c;我这里选择TIM1 第三步、选择I2C接口 配置如下即可&#xff0c;默认配置不用改 第四步、串口选择 我们这里使…

传奇服务端快捷助手

定位传奇各目录&#xff0c;一键打开各配置文件。<br>收纳引擎、端口配置检查&#xff08;批量&#xff09;、路径配置、文本搜索、文件同步、一键重载&#xff08;跨桌面&#xff09;、命令管理 参考资料 传奇服务端快捷助手2024-06-20 - 工具软件程序 - 51开发者联盟 -…

51单片机的自动制冷系统【proteus仿真+程序+报告+原理图+演示视频】

1、主要功能 该系统由AT89C51/STC89C52单片机LCD1602显示模块温度传感器继电器LED、按键和蜂鸣器等模块构成。适用于车载便携式自动制冷系统、冰箱制冷、温度控制等相似项目。 可实现功能: 1、LCD1602实时显示当前温度 2、温度传感器DS18B20采集温度 3、按键可设置温度的阈…

JS 入门

文章目录 JS 入门一、JS 概述1、JS 特点2、JS 组成3、JS 初体验4、HTML引入JS 二、JS 基础语法1、变量声明2、基本数据类型3、引用数据类型1&#xff09;数组2&#xff09;对象3&#xff09;函数4&#xff09;null 4、运算符5、条件判断6、循环语句 三、JS 函数0、JS 函数特点1…

【unity进阶知识9】序列化字典,场景,vector,color,Quaternion

文章目录 前言一、可序列化字典类普通字典简单的使用可序列化字典简单的使用 二、序列化场景三、序列化vector四、序列化color五、序列化旋转Quaternion完结 前言 自定义序列化的主要原因&#xff1a; 可读性&#xff1a;使数据结构更清晰&#xff0c;便于理解和维护。优化 I…

字符编码发展史5 — UTF-16和UTF-32

上一篇《字符编码发展史4 — Unicode与UTF-8》我们讲解了Unicode字符集与UTF-8编码。本篇我们将继续讲解字符编码的第三个发展阶段中的UTF-16和UTF-32。 2.3. 第三个阶段 国际化 2.3.2. Unicode的编码方式 2.3.2.2. UTF-16 UTF-16也是一种变长编码&#xff0c;对于一个Unic…

第Y2周:训练自己的数据集

&#x1f368; 本文为&#x1f517;365天深度学习训练营 中的学习记录博客&#x1f356; 原作者&#xff1a;K同学啊 在上一次体验yolov5s的为基础上&#xff0c;这次将训练自己的数据集。 在YOLO目标检测算法中常用的三种标签格式&#xff1a;voc(xml)、coco(json)和yolo(txt…

【多线程】详解 CAS 机制

&#x1f970;&#x1f970;&#x1f970;来都来了&#xff0c;不妨点个关注叭&#xff01; &#x1f449;博客主页&#xff1a;欢迎各位大佬!&#x1f448; 文章目录 1. CAS 是什么1.1 CAS 具体步骤1.2 CAS 伪代码 2. CAS 的应用2.1 实现原子类2.1.1 AtomInteger 类2.1.2 伪代…

Rspamd:开源垃圾邮件过滤系统

Rspamd 是一个开源垃圾邮件过滤和电子邮件处理框架&#xff0c;旨在根据各种规则评估消息&#xff0c;包括正则表达式、统计分析以及与 URL 黑名单等自定义服务的集成。 系统会分析每封邮件并做出判定&#xff0c;MTA可据此采取进一步行动&#xff0c;例如拒绝邮件或添加垃圾邮…

低照度图像增强网络——EnlightenGAN

系列文章目录 GAN生成对抗网络介绍https://blog.csdn.net/m0_58941767/article/details/142704354?spm1001.2014.3001.5501 循环生成对抗网络——CycleGANhttps://blog.csdn.net/m0_58941767/article/details/142704671?spm1001.2014.3001.5501 目录 系列文章目录 前言 …

SSM社区慢性病管理系统—计算机毕业设计源码37572

摘 要 社区慢性病管理是社区卫生服务的主要内容&#xff0c;发展社区卫生服务是提供基本卫生服务、满足人民群众日益增长的卫生服务需求&#xff0c;也是提高人民健康水平的重要保障。为迎接慢性病防治的挑战我国进行了社区卫生服务改革&#xff0c;但由于社区卫生存在的诸多问…

OJ在线评测系统 微服务 OpenFeign调整后端下 nacos注册中心配置 不给前端调用的代码 全局引入负载均衡器

OpenFeign内部调用二 4.修改各业务服务的调用代码为feignClient 开启nacos注册 把Client变成bean 该服务仅内部调用&#xff0c;不是给前端的 将某个服务标记为“内部调用”的目的主要有以下几个方面&#xff1a; 安全性: 内部API通常不对外部用户公开&#xff0c;这样可以防止…

【CF2021E】Digital Village(All Version)

题目 给你一张 n n n 个点 m m m 条边的无向图&#xff0c;有 p p p 个关键点。你需要选择 k k k 个点染黑&#xff0c;使得这 p p p 个关键点到这 k k k 个黑点的代价和最小。定义代价为两点之间边权最大的边的最小值。 你需要求出 k 1,2,…,n 的所有答案 E1 n,m,p&l…

fiddler抓包20_弱网模拟

课程大纲 ① 打开CustomRules.js文件&#xff1a;Fiddler快捷键“CtrlR”(或鼠标点击&#xff0c;菜单栏 - Rules - Customize Rules)。 ② 设置速率&#xff1a;“CtrlF”&#xff0c;搜索 “m_SimulateModem”&#xff0c;定位至函数。在函数里设置上传、下载速率&#xff0c…