ボール対45度のスロープ衝突検出


8

プレーヤーがボールを動かす簡単なゲームがあります。ボールは壁から跳ね返ります。現在、正方形の壁が実装されています(■)。単純な境界ボックスの衝突を使用して、xまたはyの速度を更新するときにプレーヤーが壁に移動するかどうかを確認し、そうであれば、速度に-1を掛けて跳ね返らせます。

ただし、三角ピース(◢◣◤◥)も実装したい。立ち直るには、次のように使用できると思います。

   newxspeed = -1*yspeed;
   newyspeed = -1*xspeed;

しかし、私が問題を抱えているのは衝突検出です。プレイヤーはいつ対角線を攻撃しますか?


2
このトピックについては、Nチュートリアル(パート1パート2)を強くお勧めします。
Chris Burt-Brown

どうもありがとうございました。このチュートリアルは、実際にこれを解決する方法を理解するのに役立ちました。
Qqwy 2013年

実際、私が答えの1つを「the」ソリューションとしてマークすることは非常に困難です。なぜなら、それらすべてが問題を理解するのに役立ちましたが、どれも完全にそれを解決しなかったからです。私は何をすべきか?
Qqwy 2013年

回答:


8

まず、球(2Dの円)と線の間の衝突検出を計算するには、移動するボールの中心と線の間の垂直ベクトルを計算する必要があります。この距離を計算するには、次のことを行う必要があります。

ここに画像の説明を入力してください

したがって、上の図でdを計算するには、いくつかの手順を実行する必要があります。

  1. 線がパラメトリック方程式P(t)= S + t Vを使用していると仮定します。V は線の方向であり、(P2-P1)を減算することで得られることに注意してください。
  2. ピタゴラスから:

d ^ 2 = len(Q - S)^ 2-len(proj(Q - S))^ 2

次に、方程式を展開して次のようにします。少し複雑に見えますが、実際はそうではありません。

d = sqrt(len(Q - S)^ 2-len((Q - S)dot V)^ 2 / V ^ 2)

ここで、Qは円の中心であり、Sは線上の任意の点です。距離が円/球の半径よりも小さくなると、次のポイントで説明する衝突応答をトリガーする必要があります。

ボールをバウンスするために常にxまたはyコンポーネントを反転することは正しくありません。実行する必要があるのは、表面の法線ベクトルを計算し、その法線を反射の計算に使用する必要があるためです。次の方程式を使用したベクトル

R = 2 *(VドットN)* N - V

ここで、Rは反射ベクトル、Nは表面の法線、Vは速度ベクトルです。

45度の場合、表面の法線はN =(1,1,0)となり、法線の向き(位置または負)に応じて符号が異なります。


あなたは素晴らしい方程式を使います。しかし、ベクターに不慣れな人をフォローするのは非常に困難です。方程式を小さなステップで分割すると便利です。
Qqwy 2013年

ところで、Nは2次元ベクトルですか、3次元ベクトルですか?3番目の値(0)はどこから来るのですか?
Qqwy 2013年

3D APIを使用していると想定して3Dベクトルを使用しました(そして、3番目のコンポーネントを0に設定する必要がある場合は間違っていた可能性があります)。寸法ですが、それは重要ではありません)。方程式については詳しく説明できますが、答えを編集するのに少し時間が必要です。
concept3d 2013年

1
私は答えを編集して、それが今より理にかなっていることを願っています。
concept3d 2013年

6

ボールの中心と壁の間の距離を測定したいので、次のようにします。

ここに画像の説明を入力してください

画像に表示されているシステムを解くと、点dの座標が得られます。

次に、点dとcの間の距離がボールrの半径以下である場合、ボールと壁の間に衝突があります。


5

ボールは実際には衝突検出用のかなり単純なオブジェクトです。ボールの中心と地形の端の間の距離がボールの半径より小さくなると、それらは地形と衝突します。ボールの中心の位置は簡単に取得できます。テレインの最も近いポイントを見つけることは、一般により複雑であり、それを行う最善の方法は、テレインがどのように表現されているかによって異なります。

斜めの斜面で跳ね返った後に新しい速度を計算するアルゴリズムが正しくありません。x座標とy座標の両方を反転すると、ボールはスロープに近づいたのと同じ方向に戻ります。これは、ボールが地形から直角に来る場合は問題ありませんが、他の角度では失敗します。表面に垂直なコンポーネントのみを無効にする必要があります。たとえば、天井から跳ね返る場合、xではなくyを無効にします。


この回答は問題に直接対応していませんが、この場合の衝突解決の方法を説明するための+1です。
Qqwy 2013年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.