3DTiles特性与内容解析

一篇19年整理的比较老的笔记了。更多精彩内容尽在数字孪生平台。

瓦片种类

3DTiles瓦片有多种类型:
image.png

b3dm(Batched 3D Model,批量3D模型)

b3dm瓦片存储了多个个体,b3dm中的glb代表的实际对象应该具有相同的种类但是可能数据内容不同。b3dm瓦片可以用于存储带纹理的地形表面、三维建筑物的外部和内部、大量的模型等。对于带纹理的地形表面,由于没有要素化的特征,所以瓦片不带有属性数据。而对于复杂建筑物的外表和内部结构(BIM数据)以及海量的三维模型数据,由于具有要素化的特征,所以需要在瓦片数据中增加批量模型的id以区分要素。从这里看出,b3dm瓦片的应用范围在空间尺度上看并没有约束,核心应用原则是针对数量巨大的要素部件,并且这与要素表达的物体类型无关。
image.png
b3dm的基本文件结构是文件头部加主体。文件头部记录了文件类型、版本、大小等基本信息,同时也记录了要素表和批量表的大小。主体部分首先是要素表与批量表,然后是存储模型的glb文件。要素表存储要素的元数据(要素个数),批量表存储具体属性(要素id等),要素表与批量表可以采用JSON文本或二进制,没有强制要求。glb文件被内嵌到b3dm文件中,其中使用的几何数据和图片资源可以集成到glb,也可以采用外部引用形式。b3dm是3DTiles中用途最多、使用最频繁的瓦片数据种类,b3dm对于“批量”的定义需要被客观精确的理解。

i3dm(Instanced 3D Model,实例化3D模型)

i3dm瓦片也存储glb的模型,但是i3dm瓦片强调物体的可复制性。这说明i3dm的模型只用于表达一个对象,通过指定位置该模型对象可以在多个位置出现。官方建议,i3dm可以用于存储大尺度上的树木、风车、消防栓、井盖、路灯、信号灯等物体,也可以用于存储小尺度上的螺丝钉、阀门、插座等。i3dm体现的是要素的相同性,这种相同性不仅表现在要素的种类,也表现在具体的内容。i3dm从很大程度上减少了数据冗余度,这也刚好诠释了i3dm对于“实例”的含义。i3dm文件的基本结构与b3dm类似,如下图所示,文件的头部仅仅多了对引用glb文件的描述(url或内嵌二进制glTF)。i3dm与b3dm的差别主要在要素表部分,i3dm的要素表除了实例的个数还需要存储实例出现的位置以及方位,通过位置坐标与方向参数确定实例模型在三维椭球上的渲染位置与姿态。此外,i3dm也提供了在局部地表的ENU坐标框架,当设置这种坐标框架开启时可以不用设置模型方位参数,而改由Cesium运行环境计算所需参数。
image.png

数据组织文件tileset.json

3DTiels用tileset.json来组织所有瓦片,它用JSON对象的形式记录了对整个树状结构的描述。
tileset.json文件顶层结构有四个属性:asset,properties,geometricError和root。asset存储瓦片集元数据信息;properties存储要素属性信息的极值;geometricError是一个非负数值,定义瓦片集的渲染条件;root存储根瓦片的信息,其中包含的属性有:
boundingVolume.region属性是包含六个元素的数组对象,用经纬度定义了瓦片的包围盒,格式是[west, south, east, north, minimum height, maximum height]。也就是西南东北经纬度极值和高度极值的组合。经纬度以弧度为单位,高度以米为单位,除了region,还有其他包围盒格式可以使用,比如box和sphere,box是用米制单位的长宽高定义的长方体包围盒,sphere是用球心和半径定义的球形包围盒。
viewerRequestVolume是一个可选参数。它定义了一个包围盒,当瓦片中存在viewerRequestVolume时,只有在视口位置完全包含在viewerRequestVolume中,瓦片内容才会被渲染。
geometricError属性是一个非负数值,定义了一个以米为单位的几何误差,在当前瓦片已经渲染而它的子瓦片还未渲染的情况下使用。在应用运行时,几何误差用于计算屏幕空间误差(Screen-Space Error,SSE),也就是以像素为单位的误差。SSE决定HLOD层级是否应该细化。例如,判断一个瓦片在当前视图中是否足够精细,或者是否需要考虑加载它的子瓦片。
refine属性是一个字符串,定义了细化方法。它有两个值,一个是REPLACE,代表替换细化,也就是子瓦片替换父瓦片进行渲染,场景会删除父瓦片的内容;另一个是ADD,用于叠加细化,也就是子瓦片叠加到场景中,细化后父瓦片依然存在。在一个tileset.json文件中的根瓦片必须要有refine属性。其他子瓦片中如果没有refine属性时,就继承父对象的细化方法。
content属性是一个包含瓦片内容和链接的元数据对象。content.url是一个绝对或者相对路径,指向瓦片的内容。content.url中的文件后缀名定义了瓦片格式。url可以是另一个tileset.json文件,也就是将该瓦片的内容指向另一个3DTiles数据集。
content.boundingVolume定义了另一个包围盒,与瓦片的boundingVolume属性相似。但是不同于瓦片的boundingVolumecontent.boundingVolume是一个正好紧紧包围瓦片内容的包围盒。这样的设定用于替换细化:boundingVolume提供空间连续性,content.boundingVolume有助于紧凑的视锥体剔除。

