1

私はかなり長い間小さなゲームをプログラミングしています。学校のプロジェクト内で小さなFPSシューティングゲームのコーディングを開始し、directXの使用を少し体験しました。理由はわかりませんが、プロジェクトを止めることができず、自宅でもプログラミングを始めました。現在、私はいくつかの小さなAIを作成しようとしています。それは間違いなく簡単ではありませんが、とにかくそれが私の個人的な目標です。トピックは、複数の本を完全に埋めることができます。これまでのところ、ボットのウォーキング部分は完了しています。彼らは走り書きの道を歩きます。私はボットの「狙い」に取り組んでいません。私がいくつかの数学の問題にぶつかったプログラミング中に、私はまだ解決できませんでした。これについてのご意見が、私がさらに前進するのに役立つことを願っています。コンセプト、アイデア、その他すべてが高く評価されています。

問題:発射体のカーブ(重力、速度に依存)が敵の歩行経路のカーブ(速度に依存)に当たる位置(D3DXVECTOR3)を計算します。敵は一定の列を歩いていると仮定します。

既知の変数:

float projectilSpeed = 2000 m/s //speed of the projectile per second
float gravitation = 9.81 m/s^2 //of cause the gravity lol
D3DXVECTOR3 targetPosition //position of the target stored in a vector (x,y,z)
D3DXVECTOR3 projectilePosition //position of the projectile
D3DXVECTOR3 targetSpeed //stores the change of the targets position in the last second

可変定義

ProjectilePosition at time of collision = ProjectilePos_t
TargetPosition at time of collision = TargetPos_t
ProjectilePosition at time 0, now = ProjectilePos_0
TargetPosition at time 0, now = TargetPos_0
Time to impact = t
Aim-angle = theta

私の試み:ウィキペディアで「ドロップ」(重力に基づく発射体のドロップ)を計算するための公式を見つけました:

float drop = 0.5f * gravity * t * t

発射体の速度には、水平部分と垂直部分があります。ウィキペディアでもその公式を見つけました。

ProjectilVelocity.x = projectilSpeed * cos(theta)
ProjectilVelocity.y = projectilSpeed * sin(theta)

だから私はこれが発射体の曲線に当てはまると思います:

ProjectilePos_t.x = ProjectilePos_0.x + ProjectileSpeed * t
ProjectilePos_t.y = ProjectilePos_0.y + ProjectileSpeed * t + 0.5f * gravity * t * t
ProjectilePos_t.z = ProjectilePos_0.z + ProjectileSpeed * t

ターゲットは一定の速度で歩くので、次のようにして彼のカーブを決定できます。

TargetPos_t = TargetPos_0 + TargetSpeed * D3DXVECTOR3(t, t, t)

今、私は続行する方法がわかりません。どういうわけか影響を与える時間を確保するために、どうにかしてそれを解決する必要があります。基本的な処方者として、私は次のものを使用できます。

float time = distanz / projectileSpeed

しかし、それは線形の「軌道」を想定しているので、それは本当に正しくありません。ロケットを使用すると、この動作がわかります。

可能な限り問題を説明できたと思います。ご不明な点がございましたら、お気軽にお問い合わせください。

ドイツからの挨拶、フランク


編集:

主な問題は、衝突が発生するまでの時間がないため、衝突時の敵の位置を計算できないことです。一方、衝突時の敵の位置を知らずに時間を計算することはできません。たぶん、反復法がこれを解決します。

カーブの敵:

pos(t).x = pos(0).x + speed.x * time
pos(t).y = pos(0).y + speed.y * time
pos(t).z = pos(0).z + speed.z * time

カーブ発射体:pos(t).y = pos(0).y + sin(theta)*速度+0.5*重力*時間*時間

pos(t).xとpos(t).zは、(xとz)で計算する方法がわからないため、基本的に順方向を定義します。xだけではありません。

時間を知らずに敵を計算することはできません..そして、角度(シータ、ピッチ/ヨー)と「将来の」衝突点までの距離を知らずに時間を計算することはできません

4

3 に答える 3

0

