タグ付けされた質問 「collision-detection」

衝突検出とは、ゲームプレイ中に2つ以上のエンティティが互いに接触するかどうかを決定することです。

9
同じ場所に立っている敵を止める簡単な方法はありますか?
つまり、トップダウンゲームでは、敵がプレイヤーを追いかけます。一定の距離内に入ると、敵は静止して発砲します。それらがすべて同じ方向から来ている場合、私は現在敵間の衝突検出を行っていないので、それらはすべて同じ場所に立ちます(つまり、お互いの中に立ちます)。 これを回避する簡単な方法は何ですか?何らかの形の衝突検出またはAIのどちらか?

6
距離関数を最適化する方法は?
かなり単純なRTSのようなゲームを開発しているときに、距離の計算がパフォーマンスに影響を与えていることに気付きました。 常に、ユニットがターゲットの範囲内にあるかどうか、発射体がターゲットに到達したかどうか、プレイヤーがピックアップを乗り越えたか、一般的な衝突などがあるかを知るための距離チェックがあります。 2点間の距離が多く使用されます。 私の質問はまさにそれについてです。フレームごとに何千回も実行している場合、かなり時間がかかる通常のsqrt(x * x + y * y)アプローチ以外に、ゲーム開発者が距離をチェックするための代替手段を知りたいです。 マンハッタン距離と二乗距離の比較に気づいていることを指摘したい(sqrtボトルネックをスキップすることによって)。他に何か?

5
衝突解決
衝突をチェックする方法はよく知っていますが、衝突を適切に処理する方法はわかりません。 簡略化して、2つのオブジェクトが衝突した場合、速度の方向を変更するためにいくつかの計算を使用します。2つのオブジェクトを移動しない場合、それらは依然として重なり、速度が十分に大きくない場合、次の更新後にも衝突します。これにより、オブジェクトが互いにスタックする可能性があります。 しかし、2つのオブジェクトが重ならないように移動しようとするとどうなりますか。これは良いアイデアのように聞こえますが、3つ以上のオブジェクトがある場合、これは非常に複雑になることに気付きました。2つのオブジェクトを移動し、そのうちの1つが他のオブジェクトと衝突した場合、それらも移動する必要があり、壁などと衝突する可能性があります。 トップダウンの2Dゲームを考えていますが、それはそれとはあまり関係ないと思います。衝突は通常どのように処理されますか? この質問はWoohに代わって尋ねられます

4
2Dでのコーナーコリジョンの処理方法
トップダウンの2D XNAゲームを書いています。最初の頃から、物理学と衝突に関するものを自分で書いて、それを学習しようとしています。 プレーヤーのスプライトキャラクターが境界が壁の端と交差する位置に移動しようとするたびに、跳ね返り角度(入射角=反射の角度)を計算し、プレーヤーを壁から跳ね返して衝突を回避します。 角に当たったとしても、スプライトが2つの壁のエッジと同時に交差する状況をどのように処理するかを考えるのに苦労しています。 私のコードでは現在、2つの壁のエッジが交差しているが、どちらのエッジが最初にヒットしたか、したがってどのエッジが跳ね返ったかはわかりません。 どのエッジを跳ね返すかを選択する数学的テストは何ですか?見てみるとわかりやすいですが、数学テストを理解するのに苦労しています。

