Page 38 - 电力与能源2023年第二期
P. 38
132 陶立欣,等:适用于虚拟现实电站内电气设备模型的网格简化算法
(2)通过式(1)计算得出所有点的坍缩代价, (2)当 SortingTable [vertex1] >= n,则
排序,得出坍缩目标。 vertex1=vertex [vertex1],反之执行步骤 2。
(3)移除坍缩目标点,再次计算它的相邻点的 (3)当 vertex1== − 1 或 者 vertex1 ==
坍缩代价和坍缩目标,重新排序,得出新的坍缩 vertex2 或 者 vertex3==vertex1,那 么 该 三 角 面
目标。 移除,不被绘制。同理判断 vertex2 和 vertex3。
(4)判断是否达到要精简的数值,否则重复前 (4)重 新 获 取 当 前 三 角 面 的 顶 点 vertex1,
3 步,是则结束。 vertex2,vertex3。
4.1.2 离线烘培处理 (5)将当前三角面加入绘制列表。
在简化过程中,如果模型的顶点足够多,那么 (6)整理数据:三角面的数据、顶点的数据。
在操作步骤 2 时,需要将模型所有的顶点遍历很 在模型的简化过程中,要保留网格的原始信
多次,会消耗很长的运算时间才能得到坍缩目标, 息,以便程序使用 LOD 技术。
同时对程序性能有很大的限制。因此考虑将步骤 4.2 模型简化过程的优化
的一部分在运行时进行,另一部分交给离线烘培 为了保证能高效和精确地简化模型,在程序
处理。 中对算法和处理方式进行了优化。在上述介绍的
经 过 离 线 烘 培 后 输 出 两 个 int 类 型 的 数 组 步骤中,在移除坍缩代价最小的点后,需要重新排
——SortingTable 和 vertex。 其 中 ,SortingTable 序所有点的坍缩代价。本文采用的最小优先队列
存储了移除每一个顶点的倒数次序(1 是最后被移 保存顶点和其坍缩代价,优点在于可以动态调整
除的,最先被移除的是最大的那个);vertex 存储 顶点的顺序。同时在离线烘培的过程中采用多线
了每一个顶点坍缩目标的 index,并将数组交给已 程技术来加速烘培。在 unity 中使用 Jobsystem 来
运行的步骤完成。 实现。为了加快处理速度和减少带宽的消耗,试
离线烘培步骤如下。 验中删除了许多不必要的顶点。这样处理三角面
(1)收集网格信息:顶点信息包含顶点位置 的数据和顶点的属性(uv、olor、mormal),数组就
c
index、所属三角面的集合、相邻点的集合。三角 会更少。在边界点的处理上,当没有正确的坍缩
面的信息包含 3 个顶点、法线等。 目标出现时,将这些边缘点的曲面率手动设置为
(2)通过式(1)计算得出所有点的坍缩代价, 2,这样是为了解决精简模型出现破损和镂空现象
排序,得出坍缩目标。 的问题。对于没有闭合的三角形和具有不同属性
(3)移除要坍缩的顶点:先删除 v 和所有含 v (uv)但位置相同的两个点,不在此边界处理方法
的三角面,然后重新估算与 u 相邻的所有点的坍 内。最后数据内存的优化,因为试验使用了 unity
缩代价、坍缩目标,再更新排序表。 工具,采用 unsafe 的手段修改数组大小,这样做的
(4)令 SortingTable [u.index]等 于 现 在 的 顶 目的是解决重复生成数组的问题,以及用指针代
点数量,令 vertex[u.index]= v.index,当没有要 替重复 new 的问题。
移除的点时,将其值赋为−1。 为了得到简化率对模型简化外观的影响,对
(5)判 断 精 简 程 度 是 否 达 标 ,否 则 重 复 不同结构的模型进行了试验。以变压器为例, 对
前 4 步。 于变压器底座这样的面积大但是三角面少的情
将离线烘培得到的数据交给简化算法运行, 况,可以使用两种方式处理。
步骤如下。 (1)记录网格三角形的密度(总周长除以三角
(1)通过遍历网格的所有三角形面,可以获 形个数),根据密度来调整简化率。让密度大的多
得 在 当 前 三 角 形 面 上 的 所 有 顶 点 的 index,如 简化,密度小的少简化。当前逻辑为:取密度经验
vertex1,vertex2,vertex3。 值为 1,当模型中的网格密度小于 1 时,按 0.5 步长

