グリッド単純化 (QEM) の検討ノート

メッシュの単純化 (QEM)

1 概要と原理

メッシュ簡略化は、複雑なメッシュ データの頂点、エッジ、面の数を減らすことによってモデルの表現を簡素化するもので、グラフィックスの分野ではこの技術は詳細レベル (LOD、マルチレベル詳細) とも呼ばれます。

1.1 メッシュ単純化の適用

  • マルチ解像度レンダリング: 投影サイズが小さいモデル (遠くに表示される) の場合、その簡素化されたバージョンをレンダリングして、元の複雑なメッシュを豊富な詳細で置き換えることができ、レンダリング効率が向上します。
  • プロキシ シミュレーション: 単純化されたモデルでシミュレーションを実行し、補間法によって元の複雑なグリッドの近似シミュレーション結果を取得して、シミュレーション効率を向上させます。[ 1 ] ^{[1]}[ 1 ]

1.2 共通の簡易操作

  • 頂点デシメーション

    削除する頂点を選択し、その頂点に隣接する面を削除して、結果として得られる穴を再三角形化します。

  • 頂点クラスタリング

    画像-20230730150803895

    元のグリッドの境界ボックスをグリッドに分割し、各セルの頂点を 1 つにクラスター化し、クラスター化された頂点に基づいてグリッドの面を更新します。

  • エッジの収縮

    画像-20230730151429110

    ( v 1 , v 2 ) → v ‾ (v_1,v_2)\rightarrow{\overline{v}}( v1v2v、エッジを点まで縮小し、縮退した面 (上の画像の影付き) を削除します。

  • 対収縮

    画像-20230730162827401エッジ収縮の一般化として、点ペア( v 1 , v 2 ) (v_1,v_2)の場合、( v1v2)がエッジの場合、点のペア( v 1 , v 2 ) (v_1,v_2)( v1v2)がエッジではない場合、点のペアを縮小すると、元々切断されていた部分が接続されます。

1.3 二次誤差の測定

縮小された頂点と元のメッシュの間の局所的な距離が遠すぎないように、二次距離メトリックに基づく方法を選択して、最適な縮小点を見つけます。

二次距離に基づいて最適な収縮点を見つける

画像-20230730174452604

ここでの式の導出については、記事内で非常に分かりやすく説明されているグリッド単純化QEM手法の詳細な説明を参照してください。

エッジの収縮を考慮してください。2 点の場合v 1 、 v 2 v_1、v_2v1v2、点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=1v = [ 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 __2Kp 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 平面( v1Kp+p 平面( v2Kp 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+Q2v
が初期化されると平面 ⁡ ( 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=( 1k ) v1+kv _2ここでk [ 0 ,1 ]vˉ=varg _ vT( Q1+Q2それでもv が
機能しない場合は、エンドポイントv 1、v 2 v_1、v_2v1v2または中点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 アルゴリズム処理

画像

図の出典: QEM グリッドの簡素化 - Jianshu (jianshu.com)

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 ‖ < tv」私はvj<ttttはしきい値パラメータです。

    上記の条件のいずれかを満たしているだけです。

  • 各有効な点のペア(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私はvjvああ、 vi v_iを含むすべての項目を更新します。v私はまたはvj v_jvj法的ポイントペアのコストコストコスト_

    このステップは繰り返し実行され、設定された単純化率に達するか、ヒープが空になることが終了の兆候です[5] ^{[5]}[ 5 ]

3 Pythonコードの実装

コードの実装に関しては、このプロジェクトを直接研究することをお勧めします: Mesh_simplification_python: python を使用したメッシュ単純化アルゴリズムの実装コードは完全にコメントされており、よく整理されているため、学習する価値があります。

3.1 試験結果

入力モデル メッシュ (9397 頂点、18794 面):

画像-20230802000140688

t = 0 、比率 = 0.5 t=0、\スペース比率 = 0.5t=0  ラティオ_ _ _ _=0.5(頂点4698、面9396):

画像-20230802000230337

t = 0 、比率 = 0.1 t=0、\space 比率 = 0.1t=0  ラティオ_ _ _ _=0.1(頂点939、面1878):

画像-20230802000546218

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

おすすめ

転載: blog.csdn.net/qq_39784672/article/details/132053304