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

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

3
プラットフォーマーの構築-プレイヤーがジャンプを許可されているかどうかを判断する方法は?
シンプルなPlattformerジャンプアンドランスタイルゲームを構築しています。私はタイルを使用しません-代わりに、レベルエンティティの幾何学的図形を使用します(プレーヤーも1つです)。私は衝突検出コードを完成させましたが、これまでのところすべてが正常に機能しています。 次に、ジャンプを実装したかった。プレーヤーが適切なキーを打ったかどうかを確認し、上方向の速度を追加します。正常に動作します。しかし、プレイヤーが空中であっても機能しますが、これは私が望むものではありません。;-) だから、プレイヤーが何かの上に立っているかどうかを確認する必要があります。私の最初のアイデアは、最後のフレームで衝突があったかどうかを確認し、プレーヤーを「ジャンプ可能」としてマークすることでしたが、プレーヤーが空中の壁に当たった場合でもトリガーされます。私の数学のスキルはそれほど良くないので、私は助けを求めます-ヒントでさえこれを実装する方法を行います。 ありがとう!

4
画面上のマウス位置を「マッピング」して、解像度に関係なく衝突検出が機能するようにするのは悪い考えですか?
デフォルトの解像度が800x600のゲームを考えてみましょう。衝突マスクを持つオブジェクトは、サイズ800x600のゲームワールドに配置されます。衝突マスクは、マウスが衝突マスクに衝突したことを検出できます。 次に、ゲームを1024x768に拡大することを考えます(すべてをレイヤーにレンダリングし、レイヤー全体を一度に拡大するだけでグラフィックを拡大すると仮定します)。この新しい解像度でマウスとの衝突を適切に機能させるには、2つのオプションがあります。 A.)ワールドを1024x768に拡大し、それに応じてすべてのオブジェクトのコリジョンマスクを拡大します。 B.)マウスの位置を元の世界(800x600)に「マッピング」します。 「マップ」とは、マウスの位置を元の800x600の世界に単純に拡大縮小することを意味します。たとえば、画面上のマウス位置が(1024、768)の場合、世界のマウス位置は(800、600)です。 明らかに、オプションBの方が計算量が少なく、おそらく幾何学的エラーが発生しにくいかもしれませんが、このメソッドを使用すると予期せぬ結果が生じるため、後で修正する必要があります。 どちらの方法を使用する必要があります:A、B、または他の何か?

3
複数のオブジェクトとの衝突の場合の衝突解決
静的オブジェクトと可動オブジェクトがあります。衝突は、separating-axis-theoremを使用して検出されます。 たとえば、この状況では、2つの静的オブジェクト(赤)があります。 そして2つの間の可動オブジェクト: 私のアルゴリズムは、これらの2つのオブジェクト間の衝突を計算できます。また、衝突に対して完全な解像度ベクトル(最小変位ベクトル)を吐き出します。 したがって、たとえば、緑の長方形と右の赤の長方形の衝突をチェックすると、アルゴリズムは、衝突を解決するために緑の長方形を移動する方法を示すベクトルを吐き出します。 MSPaintでこれをすばやく描画したことに注意してください。そのため、その図では、minimum-translation-vectorが緑の長方形を上部に押し出している可能性がありますが、右は実際には短いです。 これにアプローチする一般的な方法は、一度にすべてではなく、フレームごとに1つの衝突の衝突を解決することです。しかし、私の場合、これはフリップフロップになります: 最初に、ソルバーは2つの衝突を検出しますが、右の長方形と緑の長方形の間の衝突のみを解決します。 次に、次のフレームで、左の赤い長方形と緑の長方形の間の衝突を1つだけ検出し、解決します。 ご覧のとおり、これは実際には衝突を解決しません(たとえば、緑色の長方形を一番上に押し出すことによって)。代わりに、2つの状態の間でフロップを無限にフリップします。 どうすれば解決できますか?

3
衝突検出は常にO(n ^ 2)ですか?
物理エンジンは、たとえば、互いに近くにあるオブジェクトをグループ化し、すべてのオブジェクトではなくこのグループ内の衝突をチェックすることにより、その複雑さを軽減できますか?(たとえば、他のオブジェクトからの速度と距離を調べることにより、遠いオブジェクトをグループから削除できます)。 そうでない場合、球体(3d)またはディスク(2d)の衝突は簡単になりますか?ダブルループを作成するか、代わりにペアの配列を作成する必要がありますか? 編集:弾丸やbox2dのような物理エンジンの場合、衝突検出はまだO(N ^ 2)ですか?

3
力との衝突の解決
2D物理エンジンでは、AABBとAABBの衝突を検出し、最短の貫通ベクトルを見つけてAABBの位置に追加することでそれらを解決できます。 これを行うと、最初のAABBが2番目のAABBの外側に「プッシュ」されますが、速度/加速度の変化はまったく処理されません。 シミュレーションに重力加速度を追加すると、最初の動的AABBの速度は、2番目の静的AABBの上にある場合でも増加し続けます。最終的に、速度が大きくなりすぎて衝突が検出されなくなります(動的なAABBは静的なAABBを通過します)。 解像度後に速度をゼロに設定しようとしましたが、明らかにうまく機能せず、非現実的なシミュレーションを作成しました。 オンラインで読んだところ、位置を手動で操作して衝突を解決したり、速度が正しくなかった。私は力を実装しようとしました(今のところ、質量は「ハードコードされた」1です): void Body::applyForce(sf::Vector2f mForce) { acceleration += mForce; } void Body::integrate(float mFrameTime) { velocity += acceleration * mFrameTime; position += velocity * mFrameTime; acceleration = {0, 0}; } 衝突の解決中に最短の貫通ベクトルを力として適用すると、動的なAABBは静的なものから「押し出され」ますが、その速度は重力のないシミュレーションでは決して低下せず、永遠に動き続けます。 「一時的な」力を適用する方法はありますか?最初のAABBを2番目のAABBから押し出し、その後AABBが衝突しなくなった時点で停止する力。 ここで利用可能なソースコード全体:https : //github.com/SuperV1234/SSVSCollision

5
順序が重要であり、衝突がオブジェクトグループに基づいて条件付けられる衝突エンジンを最適化するにはどうすればよいですか?
この質問が初めての場合は、以下の更新前の部分を最初に読んでから、この部分を読むことをお勧めします。 ただし、問題の統合は次のとおりです。 基本的に、衝突の順序と衝突グループが重要なグリッド空間分割システムを備えた衝突検出および解決エンジンがあります。一度に1つのボディを移動し、衝突を検出してから衝突を解決する必要があります。すべてのボディを一度に移動し、可能な衝突ペアを生成すると、明らかに高速になりますが、衝突の順序が尊重されないため、解像度が壊れます。一度に1つのボディを動かすと、ボディに衝突をチェックさせなければならず、^ 2の問題になります。グループをミックスに入れると、多くのボディで非常に速く非常に遅くなる理由を想像できます。 更新:私はこれに本当に一生懸命取り組みましたが、何も最適化することができませんでした。 Willによって記述された「ペインティング」の実装に成功し、グループをビットセットに変更しましたが、非常に小さなスピードアップです。 また、大きな問題を発見しました。私のエンジンは衝突順序に依存しています。 私はユニークな衝突ペア生成の実装を試みました。これは間違いなくすべてを高速化しますが、衝突の順序を破りました。 説明させてください: 私の元の設計(ペアを生成しない)で、これが起こります: 単一の体が動く 移動した後、セルを更新し、衝突したボディを取得します それが解決する必要があるボディとオーバーラップする場合、衝突を解決する つまり、ボディが移動して壁(または他のボディ)にぶつかった場合、移動したボディのみが衝突を解決し、他のボディは影響を受けません。 これが私が望む行動です。 物理エンジンでは一般的ではないことを理解していますが、レトロスタイルのゲームでは多くの利点があります。 通常のグリッド設計(一意のペアを生成)では、これが起こります: すべての体が動く すべてのボディが移動した後、すべてのセルを更新します 一意の衝突ペアを生成する 各ペアについて、衝突の検出と解決を処理します この場合、同時移動により2つのボディがオーバーラップする可能性があり、それらは同時に解決します。これにより、ボディは事実上「互いに押し合い」、複数のボディとの衝突安定性が損なわれます。 この動作は物理エンジンでは一般的ですが、私の場合は受け入れられません。 また、別の問題も発見しました。これは重大です(実際の状況では起こりそうにない場合でも)。 グループA、B、Wのボディを検討する AはWとAに衝突して解決します BはWとBに対して衝突して解決します AはBに対して何もしません BはAに対して何もしません 多くのAボディとBボディが同じセルを占有する場合があります-その場合、ボディ間で不必要な反復が多く、相互に反応してはなりません(または衝突を検出するだけで解決しない) 。 同じセルを占める100体の場合、100 ^ 100回の反復です!これは、一意のペアが生成されていないために発生しますが、一意のペアを生成できません。そうしないと、望ましくない動作が発生します。 この種の衝突エンジンを最適化する方法はありますか? これらは尊重されなければならないガイドラインです: 衝突の順序は非常に重要です! ボディは一度に1つずつ移動し、次に衝突を1つずつ確認し、移動後に1つずつ解決する必要があります。 ボディには3つのグループビットセットが必要です グループ:ボディが属するグループ GroupsToCheck:ボディが衝突を検出する必要があるグループ GroupsNoResolve:ボディが衝突を解決してはならないグループ 衝突を検出するだけで解決しない場合があります 事前更新: はじめに:このボトルネックを最適化する必要はないことを認識しています-エンジンは既に非常に高速です。しかし、楽しくて教育的な目的で、エンジンをさらに高速にする方法を見つけたいと思っています。 柔軟性と速度に重点を置いて、汎用C ++ 2D衝突検出/応答エンジンを作成しています。 そのアーキテクチャの非常に基本的な図を次に示します。 基本的には、メインクラスWorld所有している、の(メモリ管理)ResolverBase*、SpatialBase*およびvector<Body*>。 …

