网格细分算法(Catmull-Clark subdivision & Loop subdivision)附源码

转载自:http://www.cnblogs.com/shushen/p/5251070.html

下图描述了细分的基本思想,每次细分都是在每条边上插入一个新的顶点,可以看到随着细分次数的增加,折线逐渐变成一条光滑的曲线。曲面细分需要有几何规则和拓扑规则,几何规则用于计算新顶点的位置,拓扑规则用于确定新顶点的连接关系。下面介绍两种网格细分方法:Catmull-Clark细分和Loop细分。

 

Catmull-Clark subdivision

细分格式

  Catmull-Clark细分是一种四边形网格的细分法则,每个面计算生成一个新的顶点,每条边计算生成一个新的顶点,同时每个原始顶点更新位置。下图为Catmull-Clark细分格式的细分掩膜,对于新增加的顶点位置以及原始顶点位置更新规则如下:

1.网格内部F-顶点位置:

  设四边形的四个顶点为v0、v1、v2、v3,则新增加的顶点位置为v = 1/4*(v0 + v1 + v2 + v3)。

2.网格内部V-顶点位置:

  设内部顶点v0的相邻点为v1、v2,…,v2n,则该顶点更新后位置为,其中α、β、γ分别为α = 1 - β - γ。

3.网格边界V-顶点位置:

  设边界顶点v0的两个相邻点为v1、v2,则该顶点更新后位置为v = 3/4*v0 + 1/8*(v1 + v2)。

4.网格内部E-顶点位置:

  设内部边的两个端点为v0、v1,与该边相邻的两个四边形顶点分别为v0、v1、v2、v3和v0、v1、v4、v5,则新增加的顶点位置为v = 1/4*(v0 + v1 + vf1 + vf2) = 3/8*(v0 + v1) + 1/16*(v2 + v3 + v4 + v5)。

5.网格边界E-顶点位置:

  设边界边的两个端点为v0、v1,则新增加的顶点位置为v = 1/2*(v0 + v1)。

效果

源码

 MATLAB实现Catmull-Clark细分(CC细分)


Loop subdivision

细分格式

  Loop细分是一种三角形网格的细分法则,它按照1-4三角形分裂,每条边计算生成一个新的顶点,同时每个原始顶点更新位置。下图为Loop细分格式的细分掩膜,对于新增加的顶点位置以及原始顶点位置更新规则如下:

1.网格内部V-顶点位置:

  设内部顶点v0的相邻点为v1、v2,…,vn,则该顶点更新后位置为,其中

2.网格边界V-顶点位置:

  设边界顶点v0的两个相邻点为v1、v2,则该顶点更新后位置为v = 3/4*v0 + 1/8*(v1 + v2)。

3.网格内部E-顶点位置:

  设内部边的两个端点为v0、v1,相对的两个顶点为v2、v3,则新增加的顶点位置为v = 3/8*(v0 + v1) + 1/8*(v2 + v3)。

4.网格边界E-顶点位置:

  设边界边的两个端点为v0、v1,则新增加的顶点位置为v = 1/2*(v0 + v1)。

效果

源码

matlab实现loop细分

相关推荐
©️2020 CSDN 皮肤主题: 像素格子 设计师:CSDN官方博客 返回首页