三维大场景管理-3Dtiles规范
简介
: 这篇文章都是三年前写的了,一直在笔记库存中,今天把他放出来。主要是讲Cesium 的3Dtiles 格式,当然3Dtiles主要是解决场景管理+大场景的LOD实现的问题,不管是剔除渲染性能优化之Culling 剔除或者 LOD 、3Dtiles都是解决由于管线中的顶点过多导致的性能大场景问题,而不是由于片源着色器或者CPU的性能瓶颈导致的问题,当然它们本质上都是剔除,都是在CPU端进行剔除,防止过多的顶点等进入到着色器中。作者本人以前见过千万级别的顶点甚至上亿的顶点传入到顶点着色器中!如果不做场景管理等优化再强的GPU也是扛不住的。
3Dtiles 是一种开放规范,用于跨桌面、Web 和移动应用程序共享、可视化、融合大量异构 3D 地理空间内容并与之交互。其主要目的是改善大规模异构数据集的流和渲染性能;它基础是一种空间数据结构,它支持层次结构细节级别(HLOD),因此只有可见的图块才会被流式传输到web ,并且只有那些对于给定3D视图最重要的图块。3D Tiles在3D中实现自适应空间细分,包括kd树,四叉树,八叉树,网格和其他空间数据结构。转换工具可以自适应地细分数据集,而不是刚性空间细分,例如,基于渲染每个模型的成本和模型的分布,从而产生平衡的数据结构。
3Dtiles 与cesium的关系:3D Tiles 是由 Cesium 团队制定的一种开放规范,专门用于高效地流式传输和渲染大规模的三维地理空间数据集。Cesium 团队是开发 3D Tiles 规范的主要贡献者和推动者。作为一个开放规范,3D Tiles 的目标是提供与 Cesium 以及其他三维可视化和GIS软件的互操作性。虽然由 Cesium 团队制定,但3D Tiles旨在成为一个通用规范,可以被任何支持WebGL和3D渲染的软件使用。最早在web端的cesiumjs然后到PC端 再到UE!以下是:
Cesium 中文社区
Cesiumlab实验室
几何的几种表示:
以下总结并且列出CG与计算几何常见的几何表达方式,当然3Dtiles主要是针对Polygon Mesh,但是这里主要是想总结;
隐式几何
- 代数(数学公式)
- Constructive Solid Geometry(CSG) ( 做布尔运算,如并,交,差)Constructive Solid Geometry.Modifying
- SDF( 有向距离场 每个像素(体素)记录自己与距离自己最近物体之间的距离,如果在物体内,则距离为负,正好在物体边界上则为0。)
- 分形几何
- 样条曲线(Splines):NURBS(Non-Uniform Rational B-Splines)是在CAD、计算机图形学和数字建模领域广泛使用的一种数学模型,用来生成和表示曲线和曲面。NURBS非常灵活和强大,因为它们可以精确表示标准形状(如圆形和矩形)和复杂的自由形曲面。
显示几何
- 点云(Point Cloud)
- 多边形网格(Polygon Mesh) :在这里主要是讲Polygon Mesh做3Dtiles。
GLTF格式:
在web端等组织3Dtiles格式习惯上喜欢使用glb/gltf等格式。gltf格式它按照图形编程所需的格式来存储数据,借以二进制编码提高传输速度。它不再使用面向对象的思维存储三维模型、贴图纹理,而是按显卡的思维存储,存的是顶点、法线、顶点颜色等最基础的信息,只不过组织结构上进行了精心的设计。它面向终点,就意味着可编辑性差,因为渲染性能的提高牺牲了可编辑性,它不再像fbx、obj一样容易编辑和转换。
我以前的文章有更详细的介绍:
gltf格式一、简介
gltf 格式二
- scene:glTF格式的场景结构描述条目。它通过引用node来定义场景图。
- node:场景图中的一个结点。它可以包含一个变换(比如旋转或平移),引用更多的子结点。它可以引用网格和相机,以及描述网格变换的蒙皮。
- camera:定义了用于渲染场景的视锥体配置。
- mesh:描述了场景中出现的3D对象的网格数据。它引用的accessor对象可以用来访问真实的几何数据。它引用的material对象定义了3D对象的外观。
- skin:定义了用于蒙皮的参数,参数的值通过一个accessor对象获得。
- animation:描述了一些结点如何随时间进行变换(比如旋转或平移)。
- accessor:一个访问任意数据的抽象数据源。被mesh、skin和animation元素使用来提供几何数据,蒙皮参数和基于时间的动画值。它通过引用一个bufferView对象,来引用实际的二进制数据。
- material:包含了定义3D对象外观的参数。它通常引用了用于3D对象渲染的texture对象。
- texture:定义了一个sampler对象和一个image对象。sampler对象定义了image对象在3D对象上的张贴方式。
3Dtiles 格式:
3D Tiles 已经在Cesium中进行:
3Dtiles 是一种开放规范,用于跨桌面、Web 和移动应用程序共享、可视化、融合大量异构 3D 地理空间内容并与之交互。3D Tiles的主要目的是改善大规模异构数据集的流和渲染性能。3D Tiles的基础是一种空间数据结构,它支持层次结构细节级别(HLOD),因此只有可见的图块才会被流式传输 - 并且只有那些对于给定3D视图最重要的图块。平铺有效载荷可以是二进制和上下文感知压缩的,例如,使用Open3DGC或oct编码。
3D Tiles在3D中实现自适应空间细分,包括kd树,四叉树,八叉树,网格和其他空间数据结构。转换工具可以自适应地细分数据集,而不是刚性空间细分,例如,基于渲染每个模型的成本和模型的分布,从而产生平衡的数据结构。
geometricError是存储在tileset或tile中的几何误差,screenHeight是渲染屏幕的高度(以像素为单位),tileDistance是tile到眼点的距离,fovy是视锥体的打开角度y 方向
就拿作者做过的b3dm 格式来说吧~
他的结构如上图,字段瑜含义如下表,你就能把glb格式组装成b3dm的3Dtiles规范
这个是我本人做的一部分3Dtile转换工具
Bounding volumes
[west, south, east, north, minimum height, maximum height]
“region”: [ -1.3197004795898053,0.6988582109, -1.3196595204101946,0.6988897891,0,20]
shhere 圆心 +半径
“sphere”: [ 0,0,10,141.4214 ]
box 右手坐标系前三个是box中心点,后x y z的轴方向与半长
“box”: [
0, 0, 10,
100, 0, 0,
0, 100, 0,
0, 0, 10
]
当然常用的包围结构是包围盒AABB与包围球,主要是由于三维大场景的是静态的场景而且AAB吧或者包围球求解容易不会像OBB解近似值!
空间数据结构:
见空间数据笔记;空间数据结构
3Dtile流式加载流程:
- 初始化Tileset:
当3D场景初始化时,Cesium.js库将加载一个JSON格式的Tileset文件,这个tileset是一棵树组成,树中的节点代表单个的Tiles,该文件描述了所有Tile的层次结构、位置、空间划分、可用的LOD等级等元数据。 - 视图和相机设置:
进入三维场景,设置好视图和相机的位置和方向。引擎计算当前相机视角下哪些Tile在视锥体(View Frustum)内,并通过视点距离、屏幕空间误差(Screen-Space Error, SSE)或其他指标来确定需要加载Tile的LOD级别。 - 选择Tile:
根据Tileset的层次结构,逐级检查各个Tile,挑选出那些覆盖当前视锥体并满足LOD要求的Tile,如果一个Tile被认为不能准确表现当前视角下的模型,则会递归地检查其子Tile。 - 请求Tile内容:
一旦确定了需要的Tile,发起网络请求来加载这些Tile的实际几何数据。如上面文章说的数据可以是不同格式的,包括B3DM(批量化3D模型)、I3DM(实例化的3D模型)、PNTS(点云)、等等。每种格式针对特定类型的数据最优化。 - 流式加载和缓存:
Tile内容随着网络请求而异步加载,这样用户仍然可以与场景交互,即使数据还没完全到位。 已加载的Tile会被缓存以供将来快速访问,尤其是在用户导航场景时重复访问相同区域的情形。 - 渲染和LOD切换:
加载完成的Tiles被送入渲染管线渲染。当用户移动相机或更改视角时,之前加载的Tiles可能不再可见或需要更高或更低的LOD。引擎会根据新的视锥体和LOD要求再次执行Tile选择和请求流程。最终系统会基于用户的交云动作及网络条件不断地加载和卸载Tile,以确保在用户设备上实现流畅又精确的三维场景体验。
参考资料:
介绍3D Tiles
Cesium-3dTiles格式详解
cesium原理:渲染调度
3DTiles 1.0 数据规范详解[1] 介绍
相关文章:

三维大场景管理-3Dtiles规范
简介 : 这篇文章都是三年前写的了,一直在笔记库存中,今天把他放出来。主要是讲Cesium 的3Dtiles 格式,当然3Dtiles主要是解决场景管理大场景的LOD实现的问题,不管是剔除渲染性能优化之Culling 剔除或者 LOD 、3Dtiles…...
Flutter 中的 FractionalTranslation 小部件:全面指南
Flutter 中的 FractionalTranslation 小部件:全面指南 在 Flutter 的丰富布局库中,FractionalTranslation 是一个允许你将子组件沿着一个轴或两个轴进行部分平移的动画小部件。这种类型的平移通常用于创建滑动效果,如卡片的滑动删除或滑动展…...
Thrift快速入门开发demo
Thrift快速入门开发demo 一、认识Thrift thrift是什么?一个RPC 代码生成框架,使用它的IDL(Interface Defination Language,接口定义语言)定义你想要实现的接口,然后它就会生成对应语言的远程调用框架代码,用户只需要实现接口逻辑,不用关心具体的细节。 tutorial:htt…...
关于C++智能指针复习总结
RAII(Resource Acquisition Is Initialization): 资源获得即初始化 利用对象生命周期来控制程序的资源(将资源交给对象处理) 智能指针利用了该思想 将资源交给一个对象, 初始化资源(可以是指针或者等等资源), 释放交给析构函数 因为析构函数无论是什么场景, 对象销毁时一定会…...