5
特定のコンテキストでいくつかのオブジェクトとの衝突を無視する
私はUnityで車を使ってレースゲームを作っています。車にはブースト/ニトロパワーアップがあります。ブースト中、ゾンビと衝突するときは逸脱したくありませんが、壁と衝突するときは逸脱したいと思います。 一方、私はゾンビとの衝突を無視したくありません。なぜなら、私はゾンビを衝突時にヒットさせたいからです。 これをどのように処理すればよいですか?基本的に、特定のオブジェクトと衝突したときに車が回転しないようにしたいです。

2
高速オブジェクトが壁を通過できないように衝突検出を処理するにはどうすればよいですか?
2D横スクロールシューティングゲームを作成していますが、弾丸の衝突検出に少し問題があります。箇条書きを含むすべてのものは、独自のポリゴン/更新メソッドを持つオブジェクトです。 問題は、弾丸が速くなり、60フレーム/秒(ゲームの実行速度)で弾丸が壁をすぐにスキップすることです(更新間隔中に壁の幅を超えて移動するため)。ポリゴンが実際に重複することは決してないので、順調に進んでください。 これについて何ができますか?私が思いついた唯一のことは、古い位置から新しい位置に線を引き、その上で衝突検出を行うことですが、衝突検出のための線描画はslick2dのドキュメントでは推奨されていません。どうすれば解決できますか?

6
等尺性衝突検出を処理するにはどうすればよいですか?
等尺性のランジャンプスタイルのプラットフォーマーを作成したいと思います。プレイヤーは、床の上のプラットフォームの上にジャンプしたり、オブジェクトの側面にぶつかったりできる必要があります。 2Dゲームエンジンを使用するので、使用していないディメンションの完全な3Dコリジョンをエミュレートしたくありません。 ゲーム内のオブジェクトは、X、Y、幅、高さ、および深さのZを使用して配置する必要があると考えています。 これらの値を使用して、衝突をどのように検出する必要がありますか?

