3DTiles生产流程与规范

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

瓦片切分

标准的四叉树切分对于均匀分布的地理数据切片非常有效,但是这样均等的切分不适用于随机分布、不均匀分布的地理数据,当地理数据稀疏分布的时候,均等的四叉树就不再高效,此时可以考虑用紧凑的包围盒代替均等的包围盒。

紧凑包围盒的四叉树空间结构
此外,对于上述稀疏不均匀分布的地理数据,还可以用KD树的切分方法。KD树的方法需要设置最大深度d。具体切分步骤如下:
(1)选择一个坐标轴,作为本次切分的基础坐标轴,计算所有几何体在该坐标轴上的中心值。
(2)以该中心值为界限将整个区域分为两块子瓦片,同时几何体也分为两组,分别划入子瓦片中。
(3)针对子瓦片重复上述操作,每次切分时旋转一次坐标轴作为新的基础坐标轴,每次切分相当于树结构的深度增加一层,当树的深度大于d时停止切分。

KD树会将区域中的几何体分为两部分,所以这种方法生成的树结构具有较好的均衡性,也就是子瓦片中的几何复杂度都相对均匀。但是因为切分的的子瓦片只有两份,所以会产生相对较深的树结构,不适合大型数据集的切分。
image.png

倾斜摄影或点云建模

image.png
    一切工作的开始是确定采集范围,根据采集范围创建索引并分割采集区域,创建索引得到索引树,分割区域得到瓦片包围盒的经纬度范围,同时根据既定的文件组织结构对保存各区域数据的瓦片文件命名。
    接下来按照采集区域进行采集,在采集过程中,可以一次性采集区域中多个建筑,或者使用设备逐个采集,这样得到的可能是包含多要素或单要素的格网模型。因为三维格网是有环境噪声的,所以需要用去噪方法将其中表示为建筑物的部分提取为要素化的三维模型。如果前面的采集对象为单体建筑物,则需要通过模型合并集中单体模型到一起,即合并成包含多个建筑物要素的模型文件。
    多要素模型向下要得出多个参数:一是根据多要素模型文件中的高度范围补充之前瓦片包围盒缺少的高度信息,二是将多要素模型通过地理坐标转换得到瓦片内数据的包围盒(进一步得到整个瓦片数据的地理坐标),并根据空间一致性检查修正瓦片包围盒,对模型超出的边界进行扩张,进而扩张父节点包围盒边界。三是根据对几何体误差的规定计算当前模型文件的几何体误差。四是将多要素模型转换为gltf格式,根据既定的局部框架,可以将局部矩阵集成到gltf中或者放到瓦片元数据中。
    最后进行数据装配:一是要把多要素gltf结合属性数据组装为瓦片数据文件b3dm,二是把瓦片文件url、包围盒、数据包围盒、几何体误差以及可能作为参数的瓦片地理位置转换的局部框架矩阵组装成瓦片元数据。三是把瓦片元数据与索引树构造为对应的JSON树,用来构建tileset.json文件。最后完成构造3DTiles的所有工作。

地理要素数据集建模

image.png
    首先数据源为地理要素数据集,坐标为WGS84坐标系,然后通过投影转换工具得到投影坐标系下的要素数据集。地理坐标系统下的要素数据集用来构建瓦片索引和分割区域,可以得到索引树、瓦片url、瓦片包围盒、数据包围盒。投影坐标系下的要素数据集用于接下来的要素化建模,在区域分割的同时对投影坐标系下的要素按照区域分组,获得与区域对应的要素组,对每一组要素集计算几何体误差。
    将要素组导入到建模软件中,根据建筑物的高度以及纹理图片进行建模。可以构建多要素的模型或者单要素的模型,若进行单要素建模则需要再进行模型的合并。
    然后将多要素模型通过格式转换成多要素gltf,再将其和要素组中的属性数据一起组装成瓦片文件b3dm。同时,瓦片url、瓦片包围盒、数据包围盒、几何体误差构成瓦片元数据,与索引树一起构成JSON树,并写入tileset.json文件中,最后形成完成的3DTiles。

地理要素数据的3DTiles生产

3.1 下载shp数据,对属性数据进行补齐,增加建筑物高度字段。
3.2 利用ArcGIS对shp数据进行投影变换。
3.3 将整个区域根据LOD准则进行划分(一般选取四叉树分割),选取一些大型或标志性建筑作为根节点,然后根据四叉树分割的四块区域作为根节点的子节点进行存储。这样就相当于生成了5个shp文件,然后进一步得到tileset.json文件。
3.4 将包含部分地理要素的shp文件导入到建模软件中建模。首先将划分后的shp文件导出为CAD文件,然后将CAD文件在3ds MAX中加载。因为加载到3ds MAX中的CAD是以线的形式存储的,所以需要将线转换为可编辑多边形。之后通过编组、平移、解组的方式将所有数据移动到坐标原点附近,这样操作的目的是使瓦片模型数据采用局部空间直角坐标框架。对模型的构建主要使用面的挤出功能,同时使用高清照片进行贴图。建模完成后还要将要素的id编辑到场景下对应的根节点名称中,用于后面的_BATCHID的添加与属性数据的
3.5 接下来是进行b3dm瓦片的转换。首先将3ds Max建模后的模型数据导出成obj文件,然后将obj文件转换成glb文件,再将glb与属性数据根据场景根节点预先记录的id号进行映射,构造b3dm。最后,将b3dm按照tileset.json中的url放置到指定文件位置,至此3DTiles构建完成。

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

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

相关文章

跟着Datawhale重学数据结构与算法(3)---排序算法

开源链接:【 教程地址 】【电子网站】 【写博客的目的是记录自己学习过程,方便自己复盘,专业课复习】 数组排序: #mermaid-svg-F3iLcKsVv8gcmqqC {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16p…

PHP项目搭建与启动

