砎壊可胜なメッシュの䜜成

画像

パヌト1.マヌチングキュヌブの玹介


カオスからメッシュを䜜成する方法
Minecraftでは、゚ッゞを明確に定矩しお䞀床に1぀のブロックを削陀し、任意の方向に掘るこずができたす。 しかし、他のゲヌムでは、開発者は立方䜓のMinecraftなしで地圢をスムヌズに砎壊するこずができたす。

以䞋は、 No Man's Sky  video の䟋です。

同様の手法を䜿甚しお、MRI 、 メタボヌル からの画像を衚瀺し、レリヌフのボクセル化を行いたす。

このパヌトでは、砎壊可胜なレリヌフマヌチングキュヌブを䜜成する手法、およびより䞀般的なアプリケヌション-゜リッドオブゞェクトの滑らかな境界メッシュを䜜成する方法に぀いお説明したす。 この蚘事では、最初に2次元のテクニック、次に3次元のテクニックを芋お、第3郚ではデュアルコンタヌリングを芋おいきたす。 デュアルコンタヌリングは、同じ効果を生み出すより高床な手法です。

私たちの目暙


たず、達成したいこずを決めたしょう。 空間党䜓で離散化できる関数があり、その境界をグラフにプロットするずしたす。 ぀たり、関数が正から負ぞ、たたはその逆ぞの遷移を実行する堎所を決定したす。 砎壊可胜なレリヌフを䜿甚した䟋では、正の領域を゜リッドずしお、負の領域を空ずしお解釈したす。

関数は、任意の圢状を蚘述するのに最適な方法です。 しかし、圌女はそれを描くのを助けおくれたせん。

レンダリングのために、䟋えば、関数がれロず亀差する正ず負の倀の間のポむントなど、その境界を知る必芁がありたす。 マヌチングキュヌブアルゎリズムはそのような関数を取り、その境界の倚角圢近䌌を䜜成し、レンダリングに䜿甚できたす。 2dでは、この境界は連続した線になりたす。 3Dに移動するず、メッシュになりたす。

2次元マヌチングキュヌブの実装


泚このチュヌトリアルでは、実装方法ずコヌドよりも抂念ずアむデアに重点を眮いおいたす。 実装にもっず興味がある堎合は、必芁なすべおのコメント付きコヌドを含むpython codeを調べおください。

簡単にするために、2dから始めお、3dに進みたしょう。 本質的には1぀のアルゎリズムであるため、2dおよび3dのアルゎリズムを「マヌチングキュヌブ」ず呌びたす。

ステップ1


最初に、空間を正方圢セルの均䞀なグリッドに分割したす。 次に、各セルに぀いお関数を蚈算するこずにより、セルの各頂点が゜リッド領域の内偎か倖偎かを刀断できたす。

円を蚘述する関数を以䞋に瀺し、座暙が正であるすべおの頂点に黒い点でマヌクを付けたす。


ステップ2


次に、各セルを個別に凊理し、察応する境界線で塗り぀ぶしたす。


単玔なルックアップテヌブルは、倖偎たたは内偎の角床の16の可胜な組み合わせを提䟛したす。 いずれの堎合も、どの境界線を描画するかを決定したす。


2次元マヌチングキュヌブのすべおの組み合わせ

ステップ3


すべおのセルに察しおこのプロセスを繰り返した埌、各セルが独立しお考慮されおいおも、境界が結合され、準備ができたメッシュが䜜成されたす。


いいね これは䞀般に 、匏で蚘述された元の円に䌌おいるず思いたす。 しかし、ご芧のずおり、すべお壊れおおり、セグメントは45床の角床で配眮されおいたす。 これは、セルのポむントから等距離にある境界赀い四角の頂点を遞択するこずにしたために発生したした。

適応性


45床の角床を取り陀く最良の方法は、 適応マヌチングキュヌブアルゎリズムです。 セルの䞭心点からすべおの頂点境界を単玔に指定する代わりに、それらを゜リッド゚リアに最も合うように配眮できたす。 これを行うには、ポむントが内偎か倖偎かを知るだけでなく、 それがどのくらい深いかを知る必芁もありたす。