4
物理エンジンの更新の問題の勢いと順序
この質問は、衝突の検出と解決に関する以前の質問からの「フォローアップ」質問であり、こちらで見つけることができます。 前の質問を読みたくない場合は、私の物理エンジンがどのように機能するかについて簡単に説明します。 すべての物理エンティティは、SSSPBodyと呼ばれるクラスに格納されます。 AABBのみがサポートされています。 すべてのSSSPBodyは、すべてのボディを更新し、重力を処理するSSSPWorldと呼ばれるクラスに格納されます。 すべてのフレームで、SSSPWorldはすべてのボディを更新します。 更新されたすべてのボディは、空間ハッシュで近くのボディを探し、それらとの衝突を検出する必要があるかどうかをチェックします。「はい」の場合、「衝突」イベントを呼び出し、それらとの衝突を解決する必要があるかどうかを確認します。はいの場合、侵入ベクトルと方向の重なりを計算し、侵入を解決するために位置を変更します。 ボディが他のボディと衝突すると、ボディの速度をそれ自体に設定するだけで、ボディの速度が他のボディに転送されます。 ボディの速度は、最後のフレームから位置を変更していない場合、0に設定されます。また、移動する物体(リフトや移動するプラットフォームなど)と衝突する場合、リフトの移動差を計算して、物体が最後の位置から移動していないかどうかを確認します。 また、ボディは、AABBのすべての角がフレーム内の何かと重なったときに「クラッシュ」イベントを呼び出します。 これは私のゲームの完全なソースコードです。3つのプロジェクトに分かれています。SFMLStartは、エンティティの入力、描画、更新を処理するシンプルなライブラリです。SFMLStartPhysicsは、SSSPBodyクラスとSSSPWorldクラスがある最も重要なものです。PlatformerPhysicsTestは、すべてのゲームロジックを含むゲームプロジェクトです。 そしてこれは、SSSPBodyクラスの「更新」メソッドであり、コメント化および簡略化されています。SFMLStartSimplePhysicsプロジェクト全体を見たくない場合にのみ、これを見ることができます。(そして、たとえ行ったとしても、コメントされているので、これを見てください。) .gifは2つの問題を示しています。 ボディが異なる順序で配置されている場合、異なる結果が発生します。左側のクレートは右側のクレートと同じで、逆順でのみ配置されます(エディターで)。 両方のクレートを画面の上部に向けて推進する必要があります。左側の状況では、木枠は推進されません。右側では、そのうちの1つだけです。両方の状況は意図していません。 最初の問題:更新の順序 これはかなり簡単に理解できます。左側の状況では、最上位のクレートが他のクレートの前に更新されます。下部のクレートが速度を他のクレートに「転送」しても、次のフレームが移動するのを待つ必要があります。移動しなかったため、下枠の速度は0に設定されます。 これを修正する方法がわかりません。物理エンジンの設計全体で何か間違ったことをしていると感じているため、更新リストの「ソート」に依存しないソリューションを好むでしょう。 主要な物理エンジン(Box2D、Bullet、Chipmunk)は更新順序をどのように処理しますか? 2番目の問題:1つのクレートのみが天井に向かって推進されます 私はまだこれが起こる理由を理解していません。「スプリング」エンティティが行うことは、ボディの速度を-4000に設定し、スプリング自体の上に再配置します。再配置コードを無効にしても、問題は引き続き発生します。 私の考えは、下のクレートが上のクレートと衝突すると、その速度は0に設定されるということです。これがなぜ起こるのかわかりません。 最初の問題をあきらめる誰かのように見える可能性にもかかわらず、私は上記のプロジェクトソースコード全体を投稿しました。私はそれを証明するものは何もありませんが、信じてください、私はこれを修正するために一生懸命努力しましたが、解決策を見つけることができず、物理学と衝突に関する以前の経験はありません。私はこれらの2つの問題を1週間以上解決しようとしてきましたが、今は必死です。 ゲームから多くの機能(速度転送やスプリングなど)を取り除くことなく、自分で解決策を見つけることはできないと思います。 この質問を読んでくれてありがとう。また、解決策や提案を考えてみてください。

