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

背景

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

  • 切割的模型边缘不规整

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

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

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

边缘不规整

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

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

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

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

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

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

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

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

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

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

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

最终分割后的模型如下:

顶点的精简

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

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

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

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

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

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

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

空洞的修复

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

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

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

总体思路如下:

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

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

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

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

相关推荐
m0_748234086 分钟前
Spring Boot教程之三十一:入门 Web
前端·spring boot·后端
想成为高手4998 分钟前
国产之光--仓颉编程语言的实战案例分析
后端
编码浪子1 小时前
构建一个rust生产应用读书笔记7-确认邮件2
开发语言·后端·rust
昙鱼1 小时前
springboot创建web项目
java·前端·spring boot·后端·spring·maven
白宇横流学长1 小时前
基于SpringBoot的停车场管理系统设计与实现【源码+文档+部署讲解】
java·spring boot·后端
kirito学长-Java1 小时前
springboot/ssm太原学院商铺管理系统Java代码编写web在线购物商城
java·spring boot·后端
程序猿-瑞瑞2 小时前
24 go语言(golang) - gorm框架安装及使用案例详解
开发语言·后端·golang·gorm
组合缺一2 小时前
Solon v3.0.5 发布!(Spring 可以退休了吗?)
java·后端·spring·solon
猿来入此小猿2 小时前
基于SpringBoot在线音乐系统平台功能实现十二
java·spring boot·后端·毕业设计·音乐系统·音乐平台·毕业源码
愤怒的代码2 小时前
Spring Boot对访问密钥加解密——HMAC-SHA256
java·spring boot·后端