瓦片索引机制自由

3DTiles没有强制要求瓦片索引树的具体结构,对瓦片空间的划分方式上也没有强制定义,仅仅要求瓦片所占据的空间在整个瓦片索引树结构中要保持空间一致性。
对于同样的地理空间,k-d树具有最深的分割层次,四叉树和八叉树次之,格网最浅。其中,格网索引结构对Cesium的压力最大,因为所有的子节点都在根节点下,Cesium每一次对包围盒的检查都要遍历所有结点,所以格网适合分块较少的情况。k-d树对于Cesium的要求较小,但是每一次划分都不规则,分割的标准不好确定。所以,一般情况下都是用折中的四叉树结构或八叉树结构。由于八叉树多用于构建点云索引,所以对于3DTiles来说四叉树是地表空间附近常用的索引方案。

对象映射机制自由

Cesium中所有三维模型的渲染最终都是以primitive图元为单位提交绘制命令的,图元中包含的数据有几何数据以及材质引用的纹理。Cesium研发团队为了在WebGL基础上实现要素拾取和属性查找的功能,对3DTiles瓦片中的gltf模型增加了新的内容:在primitive的attitude中增加了BATCHID属性,BATCHID属性与顶点数据类似,通过访问器连接到特定的二进制数据。BATCHID存储的是整数数组,这个数组与顶点数组元素一一对应,也就是说每一个顶点都被打上了一个整数id的标记。Cesium在实现要素拾取时,只要拾取到渲染的图元中的三角形就可以得到该三角形的任意一个顶点,也就可以获取每个顶点对应的BATCHID整数。然后由这个整数值在batchtable的属性数组中找到对应索引位置的属性数据。
b3dm使用的glb中_BATCHID整数通常采用UNSIGNED_SHORT类型(数值范围0255),所以一般单个瓦片中的要素数量不超过256个。当某些时候要素数量超过这个值时,那么在生产数据时_BATCHID整数的类型要调整为UNSIGNED_INT(数值范围04294967295),但这种情况很少发生。下图是要素映射机制的图例。
image.png
这种特殊的对象映射机制具有一种非常强大的优势:可以完全屏蔽掉gltf定义对要素的组织方式。也就是说,不论gltf根据自己的定义框架将待描述物体组织成什么结构,当gltf被包装成b3dm瓦片时依然可以对要素进行区分。这个方法跳过了gltf这一层数据框架的限制,使那些采用不同数据组织逻辑转化出的gltf数据都可以实现要素化。这样自由的要素映射机制使各种异质数据更加容易转化,体现了3DTiles的兼容性。但是从数据生产上游角度来看,在gltf转化成3DTiles之前,仍然要明确要素在gltf中的结构。只有这样对_BATCHID数据的构造才是符合逻辑的。

位置变换机制多样

在3DTiles中有很多设置瓦片坐标的变换方法:

  1. 通过瓦片集索引树中的transform属性设置矩阵
  2. 通过瓦片内gltf的节点矩阵设置
  3. 通过CESIUM_RTC扩展来添加平移量

一般情况下转换为3DTiles的数据源模型都在一个局部坐标框架下。以ENU坐标系为例,在这个坐标系下,空间的正东、正北以及上坐标都是确定的,坐标原点对应着在椭球上的地理位置,这样模型存储在这个坐标系中的位置也是固定的。那么,为了将局部坐标系的模型放置在椭球表面时,需要的工作就是根据函数Transforms.eastNorthUpToFixedFrame计算坐标变换矩阵M,并把坐标变换矩阵M配置到3DTiles数据中。在Cesium上直接加载gltf的API就是根据计算出的矩阵M将gltf模型放置在椭球表面上的。由于设置变换矩阵有很多方法,所以配置矩阵就有很多方案。第一种方案,将矩阵M直接配置在瓦片元数据的transform属性中;第二种方案,将矩阵M配置到gltf的根节点中;第三种方案,将矩阵M分解为平移矩阵T和旋转矩阵R,即M=TR,将旋转矩阵R配置给gltf的根节点矩阵,将矩阵T中平移参数作为平移分量设置为gltf定义的扩展设置CESIUM_RTC;第四种方案,将M分解的平移矩阵T分量配置给CESIUM_RTC,将R矩阵作用于顶点和外法向量数据,直接改动模型底层的顶点数据。

