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

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

1
2D物理エンジンで、オブジェクトが静止したときに不要な衝突解決を回避するにはどうすればよいですか?
love-2dを使用して(学習用に)開発している物理エンジンで、衝突解決を次のように実装しました。 FixedUpdate(dt) // I use fixed timestep foreach collide c1 in allNotStaticColliders c1.integartePhysic // i.e. apply gravitational force.. foreach collider c2 "near" c1 // "near"= I use spatial hashing if collide(c1,c2) resolve collision (c1,c2) // the heavy operation collison callbacks c1 collison callbacks c2 ... gifアニメーションの最後にあるように、すべてのコライダーが静的オブジェクトにほぼ固定されている場合は、FPSの減衰があります。 これは、オブジェクトが落ち着くまでの接触時間を長くすると、衝突解決の数が増えるためです。ただし、オブジェクトはすでに互いに安定した位置に落ち着いているため、計算の多くは「役に立たない」ものです。 これらの「役に立たない」衝突検出を回避するためのベストプラクティスは何ですか(できれば物理学の学位を必要としないでしょう)。 編集:DMGregoryのヒントを受け入れ、この結果になります(まだ最適ではありません) (赤=静的、青=アクティブ、緑=スリープ)

1
LibGDX 3Dで衝突イベントを発生させるにはどうすればよいですか?
以下のコードには、やりたいことの例を示しています。カメラを持っているのですが、ボックスにぶつかったときにカメラの動きを止めたいのですが、どうすればよいですか? public class Main extends ApplicationAdapter { private final ModelBuilder builder = new ModelBuilder(); private final Environment environment = new Environment(); private ModelBatch modelBatch; private PerspectiveCamera camera; private Model model; private ArrayList<ModelInstance> instance = new ArrayList<ModelInstance>(); private FirstPersonCameraController controller; private BoundingBox[] boxBounds = new BoundingBox[1000]; private BoundingBox cameraBox = new …

1
複数のポリゴンで軸定理を分離していますか?
C#で分離軸の定理を実装しようとしています。2つのポリゴン間の最小並進ベクトルを計算できる関数があります。ただし、1つのポリゴンと他の複数のポリゴンの間の最小並進ベクトルを計算する関数を作成できないようです。正直なところ、私は何ヶ月もこれに取り組んできましたが、解決策に近づいておらず、オンラインで解決策を見つけることができませんでした。常に正しい結果を返さないエッジケースがいくつかあり、私のゲームで優先度の高いバグが発生します。 以下は、正常に機能しない一般的なエッジケースです。 この問題のよく知られた解決策はありますか?私が見つけることができるのは、「各ポリゴンでSATを実行するだけ」と言っている人たちだけですが、これが最小の並進ベクトルを生成することはめったにありません。 任意の助けをいただければ幸いです。

2
Rectangle.Intersects()から衝突の詳細を取得する
私はある時点で、次のようなものでボールとパドルの衝突を検出するブレイクアウトゲームを持っています。 // Ball class rectangle.Intersects(paddle.Rectangle); 現在との衝突の正確な座標、またはそれに関する詳細を取得する方法はありますXNA APIか? 衝突の瞬間に各オブジェクトの正確な座標を比較するなど、いくつかの基本的な計算を行うことを考えました。次のようになります。 // Ball class if((rectangle.X - paddle.Rectangle.X) < (paddle.Rectangle.Width / 2)) // Collision happened on the left side else // Collision happened on the right side しかし、これが正しい方法かどうかはわかりません。 皆さんは私がそれを達成するために使用しなければならないかもしれないエンジンについて何かヒントがありますか?または、この方法を使用した優れたコーディング慣行ですか?

5
ピンボールゲームの2D衝突検出
これまでのゲームでは、ボックスとの単純な2D衝突を使用してから、ピクセルレベルで衝突をチェックしました。 ほぼ多数のフレームでピンボールゲームを作成する場合、ボールは壁または別の表面に接触するため、別のアプローチはありますか?

1
gluLookAtはどのように機能しますか?
私の理解から、 gluLookAt( eye_x, eye_y, eye_z, center_x, center_y, center_z, up_x, up_y, up_z ); 以下と同等です。 glRotatef(B, 0.0, 0.0, 1.0); glRotatef(A, wx, wy, wz); glTranslatef(-eye_x, -eye_y, -eye_z); しかし、ModelViewマトリックスを出力すると、への呼び出しがglTranslatef()正しく機能していないようです。コードスニペットは次のとおりです。 #include <stdlib.h> #include <stdio.h> #include <GL/glut.h> #include <iomanip> #include <iostream> #include <string> using namespace std; static const int Rx = 0; static const int Ry …


4
円衝突内の円
私のプロジェクトの1つに、円形のゲームエリアがあります。この円の中に別の小さな円が動き回っています。私がしたいのは、小さな円が大きな円の外に移動しないようにすることです。下のフレーム2では、小さな円の一部が外側にあることがわかります。外側に移動する直前に戻す方法が必要です。これはどのように行うことができますか? また、小さな円の速度を更新できるように、大きな円の円弧に沿った衝突点が必要です。この点を計算するにはどうすればよいでしょうか? 小さな円を移動する前に、次の位置を予測し、それが外にある場合は、t = 0とt = 1(t = 1フルタイムステップ)の間の衝突時間を見つけます。衝突時間tがある場合、フルタイムステップではなく、tの間に小さな円を移動するだけです。しかし、繰り返しになりますが、問題は、2つの円ともう1つの円の内側に衝突したときに衝突が発生したときに、その検出方法がわからないことです。 編集: 衝突点の例(緑)見つけたい。たぶん写真は少しずれているかもしれませんが、あなたはアイデアを得ます。

8
プラットフォーマーのキャラクターが壁のタイルでクリッピングしないようにするにはどうすればよいですか?
現在、私は地形のタイル(Cave Storyから借りたグラフィック)を備えたプラットフォーマーを持っています。ゲームはXNAを使用してゼロから作成されているため、既存のエンジンや物理エンジンは使用していません。 タイルの衝突はこの回答で説明されているとおりに正確に説明され(長方形と円の単純なSATを使用)、すべてが正常に機能します。 落下/ジャンプ中にプレーヤーが壁にぶつかった場合を除きます。その場合、彼らはタイルに引っ掛かり、実際にはない床や天井にぶつかったと思い始めます。 このスクリーンショットでは、プレーヤーは右に移動しており、下に落ちています。したがって、移動後、衝突がチェックされます-そして最初に、プレイヤーキャラクターが床から3番目のタイルに衝突し、上に押し出されていることがわかります。第二に、彼は自分の隣のタイルと衝突して横に押されていることがわかりました-最終的にプレイヤーキャラクターは自分が地面にいて落下していないと考え、タイルに走っている限り「キャッチ」します。 。 タイルを上から下に定義することでこれを解決でき、スムーズに落下しますが、逆のケースが発生し、壁に上向きにジャンプすると、そこにない天井にぶつかります。 これを解決して、プレイヤーキャラクターが壁に沿って落下するようにするにはどうすればよいですか?

2
非常にシンプルな3Dレーシングゲームでは、衝突はどのように処理されますか?
いくつかのシンプルな3Dカーレーシングゲーム(特にOutrun 2 / Motoracerなどのゲーム)で衝突がどのように行われるのか疑問に思いました。 複雑な環境(オープンワールド)のクラシックカーレーシングゲームでは、これは基本的なボックス(車用)から飛行機の衝突(トラック、建物など)で行われると思います。全体は、いくつかのバウンディングボックスを使用して最適化されます(これは、多くのゲームで衝突が行われる方法です)。 Outrun 2 / Motoracerのようなゲームでは、ゲームプレイは非常にシンプルなので、開発者はそれを必要としない可能性があり、すべてが大幅に簡略化されている可能性があります。それをプレイしたことがない人のために、これはとても具体的です: 車/バイクは常に道路に接着されています。 道路は常に同じサイズで、非常にシンプルな形状です。 唯一の可能性は、その道路をたどること、道路を離れること、または他の物と衝突することは不可能です(他の車/バイクを除いて、私たちは気にしません)。 あなたが道路に衝突すると、非常に基本的なアーケードの衝突が行われます(車は単にそこから押し出されます) これが衝突が起こったと思う方法です: トラック全体は、巨大な3Dベジェ曲線と見なすことができます。そのカーブから、道路のポリゴンを生成できます(カーブから生成された前面、左、上方向のベクトルを使用)。他の要素(家、木など)も、この方法を使用して配置および整列できます。 次に、衝突を処理する(そして車を引く)には: 1)現在の車の3D位置から3Dカーブ上の最も近い位置を見つけます。つまり、3D車の位置をベジェカーブの位置に変換します。道路上のすべての3D位置は、3Dカーブに沿った変位(t)+横変位(d)と見なすことができます。はっきりしない場合は、下の画像を確認してください(これは2Dの例ですが、3Dにも簡単に当てはまります)。 t = 0の場合、トラックセクションの先頭にあり、t = 1の場合、末尾にあります。d = -1または1台の車がトラックの境界にある場合、d = 0台の車が道路の真ん中にある場合 2)を用いて道路に車を位置合わせtし、d(非常に簡単:いずれかのt及びd値iは3D位置+アップ/正面/左ベクトルを得ることができます)。車は今道路に接着されています 3)d車の横変位を確認します。値が大きすぎる場合(d > 1)や低すぎる場合は、(d < -1)車が軌道から外れています。クリップして、車を正しい場所に置いてください。 これにより、3Dカリングも非常に簡単になり、現在の車のt位置からまでトラックを描くだけt + some_big_enough_value_to_avoid_visible_clippingです。 あるいは、私が完全に間違っているかもしれません。車の衝突(境界ボックス)と、トラックを表す非常に簡略化されたポリゴンのセット(建物などなし)をチェックするだけの方が、はるかに速く簡単でした。3Dワールド(および結果のコリジョンモデル)は、いくつかのサードパーティツール(ゲームの実行時に3Dカーブはなく、一連のポリゴンのみ)を使用して、以前に単純に生成されていました。

