自动减面

在做游戏时,通常会有高模转低模的需求,比如生成不同层级的lod模型。但是这种操作一般会由美术人员手工完成,比较费时,且每个层级的模型都需要打包,造成包体过大。


这里,我提供了一种运行时根据算法将高模转为指定顶点数低模的方式,不需要人工干预,且可在运行时才生成低模,打包时只要打包高模即可。


下面是我的实现,这里我假设顶点在顶点数组里是唯一的,并未考虑各种情况,所以出现了缺面的情况。




下面是论文作者的实现。



下面简单介绍一下算法

对顶点和面进行预处理,生成如下结构。







生成之后,根据这些信息计算每个顶点向他的每个邻居顶点坍缩的代价,a向b坍缩即消去a,将a的每个邻居边里的a替换为b。


下式为u向v坍缩的cost。



Tu是包含顶点u的三角形的集合,Tuv是同时包含顶点u和顶点v的三角形的集合。


两个面的法线相乘越接近1,则说明两个面是接近平行的,消去影响不大,这里用1-x/2将范围从 -1,1映射到0,1,值越小消去的影响越小。


在最里层,找到影响的最小值,对于包含顶点u和顶点v的三角形,消去意味着这些面消失了,影响值为。


在外层,找到影响的最大值,即找到包含u但不会消失的面对视觉的最大影响。


最后乘以距离,距离越大,越不易消去。


消去代价最小的节点,此时注意要即时更新第一步生成的结构

不断消去,直到顶点数小于某值。


工程源码:https://github.com/Ymiku/Automic-LOD


现在的工程只提供了核心代码,虽然可以用,但是效果不好,因为一般模型会出现一个顶点在数组里出现多次的情况,不过也好解决,只要预处理一下,保证顶点唯一性就行了。


参考:http://dev.gameres.com/Program/Visual/3D/PolygonReduction.htm

posted @ 2017-07-03 17:17  00000000O  阅读(238)  评论(0编辑  收藏  举报