好的,我正在制作太空模拟游戏,与大多数太空模拟游戏一样,当我的子弹到达它时,我需要计算出对手飞船的位置(3d 位置)。我如何根据子弹行进的速度和对手船的速度来计算这个?
4 回答
Kurt Miller 的碰撞检测
http://www.gamespp.com/algorithms/collisionDetection.html
将船的负速度加到子弹上,这样只有子弹移动。然后计算船的形状和子弹行进的线的交点(*pos --> pos + vel * dt*)。
计算他和你之间的相对速度矢量:如果你站着不动,这可以被认为是他的运动。计算他的相对距离向量。现在你知道他已经离开了 D 并且每个时间单位都在移动 V。你有 V' 来计算,你知道它的长度但不知道它的方向。
现在你正在用这两个约束构造一个三角形,他的 V 和你子弹的 V'。在二维中它看起来像:
Dx+Vx*t = V'x*t
Dy+Vy*t = V'y*t
V'x^2 + V'y^2 = C^2
这简化为:
(Dx/t+Vx)^2 + (Dy/t+Vx)^2 = C^2
你可以使用二次公式来解决这个问题。您可以类似地在三个维度上应用此技术。还有其他方法可以解决这个问题,但这只是简单的代数而不是向量微积分。
问题可能不应该是“当子弹击中它时船会在哪里”,而是如果子弹击中它。假设直线轨迹和恒定速度,计算两个向量的交点,一个代表弹丸路径,另一个代表船的路径。然后,您可以通过将原始位置到交叉点位置的距离除以每个对象的速度来确定每个对象(船和子弹)到达该点的时间。如果时间匹配,则您有碰撞及其发生的位置。
如果您需要更精确的碰撞检测,您可以使用简单的 BSP 树之类的东西,它不仅可以快速确定碰撞,还可以提供碰撞发生在哪个表面上,如果处理得当,还可以提供碰撞的确切 3d 位置. 但是,在动态环境中维护这样的树可能具有挑战性。