Math 三维房间中两条曲线的碰撞点

Math 三维房间中两条曲线的碰撞点,math,vector,collision-detection,game-physics,Math,Vector,Collision Detection,Game Physics,我正在编写一个小游戏已经有一段时间了。我们开始在学校的一个项目中编写一个小型FPS射击游戏,以获得使用directX的一些经验。 我不知道为什么,但我不能停止这个项目,也开始在家编程。目前,我正在尝试创建一些小型人工智能。当然,这绝对不容易,但无论如何,这是我个人的目标。这个话题很可能会充斥多本书,呵呵。 到目前为止,我已经完成了机器人的行走部分。他们沿着一条草草地散步。我不是在研究机器人的“瞄准”。 编程时,我碰到了一道数学题,我还没解出来。我希望你在这方面的投入能帮助我取得进一步的进展。我们

我正在编写一个小游戏已经有一段时间了。我们开始在学校的一个项目中编写一个小型FPS射击游戏,以获得使用directX的一些经验。 我不知道为什么,但我不能停止这个项目,也开始在家编程。目前,我正在尝试创建一些小型人工智能。当然,这绝对不容易,但无论如何,这是我个人的目标。这个话题很可能会充斥多本书,呵呵。 到目前为止,我已经完成了机器人的行走部分。他们沿着一条草草地散步。我不是在研究机器人的“瞄准”。 编程时,我碰到了一道数学题,我还没解出来。我希望你在这方面的投入能帮助我取得进一步的进展。我们高度赞赏概念、想法和其他一切

问题: 计算弹丸曲线(取决于重力、速度)击中敌人行走路径曲线(取决于速度)的位置(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
曲线射弹: 位置(t).y=位置(0).y+sin(θ)*速度+0.5*重力*时间*时间

pos(t).x和pos(t).z不确定如何计算in(x和z)基本上定义了前进方向。。不仅仅是x


不知道时间就无法计算敌人。。我不知道时间的角度(θ,俯仰/偏航),以及它对“未来”的影响点的距离

首先,当你和C++一起时,它非常值得使用过载的算术运算符,从而广泛地使用向量运算。你的公式看起来更清晰,更接近数学定义。你很少需要明确的
.x
.y
分配

现在来回答你的问题:

主要的问题是,我无法计算碰撞时敌人的位置,因为在碰撞发生之前我没有时间

是的,时间就是出路

想象一下你同时朝着每个可能的方向射击。所有的射弹在任何时候都会在空中某处形成一个膨胀的球体。现在,您可以将该球体与目标路径相交,并在命中时获得。这方面的数学只是有点棘手(解决四次多项式方程),但它在近似条件下工作得很好


因为你是德国人,你一定要看看这个德语,它很好地涵盖了这个主题

不是一个完整的解决方案,但我将如何从数学的角度来处理这个问题

您有两个要相遇的对象。你需要找到的三个未知数是击球发生的时间、垂直击球角度和水平击球角度

你随时都知道目标的位置

position = initial position + t*velocity
(此处为矢量)

射弹的位置为:

position = initial position + t*(initial velocity) + 0.5*acceleration*t^2
(同样,此处的初始速度取决于放炮的两个角度)

当我们命中时,显然这两个位置是相同的,所以我们可以将这两个位置相等

我们知道有一个三个未知量的向量方程。如果我们将其拆分为分量向量,那么这些方程中的每一个都只适用于向量的x、y和z分量(请注意,加速度只有z方向的分量)

然后我们得到三个方程,三个未知数同时求解。我将剩下的留给你们的主要原因是因为我不知道如何在我的答案中用一种好的方式来表示代数


抱歉,这还不够完整,但希望能给你一种新的看待事物的方式,你可以自己通过数学来解决方程(不难,但同时也不那么容易…)

如果敌人以恒定速度行走(即直线),最简单的方法是改变变量,这样你就可以在敌人移动的框架中写下一切。然后,你要解一个二次方程

但是在现实世界中,有很多敌人,当你射击时,你必须测试你的子弹在t时刻是否与敌人的形状相交(敌人不是点)。所以你发射你的子弹,用快速ODE解算器模拟它的轨迹:我认为龙格库塔四阶是常用的,不是因为它的准确性(你不容易控制错误,你不需要物理准确性:只需要真实感。除了在视频游戏中,不要用RK4解算ODE)但是因为你可以采取相对较大的时间步长,而不会太慢

事实上,模拟游戏的物理(玩家和敌人的物理和IA,子弹等)需要你跟踪时间。然后迭代项目符号并测试它们的交点w