引用文章:
https://blog.csdn.net/Hachi_Lin/article/details/90349216 MatLab实现Loop Subdivision [1]
https://blog.csdn.net/outtt/article/details/78544053 半边数据结构 [2]
程序源代码链接:https://pan.baidu.com/s/1U_l4bcK2EIGgKSvQ6WHI0A 提取码:ab1s
编译环境:Unity3D 2017.4.35f1
Tip1: 这次的源代码是个Unity项目,需要用Unity进行导入。
Tip2: 其实整个工程也就写了这两个c#脚本而已,注意提取路径
一,简介
网格细分是通过按一定规则给网格增加顶点和面片的数量,让网格模型变得更加光滑。Loop细分方法是最早一种基于三角网格的细分方法。一次细分的过程分为两步骤,第一步是增加顶点;第二步是对顶点位置进行调整,使得网格更加光滑[1]。也就是每迭代一次,原来的一个三角形,会变成四个三角形。
封闭图形 -- 立方体
封闭图形 -- 圆柱
开放图形 -- 网格
使用方法,运行后,每点击一次迭代一次。
二,算法
每迭代一次
- 在每条边上增加新的顶点。
- 更新旧顶点的位置,新位置与其邻接的所有顶点(不包括新增加的顶点!)有关。
将 “顶点“ 与 “边“分为两类,内部与边界。其分类标准为:
一个边最多被两个三角形公用,如果被一个三角形用,那其就是边界,如果被两个三角形共用,就是内部边[1]。 组成边界边的两个顶点为边界点,内部边的两个顶点为内部点
如下图所示,
内部点:蓝色圆圈
边界点:红色圆圈
内部边:蓝线
边界边:红线
2.1 增加顶点
(1)内部边
新顶点位置:
(2)边界边
新顶点位置:
2.2 更新旧顶点位置
(1)内部点
新顶点位置:
v0是旧顶点的 旧位置
(2)边界点
新顶点位置:
这个不是很好理解,比如红色圆圈这个边界点,其v1,和v2是同时为边界点的两个邻接点(黄色标注),而不是绿色标注的点。
三,实现
使用修改的半边结构进行计算,因为传统半边的next指针实现外环这个功能,用c#很难写。具体过程看代码注释,写的很详细。
红框处为半边结构修改新增项。