2

私は、ボールやパックなどの丸みを帯びたオブジェクトを含むJavaゲームを開発しています(ただし、開発言語は実際には重要ではありません)。現在、衝突に取り組んでいます。私はタイマーを使用しているので、すべてのフレームで衝突が発生するかどうかをチェックします。

これは、オブジェクトの右上の部分を表すグラフです。

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

オブジェクトの中心は点[0,0]で表され、半径は10ピクセル、単位はピクセルです。

これで、オブジェクト(たとえばobj_1)が正方形/ひし形(青い線)の場合、別のオブジェクト( obj_2)が衝突するかどうかを確認するには、それらの座標を取得するだけMath.abs(obj_1.x - obj_2.x) + Math.abs(obj_1.y - obj_2.y) <= radiusで、衝突があるかどうかを確認できます。

ただし、円の形(赤い線)の場合、より多くのスペースが必要であり、この占有スペースが直線で囲まれていないため、問題はより複雑になります。もちろん、いくつかの値を丸める必要があります(たとえば、前のグラフで、衝突をチェックしたい場合は、x = 29.5から10のように見えるy値を丸める必要があります)。しかし、私はこの式を取得する方法がわかりません。どんな助けでも大歓迎です。

4

4 に答える 4

3

実装言語は重要ではないとおっしゃっていましたが、丸いオブジェクトの衝突を検出するための一般的なソリューションを紹介します。

また、私が集めたものから、シーン内のすべてのオブジェクトは円です。以下の解決策は、円と他の形状との衝突の検出には適用されません。

2つの円c1c2があるとします。対応する半径がc1.rc2.rであり、中心が(c1.x、c1.y)(c2.x、c2.y)であるとすると、次の関数はc1とc2が衝突しているかどうかを示します。

boolean areColliding(Circle c1, Circle c2){

   center_distance = sqrt((x1-x2)^2 +(y1-y2)^2);  //this is the distance between the centers of the two circles.

  if((c1.r+c2.r) < center_distance)
           return false;
  else
          return true;

}

この擬似コード関数は、円が衝突している場合はtrueを返し、そうでない場合はfalseを返します。

基本的に、この関数は、円の中心間の距離がそれぞれの半径の合計よりも大きいかどうかをチェックします。

于 2013-02-12T19:40:23.163 に答える
2

Javaには、java.awt.Polygonがあります。

このPolygonクラスには、複数のcontainsメソッドとintersectメソッドがあります。

円をaとして定義することは、円Polygonをどの程度正確にするかによって異なりますが、面倒です。ただし、すべてのオブジェクトをPolygonsとして定義したら、定義されたメソッドを使用して衝突を検出できます。

于 2013-02-12T19:15:51.173 に答える
1

バウンディングボックスに丸みを帯びた形を設定できます。これにより、衝突の精度は低下しますが、他の方法に比べてパフォーマンスが大幅に向上します。

于 2013-02-12T19:18:38.203 に答える
1

@Ankitのソリューションへの追加:

boolean areColliding(Circle c1, Circle c2){

    center_distance = (x1-x2)^2 +(y1-y2)^2;  //this is the distance between the centers of the two circles.

    if((c1.r+c2.r)^2 < center_distance)
        return false;
    else
        return true;
}

これは、距離の2乗を比較するだけです。結果は同じですが、平方根がなく、パフォーマンスに大きなメリットがありません。

于 2017-03-01T11:56:25.173 に答える