随着矿山行业数字化转型的深入,还原矿体品位(物质含量)的三维可视化尤为关键,而关于展示矿体品位(物质含量)的内容,一般来说都用体元栅格(块段模型)的方式展示数据。
为了真实还原地质勘探中的体元栅格(块段模型),我们需要在虚幻引擎(UE)中重现上千万级离散单元的细节。然而,这面临着显著的技术挑战:UE原生架构基于网格(Mesh)与材质体系,缺乏原生的“体素(Voxel)”数据概念。
本文中我们将讨论,如何将海量的地质块段数据高效映射为UE可渲染的视觉实体,同时保持品位信息的准确传达,使孪生项目支撑矿体空间分布分析。
技术挑战
为了重现体元栅格,我们需要在UE中以批量立方体模型渲染。分析业务需求,我们需要按照四类能力进行展开:
- 大规模显示:支持千万级块段数据加载、索引和可视化表达。
- 属性映射:根据品位、矿石类型或者其他地质属性,对块段进行颜色映射。
- 剖切查看:支持平面、轴向或区域范围查看内部块段分布。
- 拾取查询:支持可视化场景中点击块段,并返回对应属性。
首先摆在我们面前的问题就是大批量的体素渲染问题,一般来说在UE中拥有如下两种思路来实现需求:
Instanced Static Mesh(ISM)渲染
实例化静态网格体(Instanced Static Mesh,ISM)是UE中用于渲染大批量模型的组件,通过“一次绘制,多次复用”机制,仅需一次指令即可批量渲染大量结构相同但变换各异的物体,可以极大程度减轻CPU 负担。
然而,实例化静态网格体并非无代价的。当实例数量达到百万级甚至千万级时,即便几何数据被复用,引擎仍需为每一个独立实例维护变换矩阵与物理状态。若开启碰撞检测,物理引擎对海量离散碰撞体的管理与查询将产生巨大的计算开销。

Niagara GPU粒子渲染
Niagara是UE中的特效模块,他除了可以渲染sprite、ribbon等常见特效元素外,还可以渲染mesh元素,同时在大批量渲染元素时可以启动GPU模式,相对于CPU渲染模型提供更优秀的性能。
然而,Niagara 网格体渲染同样并非全能的解决方案。由于其核心机制是将海量实例作为纯视觉粒子在 GPU 端并行处理,这些实例在引擎层面并不被视为独立的场景对象,导致它们天然缺乏原生的碰撞体积与输入响应句柄,使得实现如鼠标点击选中单个物体等交互功能变得异常困难。

方案对比
为量化评估实例化静态网格体(ISM)与 Niagara 粒子系统在大规模体素渲染场景下的性能差异,我们构建了一套基于模拟数据的基准测试流程。该方案通过程序化遍历生成包含 N__ 个离散坐标的稀疏体素数据集还原真实的海量网格分布特征,然后测试对比两种方案性能,为后续海量体素渲染的技术选型提供极具价值的初步参考依据。

测试证实,Niagara 在渲染大量模型的性能显著优于 ISM。
然而,该方案仍面临两大挑战:
一是Nigara粒子在GPU渲染的模式下,单个粒子发射器引擎中最多只能渲染200w个粒子。
二是Niagara本身并不支持碰撞的操作,我们需要自定义查询点击到的粒子逻辑。
实践方案
渲染体素颜色表现品味
首先我们先讨论如何将每个Niagara的粒子表现矿体品位(物质含量),很显然通过不同粒子根据含量深度来渲染不同的颜色,是最直观的方式。
实现思路也并不复杂,首先我们在材质中通过DynamicParameter的节点设置材质颜色,然后只需要在Niagara中实现自定义模块,根据粒子ID动态设置DynamicParameter的值即可。需要注意的是,为了后续调整方便,尽量结合颜色曲线的方式来设置材质颜色。


千万级数据预处理
由于我们最终需要面临的是千万级别的数据查询,所以在启动核心渲染与计算逻辑之前,我们必须对原始体素数据进行预处理,将其转化为适配GPU并行计算与CPU快速访问的最优形态,为后续的逻辑搭建好地基,确保最终功能可以流畅运行。
分块网格策略对三维空间进行逻辑剖分,首先求解体素的空间边界,并预定义单个体素的几何尺寸,以此确定x、y、z三个维度上可容纳的最大体素数量。随后,对每个体素的空间坐标进行映射计算,得到其在x、y、z维度上的网格编号,最终将三维体素索引一维化存储至数组中,一维索引计算公式如下:
Index=Nx*Ny*N。
其中Nx、Ny、Nz分别为当前体素在x、y、z维度上的网格编号。
经过如上调整,便于我们我们后续快速查询出外壳数据、剖面数据、查询点击的数据。

