2

我正在制作一个游戏,需要弄清楚一个物体需要多长时间才能下降到某个高度。

物体有一个初始 y 值 (y)、一个初始垂直速度 (vy)、一个重力常数 (gravity) 和它应该下降的垂直目标距离(目的地)。

我可以使用循环来解决这个问题:

int i = 0;
while(y < destination) {
    y += vy;
    vy += gravity;
    i++;
}
return i;

唯一的问题是我需要为数百个对象执行此操作,并且我必须每帧都执行此操作。

有没有办法用某种公式来解决这个问题?这样我就可以在解决这个问题的同时加快我的游戏速度。

谢谢

4

4 回答 4

1

您可以使用基本物理学(运动学)明确解决此问题。

给定初始速度 v,恒定加速度 a 和固定距离 x,时间为:

(1/2)at^2 + vt - x = 0

或者

在^2 + 2vt - 2x = 0

求解该二次公式并取正时间。

于 2011-07-20T20:27:02.917 回答
0

The only problem with this is that I need to do this for several hundred objects and I have to do it every frame.

我认为如果性能对您至关重要,那么包含大量*s 和^s 的公式可能不适合您的情况。

我不知道您的目的是什么,是否需要模拟准确,但我认为您可以查看Particle System。尽管它只是一种通用方法,并且不会直接加速您的程序,但该领域正在进行许多可能有用的研究。此外,您可以阅读内容以了解更多信息。

另外,由于您的方法仅使用+,我相信它非常有效。除非你的对象真的很难渲染,否则几百个都不是问题。大多数公式可能会使您的程序看起来更好,但效果不佳。仅供参考,我曾经在一台非常旧的机器上渲染了近 10000 个粒子,并且效果很好。

于 2011-07-20T20:28:14.210 回答
0

查看: http ://en.wikipedia.org/wiki/Equations_for_a_falling_body

于 2011-07-20T20:26:15.923 回答
0

您想知道在给定初始(垂直)速度v和加速度(由于重力)a 的情况下,行进距离d需要多少帧。

n帧之后,行进的距离是

vn + Σ(0≤<em>j< n ) aj = vn + ½ an ( n -1)

所以设置d = vn + ½ an ( n −1) 并求解n

d = vn + ½ an ( n −1)
∴ ½ an 2 + n ( v − ½ a ) − d = 0

然后使用二次公式得到n

n = (½ av ± √(( v − ½ a ) 2 − 2 ad )) / a


其他一些答案已将您推荐给牛顿运动方程的通常解决方案,但这些仅适用于连续方程。您在这里有一个离散模拟,因此如果您想要准确而不是近似答案,那么您需要求和而不是积分,如上所述。

我第一次编写这种预测代码是在一个坦克互相发射炮弹的游戏中。为了帮助瞄准,游戏在炮弹将降落的预测位置在地面上绘制了一个目标标线。在我的第一次尝试中,我使用了连续运动方程的正态解,结果相差甚远。模拟的离散性对结果产生显着影响,对于某些应用(如绘制目标标线),预测和模拟之间的一致性至关重要。

于 2011-07-20T20:34:46.117 回答