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

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

2
2D AABBと複数の衝突の解決
わかりました、これは私がかなり長い間理解しようとしてきた問題です。Mineは2Dプラットフォーマーゲームで、ワールドは(通常)不動のタイルとモバイルスプライトで構成され、どちらもAABBを使用してヒットボックスを表します。このゲームは、タイルのレイヤーの移動に伴う複雑さのため、グリッドベースではありません。 衝突を検出し、衝突の深さを簡単に把握できます。「最短軸メソッド」を使用して、スプライトとタイルの間の衝突を解決する方法を決定します。スプライトが垂直よりも水平に深い場合、解決する方向は上または下になります。スプライトが水平よりも垂直に深い場合、解決する方向は左または右です。 これは非常に単純で、かなりうまくいきます。つまり、スプライトが複数のタイルと衝突するまでです。その性質上、各衝突は個別にチェックする必要があるため、衝突が異なると解決する方向も異なる場合があります。たとえば、スプライトがタイルの行を横切って移動しようとしている場合、1つのフレームで次のタイルと交差します。水平深度が垂直深度よりも短いこと。衝突が「左に解決」と言っているので、それは押し戻され、コーナーにスタックします。 私はかなり長い間この問題を何度も何度も検討してきましたが、いくつかの解決策が思い付きましたが、すべてに欠陥があります。特定の側面を到達不能としてマークすることもできますが、グリッドベースのエンジンがないと、「到達不能」の判定は非常に複雑で、特にタイルのレイヤーの移動は常に可能です。 別の可能な方法は、衝突が発生する前に衝突を予測し、衝突のポイントまで移動を「ワークバック」することですが、私はその数学がどのように機能するのかわかりません。 特に80年代のゲームはすでにこの問題を解決しているので、私には信じられないほど明白なものが欠けているように感じます。

1
PhysXを使用して、手続き型地形衝突形状を生成する必要がある場所を予測するにはどうすればよいですか?
この状況では、手順で生成した地形の高さの値があります。レンダリングでは、カメラの位置を使用して適切なサイズの高さマップを生成します。ただし、衝突の場合は、オブジェクトが交差する可能性のある領域に高さフィールドを生成する必要があります。 私の現在の潜在的な解決策は、素朴かもしれませんが、すべての「覚醒」物理アクターを反復処理し、それらの境界/範囲と速度を使用して、物理更新後にそれらが存在する球を生成し、クラスター化されたグループを含む範囲の高さ値を生成することです俳優の。ただし、そのデータの多くは、すでにPhysXによってすでに計算されている可能性があります。 地形の高さの値が必要になる場所を予測するために使用できるAPI、おそらくクエリのセット、または空間システムからのコールバックはありますか?

3
ボール対45度のスロープ衝突検出
プレーヤーがボールを動かす簡単なゲームがあります。ボールは壁から跳ね返ります。現在、正方形の壁が実装されています(■)。単純な境界ボックスの衝突を使用して、xまたはyの速度を更新するときにプレーヤーが壁に移動するかどうかを確認し、そうであれば、速度に-1を掛けて跳ね返らせます。 ただし、三角ピース(◢◣◤◥)も実装したい。立ち直るには、次のように使用できると思います。 newxspeed = -1*yspeed; newyspeed = -1*xspeed; しかし、私が問題を抱えているのは衝突検出です。プレイヤーはいつ対角線を攻撃しますか?

3
再利用可能なトップダウン衝突クラス
私は最近、モノゲームを始めて、簡単なトップダウンゲームに取り組んでいます。 マウスを追跡するための動きと回転を整理しましたが、衝突に悩まされています。 私が知りたいのは、基本的に次の2つです。 衝突を処理する最良の方法は何でしょうか?Rectangle.Intersects(Rectangle1, Rectangle2)重なり合う四角形が返されることはわかっていますが、上から下への移動はx / y軸上にあるため、衝突が発生している場所を知りたいので、プレーヤーが取得しないような「壁のスライド」を作成できます壁で立ち往生。 プレーヤーのx / y座標をソリッドオブジェクトの座標と照合して確認し、ソリッドオブジェクトの境界に入る場合は、プレーヤーを以前の位置にスローしますか?あなたは何を提案しますか? すべてのソリッドやnpcなどに衝突を適用する最良の方法は何でしょうか?私は現在gameObject、すべてのオブジェクトが継承するクラスを作成し、そこで衝突を処理することを考えています。 読んでくれてありがとう、誰かが私にいくつかのヒントをくれることを願っています。

