【图形学】Loop细分算法及半边结构实现(C++)

本文原理参考: GAMES101课程 ,基于Unity3D的Loop Subdivision 网格细分算法

本文复现参考:Loop subdivision,三角网格下的Half-Edge数据结构实现方法
本文代码链接:https://pan.baidu.com/s/1R_Wn4iqBadGKxjFT8NgpsA 提取码:9x9i

文章目录

  • Loop 细分
    • 算法介绍
      • 增加新顶点
      • 更新旧顶点
    • 算法实现
  • 半边结构
    • 半边结构的表示方法
    • 半边结构的构造方法
      • 创建所有顶点
      • 创建所有面及半边
    • 半边结构的使用

Loop 细分

顾名思义,网格细分是将粗糙网格精细化的过程,如下动图。Loop细分是众多网格细分算法的一种,Loop细分仅仅对三角形网格模型有效。值得注意的是,虽然叫Loop细分,但是不能理解为“循环”细分,叫这个名字是因为作者的名字是这个而已。

算法介绍

Loop细分算法主要分两步进行

  1. 增加新顶点:增加三角形三个边的中点,将一个三角形分成四个三角形
    【图形学】Loop细分算法及半边结构实现(C++)_第1张图片

  2. 移动新的三角形和老的三角形顶点让细分之后的结果更加光滑

在介绍具体的算法过程之前,先介绍一些概念:

边界边:处于三角形网格边界的边,只被网格中的一个三角形占用。

内部边:处于三角形网格内部的边,被网格中的两个三角形(最多只有两个)占用。

边界点:边界边的两个顶点为边界点。

内部点:除了边界点的所有点为内部点。

下面一图涵盖所有定义:绿色框和红色框分别表示边界点和内部点,绿色标记和红色标记分别表示边界边和内部边
【图形学】Loop细分算法及半边结构实现(C++)_第2张图片

增加新顶点

通过在每个边上取中点,从而增加顶点,根据边的属性(边界,非边界)有如下两个计算新增顶点位置的规则:

  1. 内部边上增加点
【图形学】Loop细分算法及半边结构实现(C++)_第3张图片

计算规则: 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+v

你可能感兴趣的:(图形学,算法,算法,图形学)