まず第一に、C++ を使用しているので、オーバーロードされた算術演算子を使用して、ベクトル演算を広範囲に使用することは本当に価値があります。あなたの数式は、はるかにきれいになり、数学的な定義に近づきます。.x明示的な,.y割り当てが必要になることはめったにありません。

それでは、あなたの質問に:

主な問題は、衝突が発生するまでの時間がないため、衝突時の敵の位置を計算できないことです

はい、時間の流れです。

考えられるすべての方向を同時に撃つと想像してみてください。すべての発射体は、常に空中のどこかに膨張する球体を形成します。この球体をターゲットのパスと交差させて、ヒットが発生する可能性のある時間を取得できるようになりました。このための数学は少しトリッキーです (次数 4 の多項式を解く) が、近似ではうまく機能します。

あなたはドイツ人なので、トピックをうまくカバーしているこのドイツ語の記事を絶対に見てください!

于 2010-12-30T11:40:50.073 に答える
0

完全な解決策ではありませんが、数学的な観点からこれにどのようにアプローチするか.

会いたいオブジェクトが 2 つあります。見つける必要がある 3 つの未知数は、ヒットが発生した時間、ショットの垂直方向の角度、およびショットの水平方向の角度です。

言うだけでいつでもターゲットの位置がわかる

position = initial position + t*velocity

(ここではベクトルで)。

発射体の位置は次のようになります。

position = initial position + t*(initial velocity) + 0.5*acceleration*t^2

(ここでもベクトルなので、ここでの初速度はショットの 2 つの角度に依存します)

ヒットした場合、明らかにこれら 2 つの位置は同じになるため、これら 2 つの位置を同一視することができます。

事実上、未知数が 3 つのベクトル方程式があることがわかっています。次にそれを成分ベクトルに分割すると、これらの方程式のそれぞれがベクトルの x、y、z 成分だけに適用されます (加速度には z 方向の成分しかないことに注意してください)。

次に、同時に解かれる 3 つの未知数を持つ 3 つの方程式を取得します。残りをあなたに任せる主な理由は、答えで代数をうまく表現する方法がわからないからです。:)

申し訳ありませんが、これは完全ではありませんが、うまくいけば、物事の新しい見方が得られ、数学を自分で解決して自分で方程式を解くことができるかもしれません (難しくはありませんが、同時にそれほど簡単ではありません...)

于 2010-12-30T12:00:06.243 に答える
0

敵が一定の速度で (つまり、直線で) 歩いている場合、最も簡単な方法は変数を変更して、すべてを敵の移動フレームに書き込むことです。次に、解決する二次方程式があります。

しかし、現実の世界では多くの敵がいて、撃つとき、時間 t での弾丸が敵の形状と交差するかどうかをテストする必要があります (敵はポイントではありません)。したがって、弾丸を発射し、その弾道を高速な ODE ソルバーでシミュレートします。 ルンゲ クッタ 4 次が一般的に使用されていると思いますが、その精度のためではありません (エラーを簡単に制御することはできず、物理的な精度は必要ありません。リアリズムだけが必要です。ビデオ ゲーム以外の ODE を解くために RK4 を使用しないでください)。

実際、ゲームの物理 (プレイヤーと敵の物理、IA、弾丸など) をシミュレートするには、時間を追跡する必要があります。次に、弾丸を繰り返し処理し、ゲームのさまざまなオブジェクト (主に敵) との交差をテストします。

毎回、交差を計算する一般的な方法は、octree を使用してオブジェクトの場所を追跡することです。ある時点で、このデバイスを使用すると、弾丸と同じ空間領域にある敵を簡単に見つけることができます (log n)。これで、次を使用できます。

  • 弾丸が敵に当たる場合と当たらない場合の多くのケースに対処する、敵の基本形状 (ボックス、球) の境界: 敵の形状の外側と内側にボックスを配置します。
  • 境界ボックスから何もわからない場合 (1 つの外側のボックスを通過するが、内側のボックスと交差しない)、小さな直線 (t と t + dt の間、dt はそれほど小さくない) の交点を計算する必要があります。敵の形。
于 2010-12-30T12:53:29.860 に答える