我正在编写一个小游戏很长一段时间。我们开始在学校的一个项目中编写一个小型 FPS-Shooter,以获得一些使用 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..
在不知道时间的情况下无法计算敌人..我无法在不知道角度(θ、俯仰/偏航)以及到“未来”撞击点的距离的情况下计算时间