- 前言
前面介绍了几个重要的OSGB属性字段,具体内容见https://blog.youkuaiyun.com/m0_47612058/article/details/144156189,接下来我们要进行轻量化处理啦。
-算法策略
具体的算法策略其实就两个部分,一是顶点化简、二是降低纹理图片的分辨率。
- 顶点化简
顶点化简的作用就是将三维网格的顶点数目和三角形网格数目减少,这一点有些人可能不理解,大家平常见到的倾斜摄影测量数据哪有顶点,哪有三角形呀?大家可以简单理解为这是因为倾斜摄影测量数据的表面纹理掩盖住了顶点数据,其实根本原因是现有几何数据,比如顶点、三角形基元,在这些几何数据的基础上,我们再计算纹理图片上每一个像素位置与顶点之间的关系,这就是纹理映射。下面这张图就是一个倾斜摄影测量数据的纹理、网格叠加图。
轻量化的第一项工作就是减少这些顶点和三角形基元,而关于这项工作最有名也是最经典的算法就是二尺误差度量(Quadic Error Metrics,QEM)算法,这篇经典论文我放在这个链接里面了,有需要的自取。通过百度网盘分享的文件:Surface Simplification Using Quadri…
链接:https://pan.baidu.com/s/122Xj3oE1KxdoxgJH_J1lcQ?pwd=6666
提取码:6666。
下面呢我们看一下QEM算法的效果,我这里使用的很经典的bunny(兔子)模型,这个模型有35292个顶点,70580个三角形,下面依次将该模型的顶点保存率设置为0.1,0.01,0.001,然后看一下该算法在简化过程中的效果。
通过上面的几张对比图来看,哪怕是顶点保存率在0.0001的情况下,我们还是能够看出来兔子的特征轮廓,这也证明了该算法的优越性。
-
纹理图片降采样
三维模型除了几何数据的存储量比较大以外,纹理图片也是一个比较占用存储量的数据项,对于这个图片数据呢,我们主要采取降低图片的分辨率,从而达到降低存储量的目的。这个方法的原理比较简单,但是也是有坑的,因为我发现我把纹理图片读取出来,然后降低分辨率,最后写入文件后,发现文件存储反而变大了许多,我当时就很迷,后来发现原来有些倾斜摄影测量数据生产软件在生成数据的时候,为了降低数据量,已经将倾斜摄影测量数据进行压缩处理,所以当我们读取数据后,尽管经过了降低分辨率的操作,再写入进去文件存储变大了,因此我们需要在写入数据之前要进行压缩,这里主要使用了zlib库进行压缩,这里是我看了这篇博客才找到的解决方法吗,链接在这里,大家可以看一下https://blog.youkuaiyun.com/rs_lys/article/details/84990901。
我看了其他相关博客,当然还有问了一下ChatGPT,说OpenSceneGraph库其实有纹理压缩的函数,但是我用了一下,发现效果不行,所以我就不推荐了。 -
LOD优化处理
其实有许多学者针对LOD进行了优化处理,主要包括数据抽稀,其实就是减少一个特定的LOD层级,还有一种方法是提取出最精细的三维模型,利用上面提到的网格化简和纹理压缩以及纹理重映射技术生成指定层数的LOD,但是我这里就还是采用原来一样的LOD层级,毕竟原本是多少级,处理后还是多少级能够保证数据的完整性。 -
这里我本来是想发处理前后的LOD表现表现效果的,但是我的数据有点涉密,没办法拿出来进行演示,如果后期有其他数据了的话,我一定把处理前后的数据对比视频发出来。
-
我最后呢将这个算法使用C++写了出来,还使用QT搭建了一个简单的界面程序,下面就是具体的效果了。这个程序在网格化简保持率为50%,纹理图片保持率为80%的前提下,处理5个GB的复杂地形数据大概需要一个40分钟,处理后的存储量大概是2.4GB,处理一两百MB的简单数据的话话,大概只需要4,5分钟,处理后的存储量大概是60多MB。
-
总的来说处理流程难度不大,主要是理解认识OSGB数据的内容花费了太多时间,如果有人想交流一下想法或者想使用这个程序,加我QQ吧 3398669116。码字真的不容易,希望各位看官能够点个赞呗,谢谢啦。