6
衝突100%回避の実装
私は、ゲーム開発と、私が知っているすべての衝突回避/解像度については、私はそれを学んだと絶対初心者だ上またはを通じて、過去の週に、このサイト...私はここに求めているものですので、もし正しい私に躊躇しないでください間違った仮定/誤解に基づいています。明確にするために最善を尽くしましたが、それは主題がまだ私にとって斬新であると言いました。 乗り物 私のゲームでは、自律的に移動する車両があります。それらは3D空間に配置され、その動きは各車両ごとに異なる多くの変数によって管理されます。ここで関心のあるものは主に: 前進のみ。 速度最小と最大の間で変化することができるが、その分ではない(でも近くに)ゼロ。 速度に依存するステアリング半径(速度が速いほど、半径が大きい) 2つの最大加速度(速度の増減に使用) ゴール 私の目標は、100%正確な衝突回避を実現する何らかのAIを実装することです(つまり、車両が衝突することはありません)。 設計 が、私はより多くのAIを持つことのアイデアを好む「オンボード」(すなわち、最終的に照会および/または他の車両へメッセージを送信する、それ自身の「AI回避衝突」を有する各車両)私はでCA AIを実装することも可能です中央レベル(車両へのコマンドのディスパッチ)。 ほとんどの場合、車両はあら​​ゆる方向に互いを避けなければなりませんが、特定の状況では、衝突を避けて同じターゲットに向かう必要があります これまでに見つけたものと行き詰まった場所 このサイトの他の質問で見つけた多くのリンクの中で、特にこれらのリンクを使用していることがわかりました。 プールボール同士の衝突 不当な衝突回避 待ち行列 これらの3つのリンクは多くの点で「目を開きました」が、私の場合、その情報をどのように使用するかがすぐにはわかりません。特に記事#2では、衝突を防ぐために「試行」するだけです(ただし、衝突は時々発生します)。記事3では、衝突を防ぐために車両を時々停止する必要があります。 私が気づいたのは、上記のリンクされた衝突回避アルゴリズムが線形速度の「瞬時投影」を使用して、何かが車両の途中にあるかどうかをチェックすることです。私の場合、これで十分なのか、もっと現実的な方法で自分の位置を投影する必要があるのか​​疑問に思っていました(例:右に90°のステアリングに60°いる場合、残りの位置について自分の位置を計算する必要があります曲線の30°、および直線運動を想定)。 最後に、私は特にデッドロックを恐れています。つまり、世界の車両の密度はかなり低くなりますが、特定の数の車両が同じポイントに向かって収束すると、衝突コースにいることに気づいたら、回避操作は不可能になるのではないかと心配しています車両が他の車両と衝突する経路にあるためです。 質問 「目標」に到達するにはどうすればよいですか?もちろん、詳細な説明は大歓迎ですが、外部リソースへのリンクも大いに役立ちます(この問題に最初に取り組んでいるとは思いませんが、おそらくWebの検索に間違ったキーワードを使用しましたか? ) よろしくお願いします!

3
OBB対OBB衝突検出
2つのバウンディングボックスオブジェクトがあり、それぞれがボックス内の現在の頂点をベクトルに格納し、オブジェクトのすべての頂点が共通の軸に対して回転および変換されているとします。 ここに私の問題を説明するための画像があります: 2つのOBBがリンクをオーバーラップしている場合、どうすれば問題の解決策を説明するのに役立つのでしょうか。複雑すぎることはありません...

