[English 🇺🇸] / Japanese 🇯🇵
"Surface Simplification using Quadric Error Metrics, 1997" [Paper] を実装。
python==3.12.0
scipy==1.11.3
numpy==1.26.0
scikit-learn==1.3.0
tqdm
# Clone
git clone https://github.com/astaka-pe/mesh_simplification.git
cd mesh_simplification
# Docker
docker image build -t astaka-pe/mesh-simp .
docker run -itd --gpus all --name mesh-simp -v .:/work astaka-pe/mesh-simp
docker exec -it mesh-simp /bin/bash
python simplification.py [-h] -i data/ankylosaurus.obj [-v V] [-p P] [-optim] [-isotropic]
簡略化後のメッシュは data/output/
に出力される.
-i
: 入力ファイル名 [必須]-v
: ターゲット超点数 [オプション]-p
: 簡略化比率 [オプション (-vを指定した場合には無効) | デフォルト: 0.5]-optim
: 価数最適化 [オプション | 推奨]-isotropic
: 等方的簡略化 [オプション]
入力 | 簡略化 (50%) | 簡略化 (20%) | 簡略化 (1%) |
14762 vertices | 7381 vertices | 2952 vertices | 147 vertices |
29520 faces | 14758 faces | 5900 faces | 290 faces |
三角形品質を向上させるため、頂点毎のvalence(価数)を考慮したエッジ縮約を実装した。
価数最適化なし (0.5%) | 価数最適化あり (0.5%) |
|
|
現在の実装では、境界がないメッシュを想定し、valence=6
を最適とする重みづけを行う。すなわち、valenceが6から離れるほど大きなペナルティが加わる。また、valence=3
の頂点を生じるエッジ縮約には、過度に大きなペナルティを設定している。
エッジ長の不均一性を防ぐペナルティ項を追加。
Default (10%) | Isotropic (10%) |
|
|
頂点
- 初期頂点で対称行列
$Q$ を計算する(後述) - 縮約できる頂点ペアをリストアップする
- 2.の各頂点ペアに対し、縮約した場合のコストを計算する
- 頂点
$\mathbf{v}_1$ を$\mathbf{v}_2$ にマージする場合、生成される頂点を$\mathbf{\bar{v}}=\frac{1}{2}(\mathbf{v}_1+\mathbf{v}_2)$ として、$\mathbf{\bar{v}}^T (Q_1+Q_2) \mathbf{\bar{v}}$ を頂点ペア$(\mathbf{v}_1, \mathbf{v}_2)$ のコストとする。
- 頂点
- 3.で計算した各頂点ペアのコストを格納するヒープを作成
- ヒープから最小コストとなる頂点ペア
$(\mathbf{v}_1, \mathbf{v}_2)$ を取り出し、そのエッジを縮約する- この際、頂点
$\mathbf{v}_1$ が関与する全ての頂点ペアに対するコストを更新する
- この際、頂点
頂点周りの平面(三角形)を表す方程式を、
と表せる。
と表現でき、これらの二乗誤差の総和は、
となる。ここで、
と定義することで、頂点のコストを二次形式
で表せる。
- 非多様体を生じるエッジ縮約や、境界エッジの縮約は行わない。
- エッジ角度を考慮していないため、自己交差や面のフリップが生じうる。