私はかなり長い間小さなゲームをプログラミングしています。学校のプロジェクト内で小さな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だけではありません。
時間を知らずに敵を計算することはできません..そして、角度(シータ、ピッチ/ヨー)と「将来の」衝突点までの距離を知らずに時間を計算することはできません