記事ディレクトリ
メッシュの単純化 (QEM)
1 概要と原理
メッシュ簡略化は、複雑なメッシュ データの頂点、エッジ、面の数を減らすことによってモデルの表現を簡素化するもので、グラフィックスの分野ではこの技術は詳細レベル (LOD、マルチレベル詳細) とも呼ばれます。
1.1 メッシュ単純化の適用
- マルチ解像度レンダリング: 投影サイズが小さいモデル (遠くに表示される) の場合、その簡素化されたバージョンをレンダリングして、元の複雑なメッシュを豊富な詳細で置き換えることができ、レンダリング効率が向上します。
- プロキシ シミュレーション: 単純化されたモデルでシミュレーションを実行し、補間法によって元の複雑なグリッドの近似シミュレーション結果を取得して、シミュレーション効率を向上させます。[ 1 ] ^{[1]}[ 1 ]
1.2 共通の簡易操作
-
頂点デシメーション
削除する頂点を選択し、その頂点に隣接する面を削除して、結果として得られる穴を再三角形化します。
-
頂点クラスタリング
元のグリッドの境界ボックスをグリッドに分割し、各セルの頂点を 1 つにクラスター化し、クラスター化された頂点に基づいてグリッドの面を更新します。
-
エッジの収縮
( v 1 , v 2 ) → v ‾ (v_1,v_2)\rightarrow{\overline{v}}( v1、v2)→v、エッジを点まで縮小し、縮退した面 (上の画像の影付き) を削除します。
-
対収縮
エッジ収縮の一般化として、点ペア( v 1 , v 2 ) (v_1,v_2)の場合、( v1、v2)がエッジの場合、点のペア( v 1 , v 2 ) (v_1,v_2)( v1、v2)がエッジではない場合、点のペアを縮小すると、元々切断されていた部分が接続されます。
1.3 二次誤差の測定
縮小された頂点と元のメッシュの間の局所的な距離が遠すぎないように、二次距離メトリックに基づく方法を選択して、最適な縮小点を見つけます。
二次距離に基づいて最適な収縮点を見つける
ここでの式の導出については、記事内で非常に分かりやすく説明されているグリッド単純化QEM手法の詳細な説明を参照してください。
エッジの収縮を考慮してください。2 点の場合v 1 、 v 2 v_1、v_2v1、v2、点v ˉ \bar{v}に縮小します。v決定平面( vi ) \left(v_i\right)( v私は) vi v_iを表しますv私は対応する元の三角形表面の場合、最適化目標は
v ˉ = arg min v ∑ p ∈ plan ( v 1 ) ∪ plan ( v 2 ) distance ( v , p ) 2 \bar{v}=\ underset{ v}{\arg \min } \sum_{p \in \text { 平面 }\left(v_1\right) \cup \text { 平面 }\left(v_2\right)} \operatorname{距離}(v , p )^2vˉ=varg _分p ∈ 平面 ( v1) ∪ 平面 ( v2)∑距離( v 、p )2
以下は手順を簡略化したものです。飛行機に乗りpの式は ax + by + cz + d = 0 a x+b y+c z+d=0です× _+によって_+チェス+d=0 ,其中 a 2 + b 2 + c 2 = 1 a^2+b^2+c^2=1 ある2+b2+c2=1。v = [ x , y , z , 1 ] T , p = [ a , b , c , d ] T v=[x, y, z, 1]^T, p=[a, b, c 、d]^Tv=[ × 、よ、z 、1 ]て、p=[ 、_b 、c 、d ]T,得られる
距離 ( v , p ) 2 = ( v T p ) 2 = v T pp T v = v TK pv \演算子名{距離}(v, p)^2=\left(v^T p\右)^2=v^T pp^T v=v^T K_p v距離( v 、p )2=( vてっぷ)_2=vてっぷ__テレビ_=vTK _pvwhere K p = pp T K_p=pp^
TKp=pp_T,原式简化は
v ˉ = arg min v v T ( ∑ p ∈ plan ( v 1 ) ∪ plan ( v 2 ) K p ) v \bar{v}=\underset{v}{\arg \ min }\space v^T\left(\sum_{p \in \text { 平面 }\left(v_1\right) \cup plan\left(v_2\right)} K_p\right) vvˉ=varg _分 vT p ∈ 平面 ( v1) ∪平面( v __2)∑Kp v
此处取约等的
v ˉ ≈ arg min v v T ( ∑ p ∈ plan ( v 1 ) K p + ∑ p ∈ plan ( v 2 ) K p ) v \bar{v} \about \underset {v}{\arg \min }\space v^T\left(\sum_{p \in \operatorname{plane}\left(v_1\right)} K_p+\sum_{p \in \operatorname{plane}\left (v_2\right)} K_p\right) vvˉ≈varg _分 vT p ∈平面( v1)∑Kp+p ∈平面( v2)∑Kp v
令Q i = ∑ p ∈ plan ( vi ) K p Q_i=\sum_{p \in \text { plan }\left(v_i\right)} K_pQ私は=∑p ∈ 平面 ( v私は)Kp,有
v ˉ = arg min v v T ( Q 1 + Q 2 ) v \bar{v}=\underset{v}{\arg \min }\space v^T\left(Q_1+Q_2\right) )vvˉ=varg _分 vT( Q1+Q2)v
が初期化されると平面 ( v ) \operatorname{plane}(v)平面( v )は点v \mathrm{v}vの周りの三角形の面でこのとき、三角形面の繰り返し回数は最大 3 回(頂点 3 個)までなので、上記の等号近似はそれほど大きな誤差は生じず、計算も簡素化されます。
また、K p K_pKpは対称行列なので、QQQについても同様であるため、格納する必要がある要素は 10 個だけです。
このとき、v ˉ \bar{v}vˉの座標は二次関数を解く極点になります。[ 2 ] ^{[2]}[ 2 ]
令Q = Q 1 + Q 2 Q=Q_1+Q_2Q=Q1+Q2、次の方程式を解いてv ˉ \bar{v}を解きます。vˉの座標:
[ q 11 q 12 q 13 q 14 q 12 q 22 q 23 q 24 q 13 q 23 q 33 q 34 0 0 0 1 ] v ˉ = [ 0 0 0 1 ] \left[{\begin{配列}{cccc}q_{11}&q_{12}&q_{13}&q_{14}\\q_{12}&q_{22}&q_{23}&q_{24}\\q_{13}&q_{23}&q_ {33}&q_{34}\\0&0&0&1\end{配列}}\right]\bar{v}=\left[{\begin{array}{c}0\\0\\0\\1\end{配列}}\右]
q11q12q130q12q22q230q13q23q330q14q24q341
vˉ=
0001
上式において、q 11 q_{11}q11QQを意味しますQの最初の行の最初の要素の値v ˉ \bar{v}vˉ同次座標が使用されます。上式の左辺の行列が可逆行列の場合、
v ˉ = [ q 11 q 12 q 13 q 14 q 12 q 22 q 23 q 24 q 13 q 23 q 33 q 34 0 0 0 1 ] − 1 [ 0 0 0 1 ] \bar{v}=\left[{\begin{array}{cccc}q_{11}&q_{12}&q_{13}&q_{14}\\q_{12}&q_{22} &q_{23}&q_ {24}\\q_{13}&q_{23}&q_{33}&q_{34}\\0&0&0&1\end{配列}}\right]^{-1}\left[{\begin{配列 {c} 0\\0\\0\\1\end{配列}}\right]vˉ=
q11q12q130q12q22q230q13q23q330q14q24q341
− 1
0001
不可逆の場合、[4] ^{[4]}[ 4 ]
v = ( 1 − k ) v 1 + kv 2 、ここで k ∈ [ 0 , 1 ] v ˉ = arg min v v T ( Q 1 + Q 2 ) vv=(1-k)v_1+kv_2 ,\text{where}\space{k}\in[0,1]\\ \bar{v}=\underset{v}{\arg \min }\space v^T\left(Q_1+Q_2\right )vv=( 1−k ) v1+kv _2、ここでk ∈[ 0 ,1 ]vˉ=varg _分 vT( Q1+Q2)それでもv が
機能しない場合は、エンドポイントv 1、v 2 v_1、v_2v1、v2または中点v 1 + v 2 2 \frac{v_1+v_2}22v1+ v23 つの間の誤差 ( Δ ( v ) = v TQ v \Delta(v)=v^TQvD ( v )=vT Qv)v ˉ \bar{v}vˉ [ 3 ] ^{[3]}[ 3 ]。
2 アルゴリズム処理
2.1 段階的な分析
-
すべての初期頂点のQQを計算しますQ行列
飛行機に乗りましょうpの式は ax + by + cz + d = 0 a x+b y+c z+d=0です× _+によって_+チェス+d=0 ,其中 a 2 + b 2 + c 2 = 1 a^2+b^2+c^2=1 ある2+b2+c2=1。p= [ a , b , c , d ] T p=[a, b, c, d]^Tp=[ 、_b 、c 、d ]T._ _ これから、Q i Q_iQ私は(4x4,顶点 v i v_i v私は的 Q Q Q行列) は次のようになります:
Q i = ∑ p ∈ 平面 ( vi ) pp T Q_i=\sum_{p\in 平面(v_i)}pp^TQ私は=p ∈平面( v _ _私は)∑pp_T -
有効なペアを選択してください
頂点ペア( vi , vj ) (v_i,v_j)( v私は、vj)は有効な点のペアです。
- ( vi , vj ) (v_i,v_j)( v私は、vj)はエッジです。
- ‖ vi − vj ‖ < t ‖v_i − v_j ‖ < t「v」私は−vj‖<t、tttはしきい値パラメータです。
上記の条件のいずれかを満たしているだけです。
-
各有効な点のペア(vi, vj) (v_i,v_j)を計算します。( v私は、vj)最小収縮誤差costijcost_{ij}コスト_イジ、および最適な収縮点vopt v_{opt}vああ点の位置
まずvopt v_{opt}を計算しますvああ点対応するQ オプション Q_{opt}Qああ点:
Q opt = Q i + Q j = [ q 11 q 12 q 13 q 14 q 12 q 22 q 23 q 24 q 13 q 32 q 33 q 34 q 14 q 24 q 34 q 44 ] 。Q_{opt}=Q_i+Q_j=\begin{bmatrix}q_{11}&q_{12}&q_{13}&q_{14}\\q_{12}&q_{22}&q_{23}&q_{24}\\ q_{13}&q_{32}&q_{33}&q_{34}\\q_{14}&q_{24}&q_{34}&q_{44}\end{bmatrix}。Qああ点=Q私は+Qj= q11q12q13q14q12q22q32q24q13q23q33q34q14q24q34q44 .defineコスト ij コスト_{ij
}コスト_イジ以下のように:
costij = v TQ optvcost_{ij}=v^TQ_{opt}vコスト_イジ=vT Qああ点v
収縮誤差を最小限に抑え、vopt v_{opt}vああ点。具体的な計算方法については、前項「2次誤差測定」(#1.3 2次誤差測定)を参照してください。 -
対応するcostijcost_{ij}に従ってすべての有効なポイントのペアを押しますコスト_イジ最小コストのコストijcost_{ij}で順番にヒープに配置されます。コスト_イジ上のペア
一般に、ソートには小さなルート ヒープが使用されます。
-
最小コストijコスト_{ij}を削除しますコスト_イジ対応点ペア 収縮(vi, vj) → vopt(v_i,v_j)\rightarrow{v_{opt}}( v私は、vj)→vああ点、 vi v_iを含むすべての項目を更新します。v私はまたはvj v_jvj法的ポイントペアのコストコストコスト_
このステップは繰り返し実行され、設定された単純化率に達するか、ヒープが空になることが終了の兆候です[5] ^{[5]}[ 5 ]。
3 Pythonコードの実装
コードの実装に関しては、このプロジェクトを直接研究することをお勧めします: Mesh_simplification_python: python を使用したメッシュ単純化アルゴリズムの実装コードは完全にコメントされており、よく整理されているため、学習する価値があります。
3.1 試験結果
入力モデル メッシュ (9397 頂点、18794 面):
t = 0 、比率 = 0.5 t=0、\スペース比率 = 0.5t=0 、 ラティオ_ _ _ _=0.5(頂点4698、面9396):
t = 0 、比率 = 0.1 t=0、\space 比率 = 0.1t=0 、 ラティオ_ _ _ _=0.1(頂点939、面1878):
4 まとめ
-
コード関数の最適化
元の論文では、次の 2 つの詳細についても言及されています。
-
境界を維持する
単純化プロセス中に境界を維持する必要がある一部のモデル メッシュでは、ポイント ペアが縮小するときに、そのポイント ペアが境界エッジであるかどうかを判断します。境界エッジである場合は、より大きなペナルティ係数でポイント ペアのコストを重み付けして、縮小を防ぐことができます。 。
-
生地のめくれを防ぐ
メッシュの単純化に QEM アルゴリズムを直接使用すると、一部のパッチが反転する可能性があります。したがって、点ペアの収縮コストを計算するときは、点ペアの隣接する各パッチが反転されているかどうかを同時に判断する必要があります。収縮前と収縮後の法線ベクトル間の角度の大きさで判断できます。同時に、そのコストも罰します。
-
参考
[1] GAMES102:几何建模与处理
[2] https://zhuanlan.zhihu.com/p/411865616
[3] Michael Garland と Paul S. Heckbert。1997. 二次誤差メトリクスを使用した曲面の単純化。コンピュータ グラフィックスおよびインタラクティブ技術に関する第 24 回年次会議の議事録 (SIGGRAPH '97)。ACM Press/Addison-Wesley Publishing Co.、米国、209–216。https://doi.org/10.1145/258734.258849
[4] https://www.jianshu.com/p/2bf615c38165
[5] https://github.com/AntonotnaWang/Mesh_simplification_python