7
2Dプラットフォーマーでプレイヤーが押しつぶされていることを検出するにはどうすればよいですか?
#1に示すように、プラットフォーマーキャラクターの衝突をチェックしています。赤い点はチェックされるピクセルで、灰色の線はそれらが関係する軸を示します。この方法で衝突をチェックすることで得られる結果が気に入っています(たとえば、バウンディングボックスに対して)。クラッシュ検出という1つの問題を除いて、すべてが希望どおりに機能します。 次の画像では、水色のボックスは地面を表し、オレンジ色のボックスはオブジェクトを表し、矢印は移動の方向を示します。 プレイヤーが押しつぶされたときを検出する簡単な解決策は、反対側の衝突ポイントが両方ともトリガーしているかどうかを確認することです。もしそうなら、プレイヤーは粉砕されています。#2では、通常のクラッシュシナリオを見ることができます。プレーヤーは接地され、上部の衝突点は落下オブジェクトと交差します。これはクラッシュを引き起こします。 #3、4、および5は、問題のあるシナリオを示しています。#3では、プレーヤーはオブジェクトに向かって移動し、オブジェクトは上に移動します。右側の衝突点がオブジェクトに当たり、衝突を引き起こしてプレイヤーを停止させます。 これで、オブジェクトが上に移動し続け、プレイヤーが右に移動し続けると(#4に示すように)、オブジェクトはプレイヤーの右側の衝突点をクリアし、プレイヤーは右に移動します。しかし、今では、オブジェクトが上部の衝突点と交差しているため、不要な垂直クラッシュが発生しています。 同様のシナリオを#5に示します。2つのオブジェクトは、下部の衝突点をクリアするのに十分離れているため、プレーヤーは落下できますが、側面の衝突点がクリアされるまではできず、不要な水平クラッシュが発生します。 私は解決策に頭を悩ませてきましたが、私が思いついたものは何も特にうまくいきませんでした。 混乱を解消するために、赤い衝突点はスプライト内にあり、灰色の線は各衝突点に関連する軸を示すためにのみ使用されていました。たとえば、キャラクターのスプライトが単純な緑の正方形の場合、衝突点は次のようになります。

2
衝突検出ロジックはどこに配置する必要がありますか?
私は小さな2Dゲームエンジンを開発しています。文字には、現在次のことを行うpaintメソッドがあります。 速度などに応じてキャラクターの新しい位置を計算します。 コリジョングリッドセルを更新します** 新しい位置にキャラクターを描く **交差点チェックの回数を減らすために衝突グリッドを作成しました 今、衝突を検出するために私が考えた基本的なアルゴリズムは次のとおりです。 For Each Character Check intersection with characters in surrounding 8 cells このメソッドをpaintメソッドに配置するだけです。しかし、ここに私が予想する問題があります。 2つの文字AとBが衝突グリッドの隣接するセルにあるとします。これで、上記のアルゴリズムに従って、文字Aの反復でBと衝突したことが検出されます。文字Bの反復で、文字Aと衝突したことが検出されます。 しかし、AがBと衝突したことをAが検出すると、Aと衝突したことをBに通知する必要があるという考えがあります。これにより、衝突するアクタが2人以上いる場合に多くの比較を保存できます。しかし、私はこれをどのように扱うかわかりません。すべてのキャラクターが衝突をチェックする代わりに、ゲームループ内で衝突をチェックする必要があると思います。 このアプローチは正しいでしょうか?この種の問題をどのように処理しましたか?衝突グリッドのことは自分で考えました。コリジョングリッドロジックに代わるものはありますか?


7
A *エージェントに他のエージェントを回避させるにはどうすればよいですか?
タイルマップにマルチエージェントA *アルゴリズムを実装しています。エージェントはX軸とY軸でのみ移動します。パスを計算するときに他の場所がどこにあるかをチェックすることで、それらの間の衝突を回避します。 エージェントが異なる方向から同じタイルを渡す必要がある場合を除いて、問題なく機能します。このような状況では、最適な解決策は、一方のエージェントが他方のエージェントの通過を待つことです。 また、北の回廊がない場合、経路探索は失敗します。 そのようなアルゴリズムをどのように実装できますか?

