基于Unity3D的Loop Subdivision 网格细分算法

引用文章:

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#脚本而已,注意提取路径

基于Unity3D的Loop Subdivision 网格细分算法_第1张图片

 

一,简介

   网格细分是通过按一定规则给网格增加顶点和面片的数量,让网格模型变得更加光滑。Loop细分方法是最早一种基于三角网格的细分方法。一次细分的过程分为两步骤,第一步是增加顶点;第二步是对顶点位置进行调整,使得网格更加光滑[1]。也就是每迭代一次,原来的一个三角形,会变成四个三角形

 

    封闭图形 -- 立方体

 

基于Unity3D的Loop Subdivision 网格细分算法_第2张图片

   封闭图形 -- 圆柱

基于Unity3D的Loop Subdivision 网格细分算法_第3张图片

   开放图形 -- 网格

基于Unity3D的Loop Subdivision 网格细分算法_第4张图片

使用方法,运行后,每点击一次迭代一次。

基于Unity3D的Loop Subdivision 网格细分算法_第5张图片

二,算法

  每迭代一次

  1.   在每条边上增加新的顶点。
  2.   更新旧顶点的位置,新位置与其邻接的所有顶点(不包括新增加的顶点!)有关。

将 “顶点“ 与 “边“分为两类,内部与边界。其分类标准为:

    一个边最多被两个三角形公用,如果被一个三角形用,那其就是边界,如果被两个三角形共用,就是内部边[1]。 组成边界边的两个顶点为边界点,内部边的两个顶点为内部点 

如下图所示,

  内部点:蓝色圆圈

  边界点:红色圆圈

  内部边:蓝线

  边界边:红线

基于Unity3D的Loop Subdivision 网格细分算法_第6张图片

2.1 增加顶点

   (1)内部边

                新顶点位置:

基于Unity3D的Loop Subdivision 网格细分算法_第7张图片

   

   (2)边界边

                新顶点位置:

2.2 更新旧顶点位置

   (1)内部点

                新顶点位置:

                                           v0是旧顶点的 旧位置 

基于Unity3D的Loop Subdivision 网格细分算法_第8张图片

   

   (2)边界点

                新顶点位置:

                 这个不是很好理解,比如红色圆圈这个边界点,其v1,和v2是同时为边界点的两个邻接点(黄色标注),而不是绿色标注的点。

基于Unity3D的Loop Subdivision 网格细分算法_第9张图片

,实现

  使用修改的半边结构进行计算,因为传统半边的next指针实现外环这个功能,用c#很难写。具体过程看代码注释,写的很详细。

  红框处为半边结构修改新增项。

基于Unity3D的Loop Subdivision 网格细分算法_第10张图片

 

你可能感兴趣的:(Unity小程序,Graphics)