LOD配置多样

3DTiles瓦片精化方式有两种:REPLACE和ADD。REPLACE就是用子节点中更加精细的模型代替父节点中略显粗糙的模型,各层数据可以通过最精细模型采用自动简化算法获得。ADD则提供了另外一种不同的思路:在父亲节点的模型基础上再增加一些相对次要的模型,从而使三维场景包含更多的信息。下图是两种方式的对比图:
image.png
在大空间范围内的海量建筑物显示以及小空间范围内的精细复杂模型的显示都可以用合适的精化方式来表示。例如,大范围的倾斜摄影OSGB数据本身带有LOD,可以很容易的转成REPLACE精化方式下的3DTiles数据。又如,通过OSM数据生产的纽约城市建筑物3DTiles,是采用ADD精化方式组织的建筑物瓦片,加载时先加载节点树中顶层的模型,然后根据区域逐层添加次要建筑。此外,在BIM数据的表现方面3DTiles的精化逻辑也可以完美的适应,根据数据源的基本结构也可以采用ADD精化方式组织BIM模型部件。除了这些常用的LOD方式,ADD和REPLACE方式也可以混合使用,这样生产的3DTiles数据会具有更加优化的显示效果。

属性数据配置多样

关于属性数据配置有多种方案:
(1)项目应用仅仅为了显示,与要素和属性无关。在这种情况下,3DTiles只需要储存模型数据,所以b3dm瓦片中的batchTable批量表为空,内嵌glb中的_BATCHID数据不需要。这种情况很多,比如加载显示倾斜摄影模型或三维地形等。
(2)项目应用需要存储要素与属性。此时内嵌gltf需要_BATCHID数据,但batchTable批量表就存在两种可选的方案。一种是将属性数据全部存储到批量表中,与模型数据集中管理。另一种方案是属性数据存储到数据库中,批量表中只存储要素ID,使属性和模型分离。在应用开发时由Cesium运行环境获取要素ID,然后根据ID调用属性查询服务获取更加详细的属性信息。

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

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

相关文章

ROS摄像机标定

文章目录 一、环境准备二、摄像头标定2.1 为什么要标定2.2 标定前准备2.2.1 标定板2.2.2 摄像头调焦 2.3 开始标定2.4 测试标定结果 总结参考资料 一、环境准备 安装usb_cam相机驱动 sudo apt-get install ros-noetic-usb-cam 安装标定功能包 sudo apt-get install ros-noet…

力扣HOT100 - 108. 将有序数组转换为二叉搜索树

解题思路: 二叉搜索树一般使用中序遍历 class Solution {public TreeNode sortedArrayToBST(int[] nums) {return helper(nums,0,nums.length-1);}public TreeNode helper(int[] nums,int left,int right){if(left>right) return null;//确定根节点//总是选择中…

微软发布Phi-3,手机上就能跑,是时候聊聊小型语言模型了|TodayAI

微软公司最近宣布推出了其最新开发的最新AI语言模型,名为Phi-3。这款小型语言模型(SLMs)在市场上以其卓越的性能和成本效率获得关注,尤其在语言处理、推理、编程及数学基准测试方面表现出色,超越了同等规模甚至更大规模…

2024年教你学会如何把学浪视频下载到本地

今年是2024年,依然有很多小伙伴想下载学浪却不知道怎么下载,本文就教大家如何使用小浪助手工具下载学浪视频 小浪助手工具我已经打包好了,有需要的自己取一下 学浪下载工具链接:https://pan.baidu.com/s/1-axc7xDtwU_KtupCe52sV…

华为 2024 届实习校园招聘-硬件通⽤/单板开发——第九套

华为 2024 届实习校园招聘-硬件通⽤/单板开发——第九套 部分题目分享,完整版带答案(有答案和解析,答案非官方,未仔细校正,仅供参考)(共十套)获取(WX:didadidadidida313&#xff0c…

你如何看待AIGC技术?

你如何看待AIGC技术? AIGC技术(Artificial Intelligence Generated Content)是指由人工智能生成的内容。它在许多领域都有应用,包括自然语言处理、图像生成、音频合成等。虽然这些技术可以提高效率和创造力,但也需要注…

IP6505T最大输出24W,集成11种快充输出协议的SOC IC 为车载充电器、快充适配器、智能排插提供完整的解决方案

IP6505T产品概述: IP6505T是一款集成同步开关的降压转换器、 支持 11 种输出快充协议,为车载充电器、快充适配 器、智能排插提供完整的解决方案。内置功率 MOS,输入电压范围是 4.5V 到 32V,输出电压范围是 3V 到 12V,…

C语言编程题_3D接雨水

接雨水的题目描述如下。 (1) 2D接雨水: 字节员工是不是个个都会接雨水 ; (2) 3D接雨水: 407. 接雨水 II ; (3) 3D接雨水: 字节人都会的 3D接雨水 。 问题描述 难度:困难 给你一个 m x n 的矩阵&#xff…

企业有哪些常见网络需求场景?

企业的网络场景需求多种多样,主要取决于其业务规模、运营模式、技术应用等因素。 常见的企业网络场景需求 办公网络需求: 高速稳定的内部网络连接,以支持员工日常办公、数据传输和资源共享。 无线办公网络覆盖,以便员工在会议室…

OpenCV从入门到精通实战(七)——探索图像处理:自定义滤波与OpenCV卷积核

本文主要介绍如何使用Python和OpenCV库通过卷积操作来应用不同的图像滤波效果。主要分为几个步骤:图像的读取与处理、自定义卷积函数的实现、不同卷积核的应用,以及结果的展示。 卷积 在图像处理中,卷积是一种重要的操作,它通过…

C++|运算符重载(3)|日期类的计算

前面介绍了运算符重载相关规则和方法&#xff0c;今天用运算重载函数实现对日期类的操作。 目录 前面准备 实现功能&#xff1a; -运算符 Date类和int 相减 Date类和Date类相减 运算符 &#xff0c;-运算符 ,!运算符 >,>运算符 <,<运算符 &#xff0c;-…

前端vue仿美团风格下拉筛选框在前端开发中的实现与应用

摘要&#xff1a; 在前端开发中&#xff0c;下拉筛选框是提升用户体验和交互效果的重要组件之一。本文将以美团风格的下拉筛选框为例&#xff0c;介绍其实现原理、技术细节以及在实际项目中的应用。通过自定义组件CCDropDownFilter&#xff0c;我们将展示如何创建一个功能丰富、…

蚓链数字化营销系统与数字资产的关系

蚓链数字化营销系统是一种利用数字技术来实现营销目标的系统。它集成了多种数字营销工具和渠道&#xff0c;以收集、分析和利用客户数据&#xff0c;优化营销活动&#xff0c;并提高营销效果。 数字资产是一种新型的资产类别&#xff0c;它们以电子数据的形式存在&#xff0c;可…

快速了解-BTP

名词了解 BTP&#xff1a;SAP Business Technology Platform 是一个技术和业务的平台ETWEAVER &#xff08;SAP NW&#xff09;&#xff1a;NetWeaver本质上是SAP一系列技术产品的集成平台PAAS Cloud Foundry&#xff08;云原生&#xff09;&#xff1a;开源云服务平台烟囱式…

解决Android studio更换sdk地址后flutter项目显示no device selected

问题描述 因为之前sdk的路径在c盘上,经常在更新或下在sdk后c盘饱满,于是就更换了sdk的路径,更换sdk路径后就导致flutter项目在选择设备的时候出现no device selected 找不到设备,但是在device Manager可以看到物理设备或者是虚拟设备。如下图所示。 问题分析 导致这个问题…

【网安小白成长之路】9.sql注入操作

&#x1f42e;博主syst1m 带你 acquire knowledge&#xff01; ✨博客首页——syst1m的博客&#x1f498; &#x1f51e; 《网安小白成长之路(我要变成大佬&#x1f60e;&#xff01;&#xff01;)》真实小白学习历程&#xff0c;手把手带你一起从入门到入狱&#x1f6ad; &…

基于springboot实现实验室管理系统项目【项目源码+论文说明】

基于springboot实现实验室管理系统演示 摘要 随着信息技术在管理上越来越深入而广泛的应用&#xff0c;管理信息系统的实施在技术上已逐步成熟。本文介绍了实验室管理系统的开发全过程。通过分析实验室管理系统管理的不足&#xff0c;创建了一个计算机管理实验室管理系统的方案…

使用Hypothesis生成测试数据

Hypothesis是Python的一个高级测试库。它允许编写测试用例时参数化&#xff0c;然后生成使测试失败的简单易懂的测试数据。可以用更少的工作在代码中发现更多的bug。 安装 pip install hypothesis如何设计测试数据 通过介绍也许你还不了解它是干嘛的&#xff0c;没关系&…

Redis面试题三(集群)

目录 1.Redis 集群搭建有几种模式 2.Redis 主从复制的实现 全量同步 增量同步 3.Redis 的主从同步策略 1. 全量同步&#xff08;Full Resynchronization&#xff09; 2. 增量同步&#xff08;Incremental Replication&#xff09; 4.Redis一致性hash 基本原理 节点动态…

使用shared lib将各个构建工具集成到一起

共享库代码 package devopsdef Build(buildType, buildShell){def buildTools ["mvn": "MVN", "ant": "ANT", "gradle": "GRADLE"]println("当前buildType是${buildType}")buildHome tool buildTool…