1

アークによる 2D 衝突検出を実装する必要があります。プレイヤー(黒い点)と敵(赤い点)がいます。プレイヤーは任意の方向に攻撃でき、ヒット エリアは 120 度 (緑の線が示しています) で、特定の半径 (黒の曲線) です。

私の作品

この検出を達成する方法は?

プレイヤーと敵の間の角度を計算するコードを作成しましたが、プレイヤーの方向ベクトルを使用して弧の内側にあるかどうかを確認する方法がわかりません。

4

3 に答える 3

2

敵との角度と距離を計算します。これを使用して、それらが範囲内にあるかどうかを確認します。

デカルト座標を使用しているため、正方形の領域であれば問題は簡単です。放射座標に変換することで、この問題も簡単になります。

新しい情報で

  • ベクトル A はプレイヤーの方向ベクトルです。
  • 敵からプレイヤーへのベクトル B を計算します。

ベクトル B の長さが長すぎないことを確認してください。

ベクトル間の角度は acos(|AB| / |A||B|) で与えられます。

角度が 60 度 (120 度の半分) 未満の場合、敵は射程内にあります。

于 2012-04-29T14:08:00.210 に答える
1

「前方」を指す単位長ベクトルがあるとします。そして、潜在的なターゲットを指す単位長ベクトルがあるとしましょう。ターゲットがアーク内にいる場合、

dot(forwardVector, targetVector) >= cosf(arcAngle/2).

ベクトルが単位長でない場合、もちろん機能しません。ターゲットが必要な角度内にあるかどうかを確認します。

必要な距離内にあるかどうかを確認するのは簡単でsquaredLength(targetPosition - playerPosition) <= arkDistance*arkDistance、squaredLength がdot(vector, vector).

于 2012-04-29T14:28:41.310 に答える
1

まず最初に、プレーヤーには方向 (2D ベクトルなど) が必要です。簡単に言うと、最初の緑の線との角度 = もう 1 つの緑の線との角度です。

次の 2 つのチェックを実行する必要があります。

  1. 敵とプレイヤーの間の距離が半径よりも小さいかどうかを確認し、そうでない場合は次の敵に移動し、そうであれば次の敵に移動します
  2. プレイヤーと敵の間に仮想線を引き、この線とプレイヤーの方向の間の角度を計算します。それがヒットエリア角度の半分未満の場合 (この例では、60 未満の場合)、プレーヤーは、次の敵に移動しない場合、敵を攻撃できます。

アイデアとしてはこれで十分です。参考になれば幸いです。

于 2012-04-29T14:15:40.530 に答える