3
AABBを使用した衝突検出の問題
メインゲームスプライトとさまざまなプラットフォームの間にAABBを使用して、単純な衝突検出ルーチンを実装しました(以下のコードを参照してください)。それは素晴らしい働きをしますが、私は今、私のキャラクターを倒すために重力を導入しています、そしてそれは私のCDルーチンでいくつかの問題を示しています。 問題の核心は、私のCDルーチンがスプライトを他のスプライトにほとんど浸透していない軸に沿って戻すことです。したがって、XよりY軸の方が大きい場合は、X軸に沿って移動します。 しかし、今私の(ヒーロー)スプライトはフレームあたり30ピクセルの速度で落ちています(それは1504の高画面です-「通常の」重力をシミュレートしたいので、これだけ速く落ちる必要があります。 )これらの問題が発生しています。私は何が起こっているのか(そして私がそれを引き起こしていると考えていること-よくわかりません)をいくつかの写真で示します(写真の下のコード)。 この問題を回避する方法についていくつかの提案をいただければ幸いです。 明確にするために、上の右の図で、位置が「誤って」修正されていると言うと、少し誤解を招く可能性があります。コード自体は、それがどのように書かれているのか、つまり別の言い方をすると、アルゴリズム自体が正しく機能します。期待どおりに動作する場合はアルゴリズム自体ですが、この問題の発生を防ぐために動作を変更する必要があります。画像内のコメントを明確にしてください。 私のコード public boolean heroWithPlatforms(){ //Set Hero center for this frame heroCenterX = hero.xScreen+(hero.quadWidth/2); heroCenterY = hero.yScreen+(hero.quadHeight/2); //Iterate through all platforms to check for collisions for(x=0;x<platformCoords.length;x+=2){ //Set platform Center for this iteration platformCenterX = platformCoords[x]+(platforms.quadWidth/2); platformCenterY = platformCoords[x+1]+(platforms.quadHeight/2); // the Dif variables are the difference …

1
Box2Dでは、特定のボディの圧縮力を取得するにはどうすればよいですか?
Box2Dを使用しています。ご覧のとおり、互いに接続された3つの動的ボディがあります(正面から見ると、テーブルと考えてください)。LEG1とLEG2は静的ボディに接続されています(これは接地ボディです)。別の動的ボディがテーブルに落ちています。 LEG1とLEG2で別々に圧縮を取得する必要があります。 ジョイントにはGetReactionForce()を返す関数がありb2Vec、これはLength()とLengthSqd()関数を持っています。これにより、取得した関節の力の合計が得られます。しかし、私が必要としているのは、関節とつながっている個々の体の力です。単一のジョイントで複数のボディを接続すると、役に立たない力の合計が再び表示されます。これが私が話しているケースです:

1
衝突チェックのために2つの高速移動オブジェクトを送信する必要があるかどうかの判断
基本的な2D物理エンジンを実行しています。これはほとんどパーティクルエンジンであり、AABBや円などの基本的な形状を使用するだけなので、回転はできません。私はCCDを実装しており、2つの高速移動オブジェクトに正確なTOIを与えることができ、すべてがスムーズに機能しています。 今の私の問題は、最初に2つの高速移動オブジェクトを互いにチェックする必要があるかどうかを判断する方法を理解できないことです。空間分割と高速移動オブジェクトごとに四分木を使用しています。通過する各セル内のオブジェクトと照合します。これは、静的なジオメトリとの衝突を決定するのにうまく機能しますが、衝突する可能性があるが、チェックされているセルのいずれにもない他の高速移動オブジェクトは考慮されないことを意味します。 私が考えることができる唯一の解決策は、セルを十分に大きくして、これで十分であるフィンガーをクロスさせるか、ある種のブルートフォースアルゴリズムを実装することです。これに対処する適切な方法はありますか、おそらく誰かがこの問題を効率的な方法で解決しました。それとも、これを説明するスペースを分割するより良い方法があるでしょうか? ここに図があります: オブジェクトAとBの「影響範囲」が交差しているため、それらを相互にチェックする必要があります。しかし、現在衝突をチェックしている方法では、これは考慮されていません。繰り返しになりますが、速度がxまたは何かよりも高くなったときにオブジェクトのパスが交差するかどうかを実際にチェックするなど、これに対するいくつかの解決策を考えることができますが、それはハックのように感じ、試行錯誤します。

3
3D空間で衝突検出を実行するにはどうすればよいですか?
要約すると、今学期の最初から完全な3Dゲームを書く必要があります。今までのところ、私は自分の暇な時間に2Dゲームだけをプログラミングしていました。移行は難しくなく、ゲームはシンプルです。私の唯一の問題は、衝突検出です。私が見つけることができた唯一のものは、AABB、境界球、またはさまざまな物理エンジンの推奨事項でした。洞窟システム内を自由に移動する潜水艦をプログラムする必要があります。物理ライブラリを使用できないので、上記のいずれも私の問題を解決しません。 これまでは、衝突検出にSATを使用していました。同様の優れたアルゴリズムはありますが、3D衝突用に作られていますか?私は八分木や他の最適化について話しているのではなく、3Dポリゴンの1つのセットと別の3Dポリゴンのセットの直接衝突検出について話している。SATを2回使用して、メッシュを上と横から投影することを考えましたが、3D空間を凸形状に分割するのも難しいようです。また、それはoctreesを使ったとしても、あまりにも多くの計算のように思えます。 専門家はそれをどのように行うのですか?誰かがいくつかの光を当てることができますか?

2
ピクセルパーフェクトな衝突検出を回転で処理するにはどうすればよいですか?
誰かがAndroidでビットマップを使用して回転ピクセルパーフェクト衝突検出を達成する方法について何かアイデアを持っていますか?それとも一般的にはそれについてですか?私は現在ピクセル配列を持っていますが、任意の度数に基づいてそれらを操作する方法がわかりません。

1
平面と点が与えられた場合、点が平面のどちら側にあるかをどのように判断できますか?
ポイントを考えると Vector pos = new Vector(0.0, 0.20156815648078918, -78.30000305175781, 1.0); と平面(三角形) Vector a = new Vector(-6.599999904632568, 0.0, -78.5, 1.0); Vector b = new Vector(6.599999904632568, 0.0, -78.5, 1.0); Vector c = new Vector(6.599999904632568, 4.400000095367432, -78.5, 1.0); の方向を指す平面法線を取得したい pos //Getting plane normal Vector ac = Vector.Subtract(a,c); Vector bc = Vector.Subtract(b,c); Vector planeNormal = …

1
衝突点を見つける
2D剛体シミュレータを書いています。シミュレートされるオブジェクトは凸状のポリゴンです。私の質問には、衝突の「ポイント」をどのように決定するかが含まれているため、応答力を適用すると、トルクも計算できます。 2Dでは、ナローフェーズコリジョン検出の一般的な方法は、分離軸定理のようです。ただし、これにより「衝突するのか」ということになります。「どれだけ?」と同様に、応答力を適用する(したがってトルクを計算する)基準点(私が知っている)は提供されません*。 もう1つの方法(これは3Dで使用されるため、これにも興味があります。これが論理的な次のステップになります)は、2つのポリゴンのミンコフスキー差を計算し、(0,0)が結果のポリゴンに含まれます。しかし、これをどのように使用して、応答力を適用する相対点を決定しますか?私の仮説は、この違いの各面はポリゴンの1つの面に事実上対応しているため、分離距離は(0,0)からMDまでの最短距離であり、これをポリゴンの対応する面に適用するとします。 。 おまけとして、3Dでこれをどのように行うのですか? *これを書いているときに、SATを使用するときに、どのポイントが重複しているかを追跡し、それらのポイントの「平均」で力を適用できることに気づきました。しかし、私はこの小さなトリックを実行するためにいくつかの非分離軸のどれを決定する必要があります...

1
タイルベースの2D衝突検出の問題
このチュートリアルhttp://www.tonypa.pri.ee/tbw/tut05.htmlに従って、タイルベースの世界でリアルタイムの衝突を実装しようとしています。 これらのプロパティのおかげで、エンティティの中心座標がわかります。 public float CenterX { get { return X + Width / 2f; } set { X = value - Width / 2f; } } public float CenterY { get { return Y + Height / 2f; } set { Y = value - Height / 2f; } } …

3
2D AABB vs AABB Sweep:ヒットノーマルの計算方法は?
2D AABBvsAABBスイープキャストをゲームに実装しましたが、スイープキャストのヒットノーマルを計算するのが困難です。 AとBの両方のAABB位置とxy min-maxのスイープ方向があり、動作する最初と最後のヒット時間はありますが、衝突エッジまたは法線方向はありません。この特定の問題に対する効率的な解決策を概念化することはできません。何か案は?:) *編集 これは私がこれまで持ってきたものです- ゴメスとクリスター・エリクソンの AABBスイープの単なる一般的な実装です。通常のヒットはないので、通常の計算は私には謎ですが、キャラクターコントローラーに対して衝突応答を生成することはできません。 bool SweepVelAABBvsAABB(AABB a, AABB b, Vector2 v, out Vector2 outVel, out Vector2 norm ) { outVel = v; //Initialise out velocity norm = Vector2.zero; if( AABBvsAABB(a,b) ) return true; //return early if a,b overlap v = -v; float hitTime = 0.0f; float …

4
2Dプラットフォーマーの衝突処理
2Dプラットフォーマー(マリオタイプ)ゲームを作成しようとしていますが、衝突の適切な処理に問題があります。私はこのゲームをC ++で書いており、入力、画像の読み込み、フォントの読み込みなどにSDLを使用しています。また、グラフィックを表示するためにSDLと組み合わせてFreeGLUTライブラリを介してOpenGLを使用しています。 私の衝突検出方法は、AABB(Axis-Aligned Bounding Box)です。必要なのは、衝突が発生した側を検出し、衝突を適切に処理する簡単な方法です。したがって、基本的に、プレーヤーがプラットフォームの上部に衝突した場合は、プレーヤーを上部に移動します。側面に衝突がある場合は、プレーヤーをオブジェクトの側面に戻します。底に衝突がある場合は、プラットフォームの下にプレーヤーを再配置してください。 私が試してみました多く、このような浸透深さを見つけようと侵入深さによって後方プレーヤーを再配置するようにこれを行うためのさまざまな方法を、。残念ながら、私が試したことは何も正しく動作していないようです。プレイヤーの動きが非常にグリッチになり、望まないときにプレイヤーの位置を変えます。その理由の1つは、おそらくこれはとても単純なものだと思っているためですが、考えすぎています。 誰かが彼らが助けることができると思っている場合は、以下のコードを見て、可能であればこれを改善するのを助けてください。これを処理するためにライブラリを使用しないでください(自分で学びたいので)、または可能であればSAT(分離軸定理)のようなものを使用しません。よろしくお願いします! void world1Level1CollisionDetection() { for(int i; i < blocks; i++) { if (de2dCheckCollision(ball,block[i],0.0f,0.0f)==true) { de2dObj ballPrev; ballPrev.coords[0] = ball.coords[0]; ballPrev.coords[1] = ball.coords[1]; ballPrev.coords[2] = ball.coords[2]; ballPrev.coords[3] = ball.coords[3]; ballPrev.coords[0] -= ball.xspeed; ballPrev.coords[1] -= ball.yspeed; ballPrev.coords[2] -= ball.xspeed; ballPrev.coords[3] -= ball.yspeed; int up = 0; …

1
カラーベースの衝突検出システムを使用して後悔しますか?
XNAで最初のゲームの構築を始めたばかりです(C#の経験はありますが、ゲームの経験はありません)。 私はかなりシンプルなトップダウン2Dシューティングゲームを構築しています。カラーベースの衝突システムの使用に関するこのチュートリアルを読みましたが、本当にクールに聞こえました。http://www.xnadevelopment.com/tutorials/theroadnottaken/theroadnottaken.shtml これは、グラフィックスプログラムを使用するだけですばやくレベルを作成でき、衝突ボックスなどの観点から自分の風景(壁、木など)を定義する必要がないことを意味します。 ただし、このパスをたどると、基本的なジオメトリの交差タイプの計算を実行できないため、弾丸などの高速で移動するオブジェクトが壁などと交差するかどうかを判断する計算が潜在的に難しくなることがわかります。 そうですか?時間の経過とともにゲームが複雑になった場合、この方向に進んで後悔するでしょうか?ジオメトリの観点から自分の風景を定義するためのレベルエディタの作成に投資するだけの価値はありますか? noobへのアドバイスは大歓迎です!

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