2
Time.deltaTimeを使用しているにもかかわらず、動きはフレームレートに依存しているように見える
Unityでゲームオブジェクトを移動するために必要な変換を計算する次のコードがありますLateUpdate。これはで呼び出されます。私が理解していることから、私の使用はTime.deltaTime最終的な翻訳フレームレートを独立させるべきCollisionDetection.Move()です(ただレイキャストを実行することに注意してください)。 public IMovementModel Move(IMovementModel model) { this.model = model; targetSpeed = (model.HorizontalInput + model.VerticalInput) * model.Speed; model.CurrentSpeed = accelerateSpeed(model.CurrentSpeed, targetSpeed, model.Accel); if (model.IsJumping) { model.AmountToMove = new Vector3(model.AmountToMove.x, model.AmountToMove.y); } else if (CollisionDetection.OnGround) { model.AmountToMove = new Vector3(model.AmountToMove.x, 0); } model.FlipAnim = flipAnimation(targetSpeed); // If we're ignoring gravity, then just …

2
多くの小さな三角形で作られたオブジェクトの衝突検出をどのように実行しますか?
どんな形状でも小さな三角形で作成(または近似)できることを理解しています。2つの小さな三角形で任意の長方形を作成できます。多くの薄い「ピザのスライス」三角形によって、任意の円を作成できます。これはどのように衝突検出に変換されますか? 頂点を使用して長方形の重なりを計算する方法を理解しています。中心、半径、距離を使用して円の重なりを計算する方法を理解しています。 しかし、小さな三角形で作られた形状の衝突検出はどのように行いますか?仕様ではなく、一般的な概念...

4
より高速な2D衝突検出
最近、ペースの速い2Dシューティングゲームに取り組んでいますが、大きな問題に遭遇しました。衝突検出。確かに、動作していますが、非常に遅いです。私の目標は、画面上に多くの敵を配置し、お互いに触れないようにすることです。すべての敵がプレイヤーエンティティを追いかけています。それらのほとんどは同じ速度を持っているので、遅かれ早かれ、プレイヤーを追いかけている間にすべて同じスペースを取ることになります。プレイヤーにとっては、1人の敵だけに追われているように見えるので、これは本当に楽しい要素を減らします。彼らが同じスペースを取るのを防ぐために、衝突検出(非常に基本的な2D検出、私が知っている唯一の方法)を追加しました。 Enemy class update method Loop through all enemies (continue; if the loop points at this object) If enemy object intersects with this object Push enemy object away from this enemy object これは正常に機能します。敵のエンティティが200未満である限り。300〜350の敵エンティティに近づくと、フレームレートが大幅に低下し始めます。最初にレンダリングが悪いと思ったので、描画呼び出しを削除しました。これはまったく役に立ちませんでしたので、もちろん、それが更新方法であることに気付きました。更新方法の唯一の重い部分は、この各敵ループから全敵の部分です。300人の敵に近づくと、ゲームは90000(300x300)ステップのイタレーションを行います。私の〜 私はこの衝突検出にアプローチする別の方法があるに違いないと確信しています。方法はわかりませんが。私が見つけたページは、2つのオブジェクト間の衝突を実際に行う方法、またはオブジェクトとタイル間の衝突をチェックする方法に関するものです。私はすでにこれらの2つのことを知っています。 tl; dr?エンティティのロット間の衝突検出をどのようにアプローチしますか? クイック編集:助けになる場合は、C#XNAを使用しています。

3
物理エンジンで同時衝突を処理する最良の方法は何ですか?
ビデオゲームの物理学についてさらに学ぶために、JavaScriptで2D物理エンジンを書いています。リジッドボディの衝突に対して正しく動作しますが、ボディが同時に2つ以上の他のボディと衝突する場合を除きます。 現在、衝突体の各ペア(A、B)について、衝突インパルスに基づいて速度と角速度を変更し、それらが互いに貫通しないように微調整します。ただし、Aを含む他の衝突の衝突検出とインパルス計算は間違っています。 互いに衝突する3つ以上のオブジェクトに対してエンジンを機能させるためにどのようなアプローチを検討できますか?

1
タイルマップの上に複雑な衝突領域を定義するにはどうすればよいですか?
多くの人が推奨しているように、私はTiledマップエディターを使用してゲーム用のマップを作成していますが、特にlibgdxフレームワークはTiledのマップ用のAPIを提供しているので素晴らしいです。 マップエディターで衝突可能なタイルを定義できるかどうかを定義できるため、コード内の衝突に対処できます。しかし、現在、タイルを衝突可能領域と衝突不可能領域に分割する必要がある状況にあります。手動で、2つの領域の境界のポイントとラインを定義し、プログラムでそれを処理できると思います。しかし、それは多くの時間のかかる仕事です。 それで私はたくさんのグーグルでこの物理ボディエディタを見つけました。これは、上記のプロセスを自動化するための素晴らしいツールのようです。ただし、システムは展開された各イメージで動作し、その操作のためにイメージを展開しても動作するかどうかはわかりません。 衝突領域を定義するこのプロセス全体を実行するより良い方法があるのだろうか。どんな提案も大歓迎です。

3
2Dゲームのコリジョンレスポンス:特定の軸に沿ったSATと最小変位?
作成中の2Dゲームに衝突システムを実装しようとしています。分離軸定理(metanetのコリジョンチュートリアルで説明されている)は、衝突検出を処理する効率的で堅牢な方法のように見えますが、私は彼らが使用するコリジョンレスポンスメソッドがあまり好きではありません。オーバーラップが最小の軸に沿って盲目的に移動することにより、アルゴリズムは移動するオブジェクトの前の位置を単純に無視します。つまり、静止オブジェクトに進入して跳ね返るまで静止オブジェクトと衝突しません。 これが重要な状況の例を次に示します。 上記のSATメソッドによれば、長方形は斜辺に垂直な三角形から単純に飛び出します。 ただし、現実的には、長方形は三角形の右下隅で停止する必要があります。これは、変位ベクトルに沿って連続して移動している場合の最初の衝突点になるためです。 さて、これは実際にゲームプレイ中は重要ではないかもしれませんが、この方法で正確かつ一般的に正確な変位を達成する方法があるかどうかを知りたいです。私は過去数日間、頭を悩ませてきましたが、まだあきらめたくありません! (StackOverflowからクロスポストされ、ルールに反しないことを願っています!)

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