Prometheus Operator创建告警规则并接入钉钉报警
prometheus之钉钉报警 前言1. 添加prometheus报警规则1.2 添加自定义报警规则文件 2. 配置钉钉报警2.2 部署dingding插件 3. 编写alertmanager配置文件 前言 在kubenetes上安装了kube-promethues(包含Prometheus Operator),程序正常跑起来了,…...

Word整理论文参考文献
1.安装Zotero软件 2.安装Zotero的Chrome网站插件,并将插件固定到浏览器 3.安装Word的Zotero插件 4.在DBLP网站https://dblp.org/search 搜索需要添加的参考文献->点击BibTex->点击网页右上角的Zotero符号(即第二步所指的符号)->至…...

计算机网路概述
目录 计算机网络的概念 计算机网络的定义: 计算机网络的组成: 终端系统/资源子网 通信子网 计算机网络的类型 按照拓扑分类编辑 按照范国分类: 按传输方式进行分类 计算机网络体系结构 传输方式 按照传输方向区分 按照传输对象…...

832. 翻转图像 - 力扣
1. 题目 给定一个 n x n 的二进制矩阵 image ,先 水平 翻转图像,然后 反转 图像并返回 结果 。 水平翻转图片就是将图片的每一行都进行翻转,即逆序。 例如,水平翻转 [1,1,0] 的结果是 [0,1,1]。 反转图片的意思是图片中的 0 全部被…...

