本文原理参考: GAMES101课程 ,基于Unity3D的Loop Subdivision 网格细分算法
本文复现参考:Loop subdivision,三角网格下的Half-Edge数据结构实现方法
本文代码链接:https://pan.baidu.com/s/1R_Wn4iqBadGKxjFT8NgpsA 提取码:9x9i
Loop 细分
顾名思义,网格细分是将粗糙网格精细化的过程,如下动图。Loop细分是众多网格细分算法的一种,Loop细分仅仅对三角形网格模型有效。值得注意的是,虽然叫Loop细分,但是不能理解为“循环”细分,叫这个名字是因为作者的名字是这个而已。
算法介绍
Loop细分算法主要分两步进行
-
增加新顶点:增加三角形三个边的中点,将一个三角形分成四个三角形
-
移动新的三角形和老的三角形顶点让细分之后的结果更加光滑
在介绍具体的算法过程之前,先介绍一些概念:
边界边:处于三角形网格边界的边,只被网格中的一个三角形占用。
内部边:处于三角形网格内部的边,被网格中的两个三角形(最多只有两个)占用。
边界点:边界边的两个顶点为边界点。
内部点:除了边界点的所有点为内部点。
下面一图涵盖所有定义:绿色框和红色框分别表示边界点和内部点,绿色标记和红色标记分别表示边界边和内部边
增加新顶点
通过在每个边上取中点,从而增加顶点,根据边的属性(边界,非边界)有如下两个计算新增顶点位置的规则:
- 内部边上增加点
计算规则: v = 3 / 8 ∗ ( v 0 + v 1 ) + 1 / 8 ∗ ( v 2 + v 3 ) v=3 / 8^{*}\left(v_{0}+v_{1}\right)+1 / 8^{*}\left(v_{2}+v_{3}\right) v=3/8∗(v0+v1)+1/8∗(v2+v3)
- 边界边上增加点
计算规则: