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

衝突後にゲームオブジェクトの位置を調整するプロセス。

6
高速移動オブジェクトの六角形衝突検出?
オブジェクトには位置と速度ベクトルがあります。通常、2つのオブジェクトが衝突するかどうかを確認するために位置のみが使用されます。これは、最初の衝突チェックで最初のオブジェクトの前にあり、その後ろで2番目の衝突チェック。 また、ラインベースの衝突チェックもあります。このチェックでは、各オブジェクトの移動ベクトルが他のオブジェクトの境界ボックスと交差するかどうかのみをチェックします。これは、ポイントの拡張として見ることができます。ただし、高速で移動するオブジェクトが本当に小さい場合にのみ機能します。 だから、私のアイデアは、ポイントを拡大するのではなく、なぜ長方形を拡大しないのですか?これにより、六角形になります。 今、これまでのところとても良い。しかし、この種の2つの六角形が交差するかどうかを実際に確認するにはどうすればよいですか?これらは非常に特殊な六角形であることに注意してください。 ボーナス質問:衝突が発生した場所を正確に(または、ある程度の時間後に)計算することは可能ですか?これは、実際に何がどこで、どのくらいのパワーで発生したかを検出し、衝突からフレームの終わりまでの時間での動きをシミュレートするのに非常に便利です。

3
チームはソースファイルの上書きをどのように防止しますか?[閉まっている]
閉まっている。この質問はトピック外です。現在、回答を受け付けていません。 この質問を改善したいですか? 質問を更新して、 Game Development Stack Exchangeで話題になるようにします。 4年前に閉鎖されました。 たとえば、ゲームエンジンなどが複数の人によって同時に処理されているときに、上書きをどのように防ぐことができるのか、ということが起こりました。 開発者1が作業してAudio.cppおり、開発者2も作業をしているとしましょう。Audio.cppこれは、一般的に大規模なチームで上書きに対処するためにどのように管理されていますか?(つまり、開発者2がファイルを開くのを停止して、開発者1が終了するまで)
26 project-management  version-control  teamwork  java  2d  collision-detection  vector  collision-resolution  unity  directx  directx11  directx10  xna  ios  monogame  windows-phone-8  xamarin  design-patterns  oop  xna  collision-detection  collision-resolution  bounding-boxes  rotation  collision-detection  mathematics  javascript  algorithm  separating-axis-theorem  xna  2d  monogame  image  xna  directx  graphics  performance  opengl  2d  3d  c++  directx11  unity  c#  scale  c#  xna  collision-detection  collision-resolution  leaderboards  scoring  glsl  srgb  tilemap  three.js  tiled  unity  physics  xml  dialog-tree  xna  c#  .net  opengl  lwjgl  vbo  physics  graphics  procedural-generation  simulations  water  opengl  java  textures  lwjgl  frame-buffer  unity  unity  2d  collision-detection  collision-resolution  trigonometry  java  android  libgdx  xna  c#  frame-rate  c++  unreal-4  procedural-generation  java  graphics  lwjgl  slick  c++  software-engineering 

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

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

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

4
バウンス摩擦による回転を計算するにはどうすればよいですか?
前の質問から続きます。ボールがヒットしたサーフェスから非常にリアルに跳ね返っています。今、私はヒットの摩擦からそれを回転させたいです。 これを表示するのは十分簡単です:ティックごとに角速度でボールを回転させ、レンダリング時に同じ回転を適用します。 ボールが壁に当たったとき、回転速度が影響を受けることを知っています... 表面を打つときのボールの初期速度 ボールと表面の摩擦係数(物理定数) 入射角(ボールの入射速度ベクトルと表面の法線の間の角度)。 入射角は、ボールの衝撃速度と射出速度のベクトルのドット積で近似されます。(1は高スピン、-1はスピンなし、その他はすべてその間にあることを意味します) 上記のすべてを乗算し、それらが0〜1の範囲に変換され、最大回転速度が乗算されることを確認すると、ボールは予想どおり回転速度で応答するように見えました。1つを除いて、(正の値のため)常に時計回りに回転します。 これは良い方法ですか?もっと簡単な方法を考えられますか? この方法で問題がなければ、何が欠けていますか?ボールが反時計回りに回転するタイミングを知るにはどうすればよいですか?

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

2
MMOでサーバー側のすべてのオブジェクトの座標を保存する
MMORPGの場合: 衝突を検出するために、すべての木、茂みなどの座標をサーバー側に保存することは一般的ですか? もしそうなら、そのような膨大な数の座標(データ構造など、パフォーマンスの問題の処理)を保存するための実行可能な方法は何でしょうか? そうでない場合、このタイプの衝突検出は完全にクライアント側で行われ、サーバーはまったくチェックしませんか? または、クライアントが衝突をチェックし、サーバーが検証するという中間的な状況がありますか?もしそうなら、サーバーも同様にサーバー内の座標を維持せずに同じことを検証しますか?

4
プレーヤーをスムーズに階段に登らせる
私は2Dプラットフォームのゲームを持っています。プレイヤーは常に右側に走りますが、地形は常に水平ではありません。例: プレイヤーボックスと他のブロックとの交差をチェックするだけで境界ボックス衝突システムを実装しました。大きなブロックに遭遇した場合にプレイヤーが実行されないようにして、ジャンプする必要がありますが、階段を置くときは、水平な地面と同じようにスムーズに走ります。衝突システムでは、階段を飛び越えて通過する必要があります。 階段の端の間に線を引いて、その線にプレイヤーの動きを課すことを考えました…どう思いますか?もっと賢いことはありますか?

2
Microsoft XNA Platformerの例、衝突検出は正確に実装されていますか?
Microsoftが提供する例では、衝突の検出(私が確認できることから)に小さなエラーがあるようです。ユーザーが通過不可能なタイルと衝突すると、交差の深さが計算されます。奥行き値XとYの小さい方を使用してユーザーの位置を固定し、タイルと衝突しないようにします。しかし、ユーザーが斜めに移動している場合、これにより、ユーザーが最初にタイルと最初に衝突するポイントに正確に到達しない可能性がありますか? 私はおそらく間違っているが、それは私がそれを見る方法に過ぎない。 private void HandleCollisions() { // Get the player's bounding rectangle and find neighboring tiles. Rectangle bounds = BoundingRectangle; int leftTile = (int)Math.Floor((float)bounds.Left / Tile.Width); int rightTile = (int)Math.Ceiling(((float)bounds.Right / Tile.Width)) - 1; int topTile = (int)Math.Floor((float)bounds.Top / Tile.Height); int bottomTile = (int)Math.Ceiling(((float)bounds.Bottom / Tile.Height)) - 1; // Reset …

3
衝突を増やすことなく衝突オブジェクトを分離する方法
すべてのオブジェクトを移動して衝突をチェックする単純な離散衝突検出システムを使用するとします。衝突するオブジェクトを(もちろん)分離し、適切な応答速度(バウンス、スライド、停止など)を割り当てます。 衝突するオブジェクトのペアがある場合、片方または両方のオブジェクトが他のオブジェクトと衝突することにならないように、オブジェクトを分離するにはどうすればよいですか?

4
衝突長方形の応答
移動可能な長方形を複数の長方形と衝突させるのに問題があります。 私はSFMLを使用していて、intersects2つの四角形を取り、その交差部分を返すという便利な関数があります。移動可能な四角形を衝突させたい四角形でいっぱいのベクトルがあります。私は次のコードを使用してこれをループしています(pは移動可能な四角形です)。 IsCollidingWithブール値を返しますがintersects、交点を計算するためにSFMLも使用します。 while(unsigned i = 0; i!= testRects.size(); i++){ if(p.IsCollidingWith(testRects[i]){ p.Collide(testRects[i]); } } そして実際のCollide()コード: void gameObj::collide( gameObj collidingObject ){ printf("%f %f\n", this->colliderResult.width, this->colliderResult.height); if (this->colliderResult.width < this->colliderResult.height) { // collided on X if (this->getCollider().left < collidingObject.getCollider().left ) { this->move( -this->colliderResult.width , 0); }else { this->move( this->colliderResult.width, 0 ); } …

3
チョークポイントで群衆に対処するための戦略
最近、ゲームエンジンをステアリング動作からインパルスベースの動きに切り替え、適切な時間ベースの衝突解決を行いました。これにより、非常に多くの問題が解決され(トンネリングが不要になりました)、シミュレーションが大幅に安定しました。しかし、安定性には新たな問題が生じています。 3つのボールは画像の下部近くで移動を開始しました。ターゲットはピンク色のボールが止まったところです。途中、赤と緑のボールが壁のチョークポイントに引っかかっています。 以前は、浮動小数点エラーとステアリング動作の一般的な不安定性を利用して、緑と赤のボールがチョークポイントを通り抜けるまで互いに揺さぶることができました。これで、適切な衝突解決により、ボールに作用する力が互いに相殺され、その結果、ボールは完全に静止したままになります。 そのような状況を解決するために一般的に使用される方法は何ですか?おそらく、ある種の優先度キューシステムが機能しますが、2つ以上のオブジェクト間の優先度を決定する必要があると、システムが複雑になることがわかります。

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 …

2
2つの衝突する物体の侵入を解決する方法
シンプルな3Dゲーム物理エンジンを実装しました。私はすでに適切な衝突検出を行っていますが、今は衝突応答の部分を理解しようとしています。衝突後の速度を計算するために、インパルスベースの方法を使用しています。これはかなりうまく機能しますが、ボディが相互貫通し続けるのを完全に防ぐわけではありません。そのため、ペネトレーションを解決するための追加のコードがあります。現在、私はボディを接触法線に沿って浸透深さの半分だけ移動します-最初のボディは接触法線の方向に、2番目のボディは反対方向に移動します。 これはほとんどの場合問題ありませんが、いくつかの望ましくない影響があります。たとえば、狭い廊下とその中を移動するオブジェクトを想像してみてください。オブジェクトが廊下の壁の1つにぶつかると、透過解像度によって反対側の壁に移動し、次のフレームで最初の壁に戻ります。効果は、オブジェクトが壁の間で本当に速く振動しているようなものであり、きれいではありません。 だから私の質問は、侵入を解決するより良い方法があるかどうかです?おそらくボディを動かさずに、(インパルス計算に加えて)どういうわけか速度を調整して、ボディが互いに近づくのを止め、ペネトレーションが次の数フレームで解決するようにします。私はここで推測しています。何か案は?

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