Skip to main content

Module subdiv

Module subdiv 

Source
Expand description

Stability: unstable — subdivision API may change before 1.0. 细分模块

提供三种网格细分算法:

  • loop_subdivide:Loop 细分(三角网格,每个面分裂为 4 个三角形)
  • [catmull_clark::catmull_clark_subdivide]:Catmull-Clark 细分(任意多边形网格, 每个面分裂为 k 个四边形并三角化输出)
  • [sqrt3::sqrt3_subdivide]:√3 细分(三角网格,每个面分裂为 3 个三角形, 适合渐进式细分)

§Loop 细分

Loop 细分是一种\textbf{逼近型}细分方案,每次细分将每个三角面分裂为 4 个小 三角形,同时按加权平均更新所有顶点位置,使网格趋于光滑。

§步骤

  1. 边点计算:在每条边中点插入新顶点
    • 内部边:$\frac{3}{8}(v_0+v_1) + \frac{1}{8}(v_2+v_3)$,其中 $v_2, v_3$ 是两侧相对顶点
    • 边界边:$\frac{1}{2}(v_0+v_1)$
  2. 顶点更新:更新原始顶点位置
    • 内部顶点(valence=$n$):$(1-n\beta)v + \beta\sum \text{neighbors}$, $\beta = \frac{1}{n}\left(\frac{5}{8} - \left(\frac{3}{8}+\frac{1}{4}\cos\frac{2\pi}{n}\right)^2\right)$
    • 边界顶点:$\frac{1}{8}v_{\text{prev}} + \frac{3}{4}v + \frac{1}{8}v_{\text{next}}$
  3. 面分裂:每个原始三角形分裂为 4 个小三角形。

§规模变化

设原始网格有 $V$ 顶点、$E$ 边、$F$ 面,细分后: $$V’ = V + E, \quad F’ = 4F, \quad E’ = 2E$$

§√3 细分

√3 细分是\textbf{插值型}细分方案,面数增长 3 倍(而非 Loop 的 4 倍), 在渐进式细分中提供更细粒度的控制。 $$V’ = V + F, \quad F’ = 3F$$

§示例

use halfedge::{build_icosphere, loop_subdivide};

let mesh = build_icosphere(1);      // V=42, F=80
let refined = loop_subdivide(&mesh); // V=162, F=320

Modules§

catmull_clark
Catmull-Clark 细分模块
sqrt3
√3(Sqrt3)细分模块

Functions§

loop_subdivide
对三角网格执行一次 Loop 细分,返回细分后的新网格。