渲染性能优化
在前文中我们提到,一个Niagara发射器最多只能渲染200w的粒子,为了最终渲染千万级别的粒子,我们必须要换一种思路来实现功能。
在体元栅格渲染中,用户只能观察到外层表面,内部实心体素被完全遮挡。只有当用户进行剖切操作的时候,才可以观察到内部体素。因此,我们可以采用“外表面体素提取”的方式:在预处理阶段,通过邻域检测识别出所有至少有一个面暴露于空间的体素,并仅对这些“外表面体素”进行网格实例化,直接剔除内部不可见体素的渲染提交。
得益于前文定义的分块网格数据结构,这一过程变得极为高效:我们无需进行全局复杂的几何分析,只需在局部网格内线性扫描,检查每个体素与其相邻六个方向的状态。若邻域为空,则该体素被标记为表面。这种基于局部邻域的判定逻辑,充分利用了内存的连续性,将原本高昂的全局检测成本转化为高效的线性遍历。
至于如何将在剖切情况下展示内部的体素,后文中将会分享。
构建剖面
当我们进行实时剖切来查看内部体素数据时,用户实际上也只能观察到外壳+剖面的数据,所以也只需要渲染这部分数据即可。
除此之外,实时剖切的执行策略也是一个值得探讨的内容,实时剖切过程可拆解为“外壳动态裁剪”与“剖面实时生成”两个部分。这涉及到了大量粒子的位置更新和大量粒子的创建、销毁。这里我们可以采取“动静分离”策略,将大部分逻辑转换至GPU计算,从而优化批量数据更新的性能表现。
外壳部分(静):初始化时生成完整外壳体素,并在渲染粒子的材质中实现利用不透明遮罩动态裁切粒子的逻辑。在剖切交互中,通过动态调整粒子材质的参数,实现视觉层面上的剖面裁切,无需CPU介入修改Niagara数据。
剖面部分(动):而在剖面上,得益于前文定义的分块网格数据结构,剖切的时候我们可以计算与剖面相切的“行 - 列 - 层”,只需根据剖切平面的法线与位置,快速定位受影响的特定“行 - 列 - 层”索引范围。避免大量循环遍历判断的逻辑,仅依靠Get获取数组中的元素,即可高效提取相交体素数据并生成对应的Niagara粒子。
这种方案将大量的逐帧剔除运算转移至GPU,CPU仅需处理少量的剖面增量数据,从而以极低的算力代价实现流畅的剖切效果。同时,使外壳粒子+剖面粒子的数量控制在200w内,用最低的消耗模拟呈现千万级体素的效果。

Niagara 点击交互
鉴于 Niagara 粒子系统原生缺乏物理碰撞组件与输入事件响应机制,我们构建了一套基于“射线投射 + 离散遍历”的轻量级自定义拾取逻辑。该方案首先将鼠标屏幕坐标反投影,精准构建包含起点与方向向量的世界空间检测射线;随后,依托体素网格规则的数学特性,采用 3D DDA(数字微分分析器) 算法执行高效的空间遍历:算法先计算射线与模型整体包围盒(AABB)的交点以确定入口,进而沿射线方向进行整数步进。
得益于前文定义的分块网格架构,遍历过程实现了两级加速——若射线穿过的“块”被标记为空,则直接跳过整个块的范围;若块有效,则仅在块内执行精细的体素步进,一旦命中首个非空体素即刻终止并取出对应数据。
利用这种方案,我们在避免大量循环、保证千万级体素的情况下,流畅查询体素数据。

结尾
基于上文的制作方式和优化策略,我们成功在UE中利用Niagara实现了体元栅格效果,在保证流畅度的前提下,通过外表面渲染的方案模拟了千万级体素渲染,同时实现交互查询数据的需求和动态剖切。

这套“数据结构先行、只渲染可见部分、交互算法优化”的思路,并不只适用于矿体品位展示。还能用于 有限元展示、北斗网格等规则离散网格场景,只要数据具备“网格单元 + 属性字段 + 空间索引”的特征,都可以复用同一套技术框架。


未来我们也将持续探索大规模、更动态、跨系统的网格数据可视化能力,让复杂工程与地理数据在数字孪生中真正可分析、可决策。

209

被折叠的 条评论
为什么被折叠?



