基于Unity引擎加载倾斜摄影模型的可视化算法的设计与实现
葛旭东,曹明,欧国庆
中水三立数据技术股份有限公司,安徽 合肥 230001
摘要:针对大规模数字孪生场景需要导入倾斜摄影数据做数据底板,但由于倾斜摄影模型数据量较大,导致在加载数据底板时需要耗费大量的时间并且占用大量的资源等因素,本文提出了一种基于Unity引擎加载倾斜摄影模型的可视化算法,实现了对倾斜摄影模型的分布式加载与并有效减少加载时占用内存的问题。算法由开源的3mx倾斜摄影模型格式与LRU(Least Recently Used)页面置换算法组成。通过这一可视化算法,可以建立一个能够可视化的高保真三维场景用于支持测试与决策。
关键词:GIS;Unity;数字孪生;数字化场景;倾斜摄影测量模型;3MX
1 引言
在智慧城市背景下,数字孪生可以针对一个地区,建立一个能够可视化的高保真三维场景用于支持测试与决策,因此,首先需要构建带有位置信息的统一的空间“数据底板”,将城市真实的地理坐标在虚拟环境中进行呈现。倾斜摄影测量模型是实现数字孪生城市不可或缺的数据底板。
现有技术的不足之处在于,由于数据量较大,无法使用一次性渲染来可视化该数据,研究人员曾提出了很多方法来加载这些城市场景。然而,当用户在实时渲染中快速改变视图区域时可视化游戏引擎,现有方法仍然需要过多的CPU计算和内存占用,导致渲染延迟。
本文能够基于数字孪生相关技术,提供一种能够提高倾斜摄影模型实时可视化流畅度并减少内存使用的Unity引擎中倾斜摄影测量模型的可视化方法。
2 格式转换
以三维可视化技术为支撑,总体交互以L1、L2、L3三层场景实现,提供三维立体的沉浸式体验。Unity引擎中摄影测量模型的可视化方法包括:获取摄影测量模型的OSGB数据可视化游戏引擎,将所述OSGB数据通过开源工具level-of-details toolkit(LTK)转换为Bentley所研发的开源3MX格式;OSGB数据中包括网格模型和对应的纹理图片;此3MX格式全称为三维多分辨率网格交换格式;3MX依赖于多分辨率方法,能够快速检索非常大的三维网格数据。通过该格式使用的网格压缩相结合,可以实现数据流的三维渲染。3MX的主要特征如下:
1、Web友好,易于在浏览器中加载;
2、3MX格式已经针对流式传输进行优化,可以快速的对倾斜摄影测量模型进行显示;
3、多分辨率显示的方法可以用于处理非常大的数据;
3MX 格式包含两种类型的文件:一种是 JSON 格式的主文件,另一种是二进制格式的子文件夹/子文件树。单个主文件包含场景元数据游戏策划,由 3MX 扩展名标识。二进制文件包含几何结构,属于 3MXB(3MX 二进制)类型。3MXB 文件通常描述一个独特的三维纹理棱锥网格。如图1显示了 3MX 场景的文件夹组织示例。场景文件位于根文件夹中。网格描述拆分为多个文件并以树结构进行组织。子文件夹表示上一部分中介绍的 LOD 结构中某个中间节点的子树。
图1 3MX 场景的文件夹组织示例
3MXB 几何结构格式遵循 LOD 原理。它采用树结构形式,其中子节点是父节点的高分辨率表示形式。3MXB 文件以二进制格式写入。它打包或引用一个或一组节点需要的所有数据,其中包括所有纹理和所有几何结构。单个 3MXB 文件可以表示 LOD 树中的多个节点;在这种情况下,所有节点都是同级,即:同一低分辨率节点的子节点。
3MXB 格式的结构如下:
图2 3MXB文件格式
文件头紧跟在 SH 之后,是一个 SH 大小的字符串,采用 JSON 格式,由以下部分组成:
节点:
[node_data0,….,node_dataM]
同级数据数组,每个数据对应一个同级。节点数据的内容将在专门的节中指定。
资源:
[resource_data0,….,resource_dataP]
资源元数据数组,每个元数据对应节点所需的一个资源(纹理或几何结构)。下面进一步详细介绍资源数据。
3MXB 文件完成后会产生大量二进制缓冲区:
Buffer0:
二进制数据缓冲区。缓冲区类型和缓冲区的其他属性在标头资源中指定。
BufferN:
二进制数据缓冲区。
3 倾斜摄影模型加载策略
3.1 LRU算法
在Unity引擎中通过代码编写LRU缓存优化算法[2],检测在当前帧,通过Unity引擎中的摄像头所投影的视椎体裁切得到处在视野范围内的倾斜摄影测量模型,遍历所述视野范围内的3MXB格式文件的节点,获取当前节点所述网格模型的面积与所对应的纹理图片的LOD信息,将这些信息加载进LRU优化缓存算法的队列中,根据摄像头与网格模型的距离远近去加载与替换当前节点所对应的纹理图片的LOD信息。当Unity引擎中的摄像头的视椎体视角不再能够投射到上述倾斜摄影测量模型时,对LRU队列中入队的上述倾斜摄影测量模型进行出队操作像素游戏素材,再将下一个处在视野范围内的倾斜摄影测量模型进行入队操作并在场景中进行加载,循环往复。根据加载的节点信息实现Unity引擎中的倾斜摄影测量模型的可视化。