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 步长
   33   34   35   36   37   38   39   40   41   42   43