3
球と平面の間の衝突応答を計算するにはどうすればよいですか?
シンプルな3Dゲームを作成しようとしています。ゲームの世界の制限内でプレーヤーを制限する必要があります。プレイヤーが世界の側面にぶつかったとき、プレイヤーの船を少し跳ね返らせたいです。 事実、私はプレイヤーをボックス内に閉じ込め、側面から逃げるのを止めようとしています... ゲームワールドの限界を、法線と原点からの距離を持つ平面のコレクションとして定義できました。プレーヤーには球形の境界球があり、このウェブサイトhttp://www.gamasutra.com/view/feature/3383/simple_intersection_tests_for_games.phpから衝突を検出することができました。 衝突が検出されたときにどうすればよいのか、私はまったく理解できません。私が管理できる最高の方法は、プレイヤーが飛行機に詰まっている、まっすぐ進む、または非常に速い速度で繰り返し跳ね返ることです。 常識では、法線を使用して平面からの反射角度を計算し、それをプレーヤーの速度に適用する必要があると言われていますが、まず、プレーヤーが平面を通過したかどうかを確認する必要があります。いい結果になる。

4
n個のオブジェクトのシステムの衝突チェック効率を上げる方法はありますか?
多くの画面上のオブジェクトで構成されるゲームを作成しています。その1つがプレーヤーです。どの反復でもどのオブジェクトが衝突しているかを知る必要があります。 私はこのようなものを作りました: for (o in objects) { o.stuff(); for (other in objects) if (collision(o, other)) doStuff(); bla.draw(); } これにはO(n ^ 2)があり、これは悪いと言われています。これをより効率的に行うにはどうすればよいですか?私はこれをJavascriptで行っています、そしてnは通常30より低くなります、これが同じままなら問題になりますか?

2
ポイントが2つの平行線の間にあるかどうかをテストするにはどうすればよいですか?
私が設計しているゲームでは、原点からマウスの方向に向かって爆発する爆発があります。この爆風の幅は常に同じになります。 画面の下部(現在のもの)に沿って正方形が移動します。正方形は、プレーヤーが制御する爆風の影響を受けます。 現在、私はこれらの正方形の角が爆風の2つの境界線内にあるかどうかを見つける方法を模索しています。これを行う最善の方法は、爆風が完全に水平であるかのように原点の周りに正方形の角を回転させ、角のY値が爆風の幅以下であるかどうかを確認することであると考えました彼らは影響を受ける地域内にあることを意味しますが、私は解決できません

3
多くの正方形のタイルベースの効率的な衝突検出?
現在私はタイルベースのゲームの独自のテイクに取り組んでいます(Terrariaを考えてくださいが、空想的ではありません(それは言葉だと思いますか?そうでない場合は申し訳ありません))。 とにかく、私は現在、衝突検出が機能しています(コーナーケースの場合でも!)。これは私にとって大きな一歩でした。スプライトがブロックを通過しないのを見るのは非常にうれしいことです。しかし、それから私はベンチマークするという考えを持っていました。悪いアイデア。 1,000平方、問題ありません。10,000の正方形、3つの文字は少し遅れました。3文字で100,000の正方形(本当に巨大な地図)はプレイできませんでした。 プレイヤー、キャラクター、アイテムなどから遠すぎるブロックも考慮したくないという問題がありますが、それらを常にメモリからロードしたくありません。 ここまでが私のアルゴリズムです。自由に非難してください。 foreach (Block in level) { if (distance from block to player > a specified amount) ignore this block; else { get the intersection depth between the two bounding boxes if (depth of intersection != Zero-vector) { check y size vs x size resolve on smallest …

2
AABBの衝突によるプラットフォームジャンプの問題
最初に図を参照してください。 私のAABB物理エンジンが交差を解決するとき、ペネトレーションが小さい方の軸を見つけてそれを行い、その軸上のエンティティを「押し出し」ます。 「左に移動」の例を考えてみましょう: VelocityXがVelocityYよりも大きい場合、AABBはエンティティをY軸上に押し出し、ジャンプを効果的に停止します(結果:プレイヤーは空中で停止します)。 velocityXがvelocitY(図には示されていません)よりも小さい場合、AABBがエンティティをX軸上に押し出すため、プログラムは意図したとおりに機能します。 この問題を解決するにはどうすればよいですか? ソースコード: public void Update() { Position += Velocity; Velocity += World.Gravity; List<SSSPBody> toCheck = World.SpatialHash.GetNearbyItems(this); for (int i = 0; i < toCheck.Count; i++) { SSSPBody body = toCheck[i]; body.Test.Color = Color.White; if (body != this && body.Static) { float left = (body.CornerMin.X - …

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