三角网格细分算法 —— Loop 算法

三角网格细分算法 —— Loop细分

 

主要参考文章:

 https://zhuanlan.zhihu.com/p/144400261

https://blog.csdn.net/McQueen_LT/article/details/106136324

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次:

第一次:

第二次:

第三次:

第四次:

 

点的数目的数量级呈指数提高:

 

 

 

  • 4
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值