模型单体化的顶点精简和空洞修复

背景

之前在进行切割单体化过程中,存在很多模型可以优化的问题,比如:

  • 切割的模型边缘不规整

  • 边缘同一条三角形边重复切割导致产生重复顶点

  • 切割后的模型未建模的地方存在空洞等

    针对以上问题,进行试验,提出改进的思路

边缘不规整

最初进行模型分割时,采取的思路是:

  • 遍历所有格网,找到格网对应的顶点

  • 进行包含判断,当一个格网所有顶点都包含在要分割的多边形内,则保留这个格网

  • 重新追加这个格网的所有顶点,并更新保留格网的索引

这样导致的问题就是,处于分割边缘的三角格网,可能不会包含进来;比如,当一个格网部分在多边形内,部分在多边形外时,此时格网将被舍弃,因此最终构建的模型边缘是不规整的。

针对上述问题,考虑对边缘的格网进行切割处理,使在模型内的部分保留,不在模型内的部分舍弃,由此可以推断,这种方式格网至少会和多边形边缘产生2个交点,由于2个以上交点的情况太过复杂,这里只针对普遍的两个交点的情况进行分析。

当三角格网和多边形有两个交点时,存在两种常见的情况,A和B;

  • 情况A,格网的一个顶点在内部,两个顶点在外部

    • 只需要求出两个分割点,重新构建面索引即可
  • 情况B,格网的两个顶点在内部,一个顶点在外部

    • 此时会产生两个分割点,两个内部点,因此需要对这四个点进行剖分,找出对角线的两个点,重新构建两个三角面

最终,计算的分割点投影会完整的落在多边形的边上,也就是说,根据分割点和原来的内部点构建的新的面,可以保证边缘格网的平滑(分割点在三维平面和xy平面的分布)

最终分割后的模型如下:

顶点的精简

顶点的精简分为原有模型冗余顶点的剔除和分割产生的冗余顶点

  • 原有模型冗余顶点的剔除:

  • 由于模型格网的筛选是根据面索引进行的,因此不被面索引引用的顶点会被剔除掉。

原有模型顶点数 实际被引用顶点数
8143695 1357531
  • 分割冗余点剔除

  • 在对一个格网进行分割时,产生两个分割点,由于这两条分割边可能也是另一个格网的分割边,因此同一分割边上的分割点,可能会被计算多次,并多次被追加到顶点集合中,并被赋予不同的面索引

  • 解决思路是,针对每一个分割点,建立一个索引对照表,以分割点为键值,对应其在顶点集合中的索引,因此再下次遇到同一分割点时,直接给对应的面赋予索引即可。

简化前模型大小 简化后模型大小
1024KB 283KB

空洞的修复

当模型被切割,之前连续的面会被分割开来,模型周边没有被建模的部分就会暴漏,以此产生了之前存在的面继续存在,四周不存在的面产生空洞。

如上图,模型是一个大楼,但分割后只有顶部和部分墙面,其余的面是不存在的,因此在分割后需要重新对不存在的面进行构建。

由于分割点分布在模型的边缘,因此想要构建模型的四周墙面,需要利用分割点和建筑底部点,由于底部点不清晰,因此可以借助多边形的点,由于多边形在xy平面内,将该多边形沿Z轴平移到模型最底部,即可成为模型底部的范围点。

总体思路如下:

  • 求取切割模型的最低点,构建底部范围点,将底部范围点追加进顶点集合,并更新其对应的索引

  • 对分割点进行划分,判断落在底部哪条多边形直线上

  • 对落在同一直线上的多边形进行排序

  • 根据该直线的两个端点和对应的分割点,进行三角网构建

相关推荐
IT_陈寒35 分钟前
Python多进程共享变量那个坑,我差点没爬出来
前端·人工智能·后端
码事漫谈44 分钟前
2026软考高级·系统架构设计师备考指南
后端
AI茶水间管理员2 小时前
如何让LLM稳定输出 JSON 格式结果?
前端·人工智能·后端
其实是白羊2 小时前
我用 Vibe Coding 搓了一个 IDEA 插件,复制URI 再也不用手动拼了
后端·intellij idea
用户8356290780512 小时前
Python 操作 Word 文档节与页面设置
后端·python
酒後少女的夢3 小时前
设计模式教程
后端·架构
凌览3 小时前
别再手搓 Skill 了,用这个工具 5 分钟搞定
前端·后端
weixin_408099673 小时前
python请求文字识别ocr api
开发语言·人工智能·后端·python·ocr·api·ocr文字识别
weixin_408099673 小时前
【组合实战】OCR + 图片去水印 API:自动清洗图片再识别文字(完整方案 + 代码示例)
图像处理·后端·ocr·api·文字识别·去水印·ocr识别优化