2

これは、プラットフォームに依存しない数学の質問です。重なっている 2 つの正方形があります。「重なりの深さ」(ある形状が別の形状にどのくらい入っているか)を知る必要があります。適切な衝突を可能にするためにこのデータが必要です (プレーヤーをオーバーラップ深度に戻します)。もっと簡単な方法はありますか?それとも、次のことに固執するほうがよいですか。

rAは長方形なので、ia rB.

depth.x = (rA.position.x - rB.position.x);
depth.y = (rA.position.y - rB.position.y);

これは、オーバーラップの深さを返す代わりに、 と の間の距離を返すため (予想どおり)、多少間違った情報を返しrAますrB。問題は、2 つのオブジェクトのオーバーラップの深さを見つけるための式を計算できないことです。衝突があることは既にわかっていても、何らかの方法でオブジェクトのサイズを考慮する必要がありますか?

できると提案されましたdepth.x = (rA.width/2) - (rA.position.x - rB.position.x)。ただし、rB が左側にある場合は機能せず-10(example) - 50、無効になります ( -60)。if私は長文を避け、それらがどれだけ重複しているかを知ることに固執したいと思います. それで、これを解決することは可能ですか?

4

1 に答える 1

1

正方形の軸が揃っていると仮定しますが、そうでない場合でも機能するテクニックを示します。

一般的な結果 (凸多角形)

この方法は、2 つの集合のミンコフスキー差に依存します。これは、共通部分を見つけるための一般的な手法です。

2 つの凸形状のミンコフスキー差は凸であり、両方の元のセットが多角形の場合、結果の形状は多角形になります。n_i.x>c_iこれは、各 n iが単位法線である一連の方程式として表すことができることを意味します。

したがって、2 つの形状が交差するかどうかを判断するアルゴリズムは次のとおりです。

  1. 2 つの形状のミンコフスキー差を決定します。
  2. 原点がミンコフスキー和の範囲内にあるかどうかを判断します (これは、すべての場合に真ですc_i<0) 。

深さの尺度は次のとおりです。max(c_i)

軸が整列した正方形の特殊なケース

これで、2 つの軸が整列した正方形の場合、ミンコフスキーの合計は別の軸が整列した正方形になります。正方形 A(cA_x,cA_y)を幅WAと高さで中心にすると、次のHAように表すことができます。

 A = { (cA_x + a WA/2, cA_y + b HA/2), where -1<=a<=1, -1<=b<=1 }

同様に、正方形 B は次のようになります。

 B = { cB_x + c WB/2, cB_y + d HB/2), where -1<=c<=1, -1<=b<=1 }

すると、ミンコフスキー差は

 A-B = { (cA_x - cB_x + a WA/2 - c WB/2, cA_y - cB_y + b HA/2 - d HB/2), where ... }
     = { (cA_x - cB_x + r (WA-WB)/2, A_y - cB_y + s (HA-HB)/2), where -1<=s<=1, -1<=r<=1 }

の 4 つのエッジA-Bは、

 x > (cA_x-cB_x) - |WA-WB|/2
 y > (cA_y-cB_y) - |HA-HB|/2
 x < (cA_x-cB_x) + |WA-WB|/2
 y < (cA_y-cB_y) + |HA-HB|/2

最後の 2 つは次のように書き換えることができます。

 x > -(cA_x-cB_x) - |WA-WB|/2
 y > -(cA_y-cB_y) - |HA-HB|/2

したがって、交差の深さは次のようになります。

 min(
     (cA_x-cB_x) - |WA-WB|/2,
     (cA_y-cB_y) - |HA-HB|/2,
    -(cA_x-cB_x) - |WA-WB|/2,
    -(cA_y-cB_y) - |HA-HB|/2 )

この深さが正の場合にのみ交差が発生します。

(注:これを書いている間、私は数学に取り組んでいるので、あちこちで符号が間違っている可能性が非常に高いです...そのようなエラーがあれば自由に修正してください...)

于 2013-02-28T01:16:37.327 に答える