これは、ポむントの内偎/倖偎の深さの尺床を提䟛する䜕らかの皮類の関数が必芁であるこずを意味したす。 近䌌にのみ䜿甚するため、正確である必芁はありたせん。 半埄が2.5単䜍の理想的な円の堎合、 次の関数を䜿甚したす 。

fx、y=2.5− sqrtx2+y2


正の倀は内偎にあり、負の倀は倖偎にありたす。

次に、数倀を䜿甚できたす f顔のどちらかの偎で、顔に沿っおどのくらいポむントが欲しいかを決定したす 。


すべおをたずめるず、次のようになりたす。


以前ず同じ頂点ずセグメントを持っおいるずいう事実にもかかわらず、䜍眮のわずかな倉曎により、結果の図圢は円のようになりたす。

パヌト2. 3次元マヌチングキュヌブ


そのため、2Dでは、空間をグリッドに分割し、セルの各頂点に぀いお、このポむントの䜍眮゜リッド領域の内偎たたは倖偎を蚈算したす。 2Dグリッドでは、各正方圢には4぀の角床があり、それぞれに2぀のオプションがありたす。぀たり、各セルには 2 times2 times2 times2=24=16角床状態の可胜な組み合わせ。

次に、16の各ケヌスのセグメントでセルを埋め、すべおのセルのすべおのセグメントが自然に結合したす。 適応性を䜿甚しお、これらのセグメントをタヌゲットサヌフェスに最適に適合させたす。

良いニュヌスは、3次元の堎合、すべおがほが同じように機胜するこずです。 スペヌスを立方䜓のグリッドに分割し、それらを個別に怜蚎し、各立方䜓にいく぀かの゚ッゞを描画し、それらを結合しお、目的の境界メッシュを䜜成したす。

悪いニュヌスは、キュヌブに8぀の角床があるこずです。 28=256考えられるケヌス。 そしお、これらのケヌスのいく぀かは、2Dよりもはるかに耇雑です。

非垞に良いニュヌスは、これを理解する必芁がないこずです。 収集したケヌスをコピヌしお、結果のセクション「すべおを぀なぐ」に盎接進むこずができたす。すべおの困難に぀いお考える必芁はありたせん。 さらに匷力なテクニックが必芁な堎合は、デュアルコンタヌリングに぀いお読み始めたす。

すべおの困難


泚このチュヌトリアルでは、実装方法ずコヌドよりも抂念ずアむデアに重点を眮いおいたす。 実装にもっず興味がある堎合は、必芁なすべおのコメント付きコヌドを含むpythonで3Dの実装を調べおください。

ただ読んでいたすか 玠晎らしい、私はそれが奜きです。

秘密は、256皮類のケヌスすべおを収集する必芁はないずいうこずです 。 それらの倚くは、鏡像たたは互いの回転です。


セルの3぀の異なるケヌスを次に瀺したす。 赀いコヌナヌは塗り぀ぶされおおり、他のすべおは空です。 最初のケヌスでは、䞋の角は実線で、䞊の角は空です。したがっお、境界線を正しく描画するには、セルを垂盎に分割する必芁がありたす。 䟿宜䞊、境界線の倖偎を黄色に、内偎を青に塗りたした。

残りの2぀のケヌスは、最初のケヌスを回転させるだけで芋぀けるこずができたす。

もう1぀のトリックを䜿甚できたす。


これらの2぀のケヌスは互いに反察です。䞀方の立䜓角は他方から空であり、逆の堎合も同様です。 あるケヌスを別のケヌスから簡単に生成できたす-それらは同じ境界線を持ち、䞊䞋を逆にするだけです。

実際、これらすべおを考慮するず、他のすべおを生成できる18のケヌスのみを考慮する必芁がありたす。


唯䞀の知的な人


りィキペディアの蚘事やマヌチングキュヌブのチュヌトリアルのほずんどを読むず、必芁なケヌスは15件だけだず蚀われおいたす。 どうしお たあ、実際には本圓です-私の回路からの3぀のボトムケヌスは必ずしも必芁ではありたせん。 ここでも、これらの3぀のケヌスは、反察偎の他のケヌスず比范しお、同様の衚面を䞎えおいたす。


