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 个小 三角形,同时按加权平均更新所有顶点位置,使网格趋于光滑。
§步骤
- 边点计算:在每条边中点插入新顶点
- 内部边:$\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)$
- 顶点更新:更新原始顶点位置
- 内部顶点(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}}$
- 面分裂:每个原始三角形分裂为 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=320Modules§
- catmull_
clark - Catmull-Clark 细分模块
- sqrt3
- √3(Sqrt3)细分模块
Functions§
- loop_
subdivide - 对三角网格执行一次 Loop 细分,返回细分后的新网格。