1、拉取项目 2、安装phpstudy 下载地址: Windows版phpstudy下载 - 小皮面板(phpstudy) (xp.cn) 软件安装: Apache2.4.39、Nginx1.15.11、MySQL8.0.12、 composer2.5.8 添加伪静态 将下面代码写入到伪静态配置文本域框内: location ~* (ru…

【Qt 学习笔记】Qt常用控件 | 输入类控件 | Text Edit的使用及说明

博客主页:Duck Bro 博客主页系列专栏:Qt 专栏关注博主,后期持续更新系列文章如果有错误感谢请大家批评指出,及时修改感谢大家点赞👍收藏⭐评论✍ Qt常用控件 | 输入类控件 | Text Edit的使用及说明 文章编号&#xff…

VScode使用cmake编译

一:输入 ctrlshiftp打开用于命令执行的输入框 二:输入cmake,选择quick start 模式 三:选择版本最高的gcc版本 四:输入项目名称 选择C 五:选择executable 这样便创建好了最简单的cmake例程,一个…

企业微信代开发应用登录操作

首先声明:企微的文档写得真烂!!!有一些问题,官方情愿在问答区给用户一个个解答,也不愿意在文档写清楚,生怕自己工作量不饱和被优化。 概念说明 代开发应用,是相对于自建应用来说的。…

[Swift]组件化开发

一、组件化开发基础 1.组件定义 在软件开发中,一个组件是指一个独立的、可替换的软件单元,它封装了一组相关的功能。组件通过定义的接口与外界交互,并且这些接口隔离了组件内部的实现细节。在Swift语言中,组件可以是一个模块、一…

车企如何利用数据技术,指导汽车全生命周期的业务运营?

引言:数据正作为重点,为行业提供不可或缺的指导 《汽车数据发展研究报告(2023)》指出,汽车行业正由传统硬件制造向“电动化、智能化、网联化”方向转变。德勤预测,到 2025 年,汽车行业 20%的利…

K8s: 部署 kubernetes dashboard

部署 Dashboard K8s 官方有一个项目叫 dashboard,通过这个项目更方便监控集群的状态 官方地址: https://github.com/kubernetes/dashboard 通常我们通过命令行 $ kubectl get po -n kube-system 能够查看到集群所有的组件,但这样的方式比较不太直观 …

【JavaScript】内置对象 ③ ( Math 内置对象 | Math 内置对象简介 | Math 内置对象的使用 )

文章目录 一、Math 内置对象1、Math 内置对象简介2、Math 内置对象的使用 二、代码示例1、代码示例 - Math 内置对象的使用2、代码示例 - 封装 Math 内置对象 一、Math 内置对象 1、Math 内置对象简介 JavaScript 中的 Math 内置对象 是一个 全局对象 , 该对象 提供了 常用的 数…

通过 QEMU 试用 ESP32-C3 的安全功能

概述 ESP32-C3 系列芯片支持可信启动、flash 加密、安全存储等多种安全功能,还有专用外设来支持 HMAC 和数字签名等用例。这些功能所需的私钥和配置大多存储在 ESP32-C3 的 eFuse 存储器中。 启用安全功能时需要谨慎,因为使用到的 eFuse 存储器是一次…

安卓studio插件开发(一)本地搭建工程

下载idea 社区版本 建立IDE Plugin工程 点击create就行,新建立的工程长这样 比较重要的文件 build.gradle:配置工程的参数 plugin.xml:设置插件的Action位置 build.gradle.kts内容如下: plugins {id("java")id(&quo…

【网络安全】安全事件管理处置 — 事件分级分类

专栏文章索引:网络安全 有问题可私聊:QQ:3375119339 目录 一、安全事件分级 二、应急事件分级 三、安全事件分类 四、常见安全事件原因分析 1.web入侵 2.漏洞攻击 3.网络攻击 一、安全事件分级 在对安全事件的应急响应过程中&#xf…

6.MMD ray渲染 材质的添加及打光方法

材质 前置准备 先准备好模型和场景 将ray控制器拖入进去 添加完默认的材质以后的效果 打开插入材质页面 打开MaterialMap栏 将流萤的模型展开 自发光 现在给领带添加一个自发光效果 在自发光Emissive里,打开x1,选择albedo,白光 现在…

OpenMesh 计算封闭网格体积

文章目录 一、简介二、实现代码三、实现效果参考资料一、简介 思路很是简单,就是计算一些四面体的有向体积(这些四面体均是基于网格中的三角形与原点组成的) ,至于体积的符号则来自于三角形是否指向原点方向来确定,即面片的法线方向(其中三角形的法线本身取决于顶点的顺序…

80个在线小游戏源码

源码简介 搭建80个在线小游戏网站源码,解压即可食用,支持在本地浏览器打开。 安装教程 纯HTML,直接将压缩包上传网站目录解压即可 首页截图 源码下载 80个在线小游戏源码-小8源码屋

BGP的基本概念和工作原理

AS的由来 l Autonomous System 自治系统,为了便于管理规模不断扩大的网络,将网络划分为不同的AS l 不同AS通过AS号区分,AS号取值范围1-65535,其中64512-65535是私有AS号 l IANA机构负责AS号的分发 AS之…

【Vue】通过Axios实现异步通信(简单案例)

一、Axios介绍 1、是什么 Axios 是一个基于 promise 的 HTTP 库,简单的讲就是可以发送get、post请求。当然这些请求ajax和jquery也能做,但是由于Vue、React等框架的出现,促使了Axios轻量级库的出现,因为Vue等,不需要操…

LabVIEW专栏九、类的应用

一、类的应用 接上一章"类" 类在项目中,一般会在类的私有成员簇内,包含一个数据类型为参数类的队列。 例如网口类,里面实际会包含很多信息,有IP地址和端口等等参数。这些参数如果不放在队列引用中缓存下来,…

HarmonyOS开发实战(黑马健康系列一:欢迎页)

系列文章目录 (零)鸿蒙HarmonyOS入门:如何配置环境,输出“Hello World“ (一)鸿蒙HarmonyOS开发基础 (二)鸿蒙HarmonyOS主力开发语言ArkTS-基本语法 (三)鸿蒙…