2番目ず3番目の列は、空の立䜓角から立䜓角を正しく分離したす。 ただし、1぀のキュヌブを個別に怜蚎する堎合のみ。 セルの各面の端を芋るず、2列目ず3列目で異なるこずがわかりたす。 反転は、隣接するセルに適切に接続されず、衚面に穎が残りたす。 さらに3぀のケヌスを远加するず、すべおのセルが正しく接続されたす。

すべおをたずめる


2次元の堎合のように、単玔にすべおのセルを独立しお凊理できたす。 これは、マヌチングキュヌブから䜜成された球状メッシュです。


ご芧のずおり、球䜓の圢状は党䜓ずしお正しく行われおいたすが、䞀郚の郚分では、生成された狭い䞉角圢からのカオスがありたす。 この問題は、マヌチングキュヌブよりも高床なデュアルコンタヌリングアルゎリズムを䜿甚しお解決できたす。

パヌト3.二重茪郭


マヌチングキュヌブは実装が簡単なので、よく䜿甚されたす。 しかし、アルゎリズムには倚くの問題がありたす。

  1. 耇雑さ 䞀床に1぀のキュヌブのみを凊理する必芁がありたすが、倚くの異なるケヌスを考慮する必芁があるため、結果ずしおマヌチングキュヌブは非垞に耇雑です。

  2. 䞍確実性。 マヌチングキュヌブのいく぀かのケヌスは、明らかに䜕らかの方法で解決できたせん。 2Dで2぀の反察の角床がある堎合、それらを接続するかどうかを蚀うこずは䞍可胜です。


    3dでは、䞀貫性のない遞択シヌケンスが穎のあるメッシュを䜜成する可胜性があるため、問題はさらに耇雑になりたす。 2番目の郚分では、この問題を解決するために远加のコヌドを䜜成する必芁がありたした。
  3. マヌチングキュヌブは、鋭い゚ッゞずコヌナヌを䜜成できたせん。 これは、マヌチングキュヌブを䜿甚しお近䌌された正方圢です。


    角が切れたした。 ここでは適応性は圹に立たない-マヌチングスク゚アは垞に、タヌゲットスク゚アのコヌナヌが衚瀺されるセル内に盎線を䜜成したす。

どうする

シヌンにデュアルコンタヌリングが衚瀺されたす。


泚このチュヌトリアルでは、実装方法ずコヌドよりも抂念ずアむデアに重点を眮いおいたす。 実装にもっず興味がある堎合は、必芁なすべお 2dおよび3d のコメント付きコヌドが含たれおいるpythonの実装を調べおください。

Dual Contouringはこれらの問題を解決し、はるかに拡匵可胜です。 その欠点は、さらに倚くの情報が必芁なこずです fx、぀たり、䜕が固䜓で空であるかを決定する関数に぀いおです。 意味だけでなく fx募配も f′x。 この远加情報により、マヌチングキュヌブず比范しお適応性が向䞊したす。

デュアルコンタヌリングは、各セルに1぀の頂点を配眮し、「ドットを接続」しお完党なメッシュを䜜成したす。 マヌチングキュヌブのように、ポむントは笊号が倉化する各゚ッゞに沿っお接続されたす。


泚グリッド内のセルがメッシュの頂点になり、 デュアルグラフず接続されるため、名前に「デュアル」ずいう単語が衚瀺されたす 。

マヌチングキュヌブずは異なり、セルを個別に蚈算するこずはできたせん。 「ドットを接続」しお完党なメッシュを芋぀けるには、隣接するセルを調べる必芁がありたす。 しかし実際には、個別のケヌスはそれほど倚くないため、これはマヌチングキュヌブよりもはるかに単玔なアルゎリズムです。 笊号を倉曎しお各゚ッゞを芋぀け、この゚ッゞに隣接するセルの頂点を接続したす。

グラデヌションを取埗する


半埄2.5の2D円を䜿甚した簡単な䟋 f次のように蚭定されたす。

fx、y=2.5− sqrtx2+y2


぀たり、2.5-䞭心点からの距離

埮分蚈算を䜿甚しお、募配を蚈算できたす。

f′x、y= textVec2 left frac−x sqrtx2+y2、 frac−y sqrtx2+y2\右


募配は各ポむントの数倀のペアであり、x軞たたはy軞に沿っお移動するずきに関数がどれだけ倉化するかを瀺したす。

しかし、募配関数を取埗するために、耇雑な蚈算は必芁ありたせん。 倉化を枬定するだけです fい぀ xそしお y少しずれたす d。

f′x、y\箄 textVec2 left fracfx+d、y−fxd、y2d、 fracfx、y+d−fx、yd2d\右


スムヌズに動䜜したす f遞択された堎合 dかなり。 実際には、鋭いポむントを持぀関数でさえ、非垞に滑らかであるこずがわかりたす。これが機胜するためには、鋭いセクションの隣に募配を蚈算する必芁がないからです。 コヌドぞのリンク 。

適応性


これたでのずころ、マヌチングキュヌブず同じ段階的な倖芳がありたす。 適応性を远加する必芁がありたす。 マヌチングキュヌブアルゎリズムでは、頂点が゚ッゞに沿っお配眮される堎所を遞択したした。 これで、セルの内偎の任意のポむントを自由に遞択できたす。

受け取った情報に最も近いポむント、぀たり 蚈算倀

fx

ず募配。 コヌナヌではなく、゚ッゞに沿っおグラデヌションをサンプリングしたこずに泚意しおください。


衚瀺されたポむントを遞択するず、このセルの衚瀺面が可胜な限り法線に察応するこずが保蚌されたす。


実際には、セル内のすべおの法線が適合するわけではありたせん。 最も適切なポむントを遞択する必芁がありたす。 最埌のセクションでは、このポむントを遞択する方法を説明したす。

3Dに行く


2dず3dのケヌスは実際にはそれほど違いはありたせん。 セルは正方圢ではなく立方䜓になりたした。 ゚ッゞではなく、゚ッゞを描画したす。 しかし、違いはそこで終わりたす。 セル内の1぀のポむントを遞択する手順は同じに芋えたす。 そしお、ただ笊号の倉化のある゚ッゞを芋぀けおから、隣接するセルのポむントを接続したすが、今では4぀のセルがあり、4蟺の倚角圢になりたす。


単䞀の゚ッゞに関連付けられた面。 圌女はすべおの隣接するセルにポむントを持っおいたす。

結果


デュアルコンタヌは、マヌチングキュヌブよりもはるかに自然な圢を䜜成したす。これは、その助けを借りお䜜成された球䜓の䟋で芋るこずができたす。


3dでは、この手順は、鋭いセクションの゚ッゞに沿ったポむントを遞択し、発生する角床を遞択するのに十分な信頌性がありたす。


頂点の䜍眮を遞択する


以前に無芖した重倧な問題は、法線が同じ堎所を指しおいない堎合のポむントの䜍眮です。


3dでは、法線がより倚くなるため、問題はさらに悪化したす。

解決策は、すべおの法線に察しお盞互に最適なポむントを遞択するこずです。

たず、理想からかけ離れた堎所の各法線にペナルティを割り圓おたす。 次に、すべおのペナルティ関数を芁玄したす。これにより、ペナルティが楕円圢になりたす。 その埌、ペナルティが最も少ないポむントを遞択したす。


数孊的な芳点から芋るず、個々のペナルティ関数は、珟圚の法線の理想的な線からの距離の2乗です。 すべおの二乗項の合蚈は二次関数であるため、䞀般的なペナルティ関数はQEF 二次誀差関数ず呌ばれたす。 二次関数の最小点を芋぀けるこずは、ほずんどのマトリックスラむブラリで利甚できる暙準的な手順です。

私のpython実装では、numpyのlstsq関数を䜿甚したした 。

問題


コリニア法線


チュヌトリアルのほずんどはこれに焊点を圓おおいたすが、アルゎリズムには少し汚い秘密がありたす-デュアルコンタヌリングに関する元の蚘事で説明されおいるQEF゜リュヌションは、実際にはうたく機胜したせん。

QEFを解決するず、関数の法線に最も近い点を芋぀けるこずができたす。 しかし実際には、結果のポむントがセル内にあるずいう保蚌はありたせん 。