mumu 模拟器安装
1.下载安装 下载地址 Win 历史版本:http://mumu.163.com/update/win/Mac 历史 版本:http://mumu.163.com/20200515/25905_880858.html 2.设置为竖屏 在设置中心--界面设置页面设置宽720,高1280,DPI为240,如下图所示。…...
opencv实现图片的膨胀腐蚀
opencv实现图片的膨胀腐蚀 在OpenCV中,膨胀和腐蚀是两种基本的图像处理操作,通常用于二值图像中以提取特定的特征。它们是基于图像的形态学操作,使用一个称为结构元素或核的模板来改变图像的形状。 下面是如何使用OpenCV实现图片的膨胀和腐…...

[AIGC] Java常用的JSON库及简单示例
Java常用的JSON库及简单示例 在Java的世界里,JSON库广泛用于日常开发工作,本文将介绍几个常用的JSON库并配以简单的示例代码。 1. Gson Gson是Google提供的一个用来在Java对象和JSON数据之间进行转换的Java库。 它有一定的学习曲线,但一旦熟…...

Linux shell编程学习笔记50:who命令
0 前言 2024年的网络安全检查又开始了,对于使用基于Linux的国产电脑,我们可以编写一个脚本来收集系统的有关信息。比如,我们可以使用who命令来收集当前已登陆系统的用户信息,当前运行级别等信息。 1. who命令 的功能、格式和选项…...
vue使用webscoket
1. 创建 WebSocket 连接 首先,你需要在你的 Vue 组件中创建一个 WebSocket 连接。通常,这会在组件的 created 或 mounted 生命周期钩子中完成。 created() {this.socket new WebSocket(wss://your-websocket-url);this.socket.onopen () > {conso…...

第18章-综合以上功能 基于stm32的智能小车(远程控制、避障、循迹) 基于stm32f103c8t6/HAL库/CubeMX/超详细,包含代码讲解和原理图
这个是全网最详细的STM32项目教学视频。 第一篇在这里: 视频在这里 STM32智能小车V3-STM32入门教程-openmv与STM32循迹小车-stm32f103c8t6-电赛 嵌入式学习 PID控制算法 编码器电机 跟随 第18章-综合以上功能 18-按键和app按钮切换功能 根据上面介绍,我们的模式可…...

java并发工具类都有哪些
Java中的并发工具类包括: CountDownLatch CountDownLatch允许一个或多个线程等待其他线程完成某些操作。它通常用于线程间的同步,例如在一个线程完成其工作后通知其他线程继续执行。 CyclicBarrier CyclicBarrier是一个同步辅助类,它允许一…...
偏微分方程算法之抛物型方程差分格式编程示例一
目录 一、研究问题 二、C++代码 三、结果分析 一、研究问题 从本节开始将对具体的抛物型偏微分问题算例进行C++编程,以加深对抛物型偏微分方程差分格式构造的理解和应用。 采用向前欧拉格式计算抛物型方程初边值问题:...

数据结构—栈(C语言实现)
文章目录 前言一、栈的概念二、栈的代码实现Stack.hStack.c 三、使用栈解决有效的括号问题总结 前言 小伙伴们,大家好哇!!欢迎来到我的博客! 今天来分享一下另外一种数据结构—栈。主要包括栈的基本概念与其代码实现,…...

JVM学习-垃圾回收器(一)
垃圾回收器 按线程数分类 串行垃圾回收器 串行回收是在同一时间段内只允许有一个CPU用于执行垃圾回收操作,此时工作线程被暂停,直至垃圾收集工作结束 在诸如单CPU处理器或者较小的应用内存等硬件平台不是特别优越的场合,串行回收器的性能表…...

dolphinscheduler standalone安装
官方文档:https://dolphinscheduler.apache.org/en-us/docs/3.1.3/guide/installation/standalone 1.安装(以放在/home为例) 下载见:https://download.csdn.net/download/taotao_guiwang/89311365 tar -xvzf apache-dolphinsche…...
力扣hot 100:49. 字母异位词分组(python C++)
目录 题目描述:题解(python):(方法一:排序)代码解析代码运行解析 题解(C):(方法一:排序)代码解析&运行解析 原题目链接…...

Cinnamon修改面板小工具图标
Cinnamon开始菜单-CSDN博客 设置模块都是做好的,比GNOME简单得多! 在 applet.js 里增加 const Settings imports.ui.settings;this.settings new Settings.AppletSettings(this, HTYMenusonichy, instance_id); this.settings.bind(menu-icon, menu…...

C# 类和继承(抽象类)
抽象类 抽象类是指设计为被继承的类。抽象类只能被用作其他类的基类。 不能创建抽象类的实例。抽象类使用abstract修饰符声明。 抽象类可以包含抽象成员或普通的非抽象成员。抽象类的成员可以是抽象成员和普通带 实现的成员的任意组合。抽象类自己可以派生自另一个抽象类。例…...

推荐 github 项目:GeminiImageApp(图片生成方向,可以做一定的素材)
推荐 github 项目:GeminiImageApp(图片生成方向,可以做一定的素材) 这个项目能干嘛? 使用 gemini 2.0 的 api 和 google 其他的 api 来做衍生处理 简化和优化了文生图和图生图的行为(我的最主要) 并且有一些目标检测和切割(我用不到) 视频和 imagefx 因为没 a…...

面向无人机海岸带生态系统监测的语义分割基准数据集
描述:海岸带生态系统的监测是维护生态平衡和可持续发展的重要任务。语义分割技术在遥感影像中的应用为海岸带生态系统的精准监测提供了有效手段。然而,目前该领域仍面临一个挑战,即缺乏公开的专门面向海岸带生态系统的语义分割基准数据集。受…...

RabbitMQ入门4.1.0版本(基于java、SpringBoot操作)
RabbitMQ 一、RabbitMQ概述 RabbitMQ RabbitMQ最初由LShift和CohesiveFT于2007年开发,后来由Pivotal Software Inc.(现为VMware子公司)接管。RabbitMQ 是一个开源的消息代理和队列服务器,用 Erlang 语言编写。广泛应用于各种分布…...

uniapp 开发ios, xcode 提交app store connect 和 testflight内测
uniapp 中配置 配置manifest 文档:manifest.json 应用配置 | uni-app官网 hbuilderx中本地打包 下载IOS最新SDK 开发环境 | uni小程序SDK hbulderx 版本号:4.66 对应的sdk版本 4.66 两者必须一致 本地打包的资源导入到SDK 导入资源 | uni小程序SDK …...

打手机检测算法AI智能分析网关V4守护公共/工业/医疗等多场景安全应用
一、方案背景 在现代生产与生活场景中,如工厂高危作业区、医院手术室、公共场景等,人员违规打手机的行为潜藏着巨大风险。传统依靠人工巡查的监管方式,存在效率低、覆盖面不足、判断主观性强等问题,难以满足对人员打手机行为精…...

R 语言科研绘图第 55 期 --- 网络图-聚类
在发表科研论文的过程中,科研绘图是必不可少的,一张好看的图形会是文章很大的加分项。 为了便于使用,本系列文章介绍的所有绘图都已收录到了 sciRplot 项目中,获取方式: R 语言科研绘图模板 --- sciRplothttps://mp.…...
tomcat指定使用的jdk版本
说明 有时候需要对tomcat配置指定的jdk版本号,此时,我们可以通过以下方式进行配置 设置方式 找到tomcat的bin目录中的setclasspath.bat。如果是linux系统则是setclasspath.sh set JAVA_HOMEC:\Program Files\Java\jdk8 set JRE_HOMEC:\Program Files…...
Python 训练营打卡 Day 47
注意力热力图可视化 在day 46代码的基础上,对比不同卷积层热力图可视化的结果 import torch import torch.nn as nn import torch.optim as optim from torchvision import datasets, transforms from torch.utils.data import DataLoader import matplotlib.pypl…...