1
高速で正確な2Dコリジョン
私は2Dトップダウンシューティングゲームに取り組んでおり、今では基本的な四角形の境界ボックス衝突システムを超える必要があります。 私は多くの異なるスプライトを持つ大きなレベルを持っています。それらはすべて異なる形状とサイズです。スプライトのテクスチャはすべて透明な背景を持つ正方形のpngファイルであるため、プレーヤーが透明な背景ではなくテクスチャの色付き部分に進入したときにのみ衝突する方法も必要です。 次のように衝突を処理する予定です。 プレーヤーの範囲内にスプライトがあるかどうかを確認します 四角形の境界ボックスの衝突テストを行う 正確な衝突を行う(助けが必要な場合) 私はすべての要件を念頭に置いてこれを正しくしたいので、高度な技術は気にしませんが、これにどのようにアプローチするのかわかりません。どんなテクニック、さらにはライブラリも試してみてください。私はおそらく、各スプライトから透明な背景を差し引いたものを正確に表す何らかの種類の形状を作成して保存する必要があることを知っています。 私はピクセルごとに遅いことを読んだので、私の大きなレベルとオブジェクトの数を考えると、私はそれが適切だとは思わない。Box2dも調べましたが、多くのドキュメントや、SFMLでそれを実行する方法の例を見つけることができませんでした。

1
長方形が衝突する側面を決定する単純な2D長方形衝突アルゴリズム?
最初は長方形の交差点を実装してみましたが、うまく機能します。ただし、速度、加速度、方向ベクトルなどの物理システムを適用する必要がある場合、四角形のどちら側が衝突するかを判断する方法を見つける必要があります。さて、私のシステムでは、回転した長方形はないので、これは問題を単純化しました。しかし、どの長方形の側面が衝突したかを判断する簡単な方法を見つけることができませんでした。私は以前この問題に対処したことがありますが、惨めに失敗しました。 過去に私がやったことは、平行な長方形の各辺間の距離を決定し、距離が0に近い(最初に定義された距離範囲を使用)か0かを確認することです。しかし、浮動小数点演算では、未知の時間が経過した。定義された範囲に達する前に、長方形が実際に交差する場合があります。 一方、私は複数の長方形を生成することを考えていました。各長方形は各辺に対応しています。ただし、考え直してみると、距離範囲をチェックする平行な側面があるのと同じことです。ただ、その距離範囲は各ミニ長方形の幅です。 したがって、この問題に対する提案はありますか?

1
SATを使用して複合形状の衝突を解決する方法は?
SATは、任意の凸多角形間の衝突を判断する適切な方法です。衝突を解決するために必要なベクトルも取得します。 複雑な(非凸)形状間の衝突を解決するために、私はいくつかの凸多角形で構成されるある種の複合形状について考えていました。衝突がブロードフェーズで発生する場合(たとえば、円対円またはAABB対AABB)、衝突は、複合形状の各ポリゴンと他の複合形状の各ポリゴンをチェックすることで解決されます。 オブジェクトを実際に分離する最良の方法は何でしょうか?素朴なアプローチは、最高の大きさのベクトルを取得し、それを分離に使用することです。次の図では、これはV 2になります ただし、分離ベクトルが異なる方向を指している場合、衝突をすぐに解決することはできず、何度か繰り返す必要があります。したがって、次の図ではV 1を使用して分離し、別の反復ではV 2(または形状がV 1の量だけ移動したためV 2に近いもの)で分離します。 このアプローチは、互いに反対方向を指すベクトルを分離する場合、または次の図に示すような場合に失敗します。 ここでは、左側の状態と右側の状態の間で無限に反復します。 ここで実際の質問をする:この問題に対する合理的なアプローチは何ですか?複雑な形状に複合ポリゴンを使用することは合理的な考えだと思いますが、その場合、衝突をどのように解決する必要があるのでしょうか?3番目の画像に示すように、行き止まりを検出するにはどうすればよいですか?

2
3Dコリジョンを実装するための最良/効率的な方法
以前のゲーム用に2Dベースの衝突システムをすでにプログラミングしました。それは私の最初の衝突システムであり、wasいものでした。すべてのオブジェクトとすべてのオブジェクトをチェックして、オブジェクト間の衝突を探していました。オブジェクトが現在のセルの他のオブジェクトとの衝突のみを見るようなセルを備えたグリッドシステムについては、すでに聞いたことがあります。衝突をチェックするのに本当に良い方法ですか? 3Dの世界ですべてのアイテムをループするための優れたテクニックが必要です。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.