移動する円で掃引される2Dグリッドセルを見つける方法は?


9

私は2Dグリッドに基づいてゲームを作成しています。一部のセルは通過可能で、一部は通過できません。動的オブジェクトは、グリッドに関係なく連続的に移動できますが、通行できないセルと衝突する必要があります。

グリッドに対してレイをトレースするアルゴリズムを作成しました。これにより、レイが交差するすべてのセルが得られます。ただし、実際のオブジェクトはポイントサイズではありません。私は現在、それらを円で表しています。しかし、動いている円をトレースするための効果的なアルゴリズムを理解できません。ここに私が必要なものの写真があります: ここに画像の説明を入力してください

数字は、円がグリッドセルと衝突する順序を示します。誰かがこれらの衝突を見つけるアルゴリズムを知っていますか?できればC#で。

更新単一のグリッドセルよりも大きい場合があります。


なぜ3が4の前に衝突するのですか?
FxIII '06 / 06/23

@FxIII私は実際に写真の中で円を動かしました、そしてそれは4の前に3をヒットしました。
11:01に

回答:


6

移動方向に接する円上の点からストロークを描くことを選択するので、あなたの描画は少し誤解を招くと思います。あなたのグリッドのエッジへの衝突は、あなたのサークルのトップと左のポイントがエッジに触れたときに起こっていることがわかります。

ましょCはあなたの中心であるとrは半径ので、P」 = C +(R、0)とP」 = C +(0、r)を。

場合はDがあなたの方向ベクトル(ベルソル)で次の2つのラインを持っています:

R '= Dt + P'

R "= Dt + P"

これらの線と方程式の線との交点を見つける必要があります。

y = iとy = i がグリッドのエッジです!

解決策は、あなたが見つけるでしょう。あなたは、単にxまたはRのYコンポーネント」とR」を考慮しなければならないので簡単ですトン各insersectionのための値を、そしてthooseのためのポイントトンによるS、単にソートそれらのポイントトンとあなた完了しました。

交点が分かれば、どのセルがヒットしたか簡単に言えると思います。

これは、r <1(セルの幅と高さ)の場合に機能します。

P 'P "について検討するだけで、他のケースでも機能します。TOPとLEFTを選択するのは、方向が異なるためです。BOTTOMとRIGHTは、反対方向と見なす必要があります。その理由を理解してください。

今、この画像を見てください: 大きな円

円は単一のセルよりも大きく、描画と同じ方向に進んでいると考えられます。P1は最初に接触するポイント、P2は2番目、P3は下半分にあるため役に立たない。あなたがする必要があるのは、前に見たようにP1とP2から光線を投じて、垂直線に対して同じことをすることです。

一般に、TOPとLEFTに加えて、光線を放つ場所から他の開始点があります。円が大きいほど、照射する光線が多くなります。

正直に言うと、幾何学的な考慮を払ってすべての光線を放つことを避けることができますが、それによって状況がわかりにくくなる可能性があります。


ええ、私はP 'ポイントとP "ポイントを自分で考えましたが、円が単一のセルよりも大きい場合の対処法を理解できませんでした。追加のポイントは本当に意味があります(そして P'とP P ")
Nevermind '23

計算を簡略化する幾何学的な考慮を行うことができますが、実装を使用すると経験から同じ結果が得られます。
FxIII

水平グリッド線と垂直グリッド線を別々にテストする必要があることは明らかですか?
FxIII '06 / 06/23

円がグリッドの頂点をカバーするタイミングも確認する必要があると思います。円はその対角線で斜めに隣接するセルと衝突しますが、最初に接触する円の上/左/下/右端の点とは限りません。 (そして、衝突を早期に検出します。)例:質問の例の図の3、4、5の正方形。それらは順番にヒットしますが(3、4、5)、アルゴリズムは4と5を同時に検出します。
finnw 2011年

@finnw彼らが同時に触れるのは、シクルが二等分線の方向に正確に移動する場合のみです。
FxIII、2011年

1

レイコリジョンアルゴリズムを使用する場合は、各サークルで8つのポイントを選択し(45度刻みで、正方形のグリッドに合わせて)、対応するポイント間でレイコリジョンを使用します(つまり、1つの頂点から)もう一方の上に丸を付けます)。これらすべてのレイ衝突の和集合は、交差するセルのセット全体です。

おそらくこれを少し改善することができます-たとえば、1つの円の中心から他の円の中心までの線分を使用しますが、円の半径によって両側を延長し、平行線分を円の端にある両側。


8光線はおそらくすべての交差を保証しますが、それらは正しい順序でそれらを与えません。衝突の場合は、セルのリストだけでなく、順序も必要です。
ネヴァーマインド

レイコリジョンアルゴリズムを拡張して、コリジョンごとにt値を保持します。セルの結合を取得したら、t値で並べ替えて正しい順序を取得できます。
TreDubZedd 2011年

しかし、どのようにして異なる光線のt値を比較できますか?
ネヴァーマインド

常に同じ円から発生している場合、交点はその円からの距離になります。すでに見たセルに到達したときに、現在の衝突のt値が前の衝突よりも小さい場合は、それを使用します。それ以外の場合は、交差を破棄します(元の衝突を維持)。
TreDubZedd

1
ムーブメントに垂直な円の側面に2本の光線を配置するだけで問題を回避できる可能性があります。光線に当たったタイルを確認し、残りのタイルをチェックして、2つの光線の間に中心があるかどうかを確認できます。見逃してはならないのは、最初または最後の円で衝突するものだけですが、それは2つの円にすぎず、簡単に処理できます。8本の光線より少し遅いかもしれませんが、よくわかりません。ただし、円のサイズに基づいて数値をスケーリングする必要はありません。
Lunin、

1

これが完全なアナロジーであると言っているわけではありませんが、ブレゼンハムのラインアルゴリズムについて考えるかもしれません。このアルゴリズムまたはその拡張機能の1つを変更すると、特に他の投稿やコメントと組み合わせる場合に役立つことがあります。通常、このアルゴリズムは順序付けとは関係ありませんが、かなり簡単に追加できると思います。


私もこれについて考えていましたが、私の意見では、これは適切なアルゴリズムではありません。Bresenhamは1つのピクセルのみを選択し、すべてが必要です。また、ブレゼンハムを1ピクセルだけの円に適合させることは困難です。
zacharmarz

私が使用するレイトレーサーは、実際にはBresenhamアルゴリズムに基づくちょっとしたものです。細い線から「太い」線、具体的には円掃引に一般化するのに問題があります。
ネヴァーマインド
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.