三角网格细分算法 —— Loop细分
主要参考文章:
Loop细分: 是一种专门针对三角形面的细分方法——主要思想就是1个旧三角面片分成4个新三角面片
(主要和 CC相类似,利用 新增边点 和 更新原始点 来新增模型的三角形网格数量 -> 细分)
Loop 细分曲面过程就是 插入边点 和 更新原始点 的过程,设每次细分之后的点集为P',新插入的点集为Eps,原始点集更新位置后的点集为P,
则:P' = P ∪ Eps
细分过程:
1. 计算边点 ep
"""
计算得到边点分为 边界点 和 非边界点
1. 边界点:
上下两个三角形的顶点分别是为 V1,V3,该点的的所在边的端点为V2,V4
得到的边点即为:
ep = 1/8(V1+V3) + 3/8(V2+V4)****
该公式和之前所用到的CC细分的公式的联系
-> 将两个三角形看作是一个四边形,则该四边形的面点为:fp = 1/4Σ(v1-4)
而该点的边的中点ec = 1/2(V2+vV4)
该点在CC细分下的边点为 : ep = 1/2*(fp+ec) 刚好就是和上述的公式系数相同而对于非边界的点来说,可以将面点设置为(0,0,0),则边点也就变成了该点的边的中点
****2. 非边界点(即 该边只与一个面相连,所以此时只计算该边的两个端点即可)
ep = 1/2(V2+V4)"""
2. 更新原始点
"""
更新原始点公式:
P' = (1-nβ)*P + β*Σ(Vi) (Vi 为原始点P的周围点,n表示原始点的周围点 的个数的和)
β = ...n 可以通过之前的points_face 得到: n = points_face[i] (一个点 和 它相邻的面 的个数相同)
"""
算法结果:
首先输入一个四面体:
四次细分迭代后的输出结果为 :
然后测试了一下一些复杂的模型(比如 三角形网格的恐龙模型)——
迭代4次:
第一次:
第二次:
第三次:
第四次:
点的数目的数量级呈指数提高: