衝突のために2Dビットマップ(地形に使用)を2Dポリゴンメッシュに変換するにはどうすればよいですか?


7

だから私は、破壊可能な地形などの通常のすべてのものを備えたワームに似た大砲タイプのゲームを作っています...そして、私に衝突法線やそのようなものを与えないピクセルごとの衝突を使うことができましたが。すべてをメッシュに変換することは、既存の物理ライブラリを使用できることも意味します。これは、自分で作成できるものよりも優れています。

私は、マーチングスクエアを使用してビットマップの輪郭を取得することでこれを行うと人々が言及しているのを見てきましたが、これらをメッシュに変換する方法については何も見つかりません(異なる高さを定義する輪郭線を持つ3Dメッシュを参照する場合を除き、これは私が望むものではありません)。現時点では、次のような基本的なマーチングスクエアの輪郭を取得できます(背景のグリッドのような線がマーチングスクエアの「セル」になります)。

マーチングスクエアの結果

よりスムーズで正確な結果を得るには、補間する必要がありますが、それが一般的な考え方です。これをメッシュに変換する方法についていくつかのアイデアがありましたが、それらの多くは特定の状況で機能しない可能性があり、完全に機能すると考えていたものは非常に遅く、仕上げさえしていませんまだ!理想的には、私が最終的に使用するものはどれも、急速に発射する武器や掘削ツールなどのケースですべてのフレームを実行するのに十分な速さである必要があります。

このようなものをメッシュに変換するための何らかの既存のアルゴリズム/テクニックがあるに違いないと思いますが、何も見つからないようです。Delaunay Triangulationのようなものを見てきましたが、私が知る限りでは、上記の例のように凹型の形状を正しく処理できず、地形内の穴も考慮されません。

比較のために思いついたテクニックを調べて、誰かがより良いアイデアを持っているかどうかを確認すると思います。まず最初に、マーチングスクエアの等高線を補間し、線の端から頂点を作成し、線がセルのエッジと交差する場所の頂点取得します(重要)。次に、頂点を含む各セルについて、2つの頂点を使用してポリゴンを作成し、セルのコーナーを3番目の頂点(おそらく最も近いコーナー)として作成します。

ここに画像の説明を入力してください

各セルに対してこれを行うと、元のビットマップを正確に表すメッシュが必要になると思います(ビットマップの端にあるのはポリゴンだけで、その間にある大きな領域は空になります)。これに関する唯一の問題は、最初のマーチングスクエアですべてのピクセルを1回ループし、次にすべてのセル(画像の高さ+ 1 x画像の幅+ 1)を少なくとも2回ループすることです。画像...


1
「それは私に衝突法線やそのようなものを与えません。」誰が言ったのですか?近くのピクセルをチェックして、衝突の法線をうまく生成できます。実際、マーチングキューブをオンデマンドで使用して、これを正確に行うことができます。メッシュは必要ありません。あなたは普通でいいですよね?
Nicol Bolas、

ええ、私は実際に同じようなことをすでに行っていますが、それは素晴らしいことではありません。私はそれがかなりうまく機能することを意味しますが、完全には完全ではありません。衝突点の周りの小さな領域にマーチングスクエアを使用することは、おそらく以前のものよりも少し良い解決策でしょうが、それでも問題が見られます。たとえば、サンプル領域が小さすぎると、ディテールが失われるため、法線が不正確になります。一方、領域が大きすぎると、得られるエッジの角度を平均化する必要があることを意味します(これも不正確な場合があります)。
Megadanxzero

そしてもちろん、それは私が自分の物理を作成しなければならないという事実を無視しています。既存の堅牢な物理エンジンを使用するのではなく、おそらくそれはあまりうまくいかないでしょう。衝突検出を独自のピクセル単位のものでオーバーライドして、それに反応するための通常の衝突を与えることができる物理エンジンについては知りません。そのようなものが存在する可能性もあります。
Megadanxzero

正常のどれくらい正確が必要ですか?あなたは焦土/ワームスタイルのゲームを作っています。バウンスが完璧でない場合、プレイヤーはあなたを許すと思います。つまり、古いDOS焦土は非常に正確なメッシュなどを構築していたと思いますか?現代のワームゲームでさえ、これを計算するために多大な労力を費やしていると思いますか?
Nicol Bolas、

1
物理システム(特に 2D)の「物理」部分が最も簡単な部分です。難しいのは「衝突」の部分です。
Nicol Bolas

回答:


2

私はこれまで2D物理エンジンを使用したことがありません。衝突メッシュがどのように表示されるかは正確にはわかりません。

それが単に2D三角形のセットである場合は、三角形分割法を検討する必要があります。たとえば、制約付きのドローニー三角形分割

Delaunay三角形分割は、三角形分割内の三角形のすべての角度の最小角度を最大化します。彼らは細い三角形を避ける傾向があります。

これは、少なくともこれらの三角形のレンダリングに関しては良いことであり、衝突検出にも適している場合とそうでない場合があります。

制約付きのDelauny三角形分割には、検出されたエッジである固定エッジが組み込まれています。このライブラリはあなたが必要とするものを提供するかもしれません


ああ、私はConstrained Delaunay Triangulationについて聞いたことがありませんでした。それはまさに私が必要とするものであるように思われるので、間違いなく調べなければなりません。ありがとう!
Megadanxzero
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.