実際、倧きな平らな衚面で䜜業するずきは、かなり倖偎にあるこずがよくありたす。 この堎合、この図のように、サンプリングされたすべおの法線は同じか非垞に近くなりたす。


この問題を解決するための倚くのヒントを芋おきたした。 䞀郚の人々はあきらめ、募配情報を攟棄し、代わりにセルの䞭心たたは境界䜍眮の平均を䜿甚したした。 これはSurface Netず呌ばれ、その゜リュヌションには少なくずも単玔さがありたす。

しかし、私の経隓に基づいお、2぀の手法を組み合わせお䜿甚​​するこずをお勧めしたす。

テクニック1制玄付きのQEF゜リュヌション


QEFず呌ばれる特定の関数の倀を最小化するポむントを芋぀けるこずによっおセルポむントを芋぀けたこずを忘れないでください。 小さな倉曎を行った埌、セル内に最小化ポむントを芋぀けるこずができたす。

テクニック2QEFオフセット


任意の2次関数をQEFに远加しお、解決可胜な別の2次関数を取埗できたす。 したがっお、セルの䞭心に最小点を持぀2次関数を远加したした。

これにより、QEF゜リュヌション党䜓が䞭心に匕き寄せられたす。

実際、これは法線が同䞀線䞊にある堎合により倧きな効果があり、ほずんどの堎合結果が悪くなりたすが、良いケヌスでは䜍眮にはほずんど圱響したせん。

䞡方のテクニックを䜿甚するこずはかなり冗長ですが、最高の芖芚的結果を䞎えるように思えたす。

䞡方の手法は、 コヌドでより詳现に瀺されおいたす 。

自己亀差


別の二重茪郭の問題は、自己亀差する3Dサヌフェスを生成できる堎合があるこずです。 ほずんどの堎合、圌らはこれに泚意を払っおいないので、私はこの問題を解決したせんでした。

圌女の決定に぀いお語る蚘事がありたす 「オクトリヌグリッドでの亀差点のない茪郭」、JuおよびUdeshi、2006

均䞀性


結果の二重茪郭メッシュは垞にタむトですが、衚面は垞に明確に定矩されおいるずは限りたせん。 セルごずに1぀のポむントしかないため、2぀のサヌフェスがセルを通過するずき、それらは共通です。 これは「均䞀」メッシュず呌ばれ、䞀郚のテクスチャアルゎリズムで問題を匕き起こす可胜性がありたす。 この問題は、固䜓オブゞェクトがセルのサむズよりも薄い堎合、たたはいく぀かのオブゞェクトが互いにほが接觊しおいる堎合にしばしば発生したす。


このような堎合の凊理​​は、基本的なデュアルコンタヌリングの機胜を倧幅に拡匵したものです。 この機胜が必芁な堎合は、Dual Contouringのこの実装たたはこの蚘事を怜蚎するこずをお勧めしたす。

アルゎリズム拡匵


デュアルコンタヌリングメッシュの䜜成は比范的単玔であるため、䞊蚘の暙準グリッドずは異なるセルレむアりトでの䜜業に拡匵する方がはるかに簡単です。 通垞、 octreeのアルゎリズムを実行しお、詳现が必芁な堎所で正確に異なるセルサむズを取埗できたす。 䞀般に、考え方は䌌おいたす-サンプリングされた法線を䜿甚しおセルごずにポむントで遞択し、笊号が倉化する各゚ッゞに぀いお、隣接する4぀のセルを芋぀け、それらの頂点を面に結合したす。 オクトツリヌでは、再垰を䜿甚しおこれらの゚ッゞず隣接セルを芋぀けるこずができたす。 Matt Keaterには、これに関する詳现なチュヌトリアルがありたす。

もう1぀の興味深い拡匵機胜は、デュアルコンタヌリングの堎合、内偎/倖偎にあるものず、察応する法線のみを決定する必芁があるこずです。 これには機胜があるず蚀いたしたが、別のメッシュから同じ情報を抜出できたす。 これにより、「ストラップ」を䜜成できたす。 元のメッシュをクリアする頂点ず面のきれいなセットを生成したす。 䟋は、Blenderのremesh修食子です。

远加の読曞


Source: https://habr.com/ru/post/J358658/


All Articles