2

ピクセルを使用して衝突を検出するための衝突クラスを作成しました。私のクラスでは、衝突角度を決定するためのいくつかの関数も開発しました。これに基づいて、いくつかの例を作成しました。

http://megaswf.com/serve/25437/

http://megaswf.com/serve/25436/

(重力を変更するためのスペース、ボールにある程度の速度を与えるための右/左。)

お気づきかもしれませんが、奇妙なことが起こります。

  • ボールスピードが非常に遅いとき
  • ボールの方向が障害物にほぼ接しているとき。

衝突http://img514.imageshack.us/img514/4059/colisao.png

上の画像は、衝突角度の計算方法を示しています。私は赤い点をキーポイントと呼んでいます。キーポイントの最大数(通常は4つ)を検索します。2つ以上のキーポイントが見つかった場合は、最も遠い2つのキーポイントを選択します(青いオブジェクトの1つに示されています)。このようにして、オブジェクトが表面のどこに衝突したかに対する法線角度を見つけます。これが時代遅れのやり方かどうかはわかりません。

その角度に基づいて、速度ベクトルを回転させてバウンスを行います。

数学を行うためのコードはここにあります:

static public function newSpeedVector(speedX: Number, speedY: Number, normalAngle: Number): Object{
            var vector_angle: Number = Math.atan2(speedY, speedX) * (180/Math.PI);
            var rotating_angle: Number = (2*(normalAngle - vector_angle) + 180) % 360;
            var cos_ang: Number = Math.cos(rotating_angle/DEGREES_OF_1RAD);
            var sin_ang: Number = Math.sin(rotating_angle/DEGREES_OF_1RAD);
            var final_speedX: Number = speedX * cos_ang - speedY * sin_ang;
            var final_speedY: Number = speedX * sin_ang + speedY * cos_ang;

            return {x_speed: final_speedX, y_speed: final_speedY};
        }

これは、新しい速度ベクトルが計算される方法です...

私の質問は、誰かがこの種の問題に直面したことがありますか、またはこれが起こらないようにする方法について何らかのアイデアを持っていますか?

4

3 に答える 3

3

あなたのコードを見なくても、これが私が提供できる最高のものです。

衝突物理には、「停止」と見なされる速度しきい値が必要です。つまり、速度が十分に小さくなったら、オブジェクトを明示的に停止済みとしてマークし、衝突コードから除外する必要があります。これにより、動きの遅いオブジェクトを安定させることができます。適切なしきい値を設定するには、試行錯誤が必要です。

衝突が発生した場合、少なくとも相互貫通を修正するよう試みることが重要です。これが、タンジェント コリジョンが奇妙な動作をする理由である可能性が最も高いです。衝突するオブジェクトを、衝突したオブジェクトから適切な方法で遠ざけるようにします。

法線を決定する方法はうまくいくはずです。ゲームの物理学はすべてチート (見栄えの良いチート) です。回転と摩擦はあなたの目的の一部ではないと思いますか?

これを試して。連絡先は正常です。衝突を検出したら、貫通深度を計算し、法線に沿ってオブジェクトを移動して、それ以上貫通しないようにします。すでに計算した 2 つのポイントを使用して、貫通の 1 つのポイントを取得できますが、もう 1 つのポイントを計算する必要があります。円の場合は簡単です (中心点 + 法線方向の半径)。これにはもっと複雑な方法がありますが、単純な方法がうまく機能するかどうかを確認してください。

この本を読んでお勧めします: Game Physics Engine Development

于 2010-07-15T23:15:54.550 に答える
1

私はそのようなことを少ししましたが、同様の問題が発生しました。私がしたことは、バウンドするオブジェクト (あなたの場合はボール) のピクセルが障害物のピクセルと重なる場合、重ならないようにボールを障害物の外に移動する必要があるということです。

ボールが障害物の上を転がっているとします。ボールを再度レンダリングする前に、「オーバーラップ」の量だけボールを戻す必要があります。ボールがオブスタブルに当たった角度がわかっている場合は、その角度に沿ってボールを移動します。

また、ダンピングを追加する必要があります。そうしないと、ボールが止まらなくなります。(非常に) 小さい値を取り、ボールの速度がその値を下回る場合は、速度を 0 に設定します。

于 2010-07-15T23:27:13.083 に答える