如何计算将球推到准确位置所需的冲量?

时间:2014-08-02 19:09:38

标签: projectile

我很长时间都在寻找答案,但我仍然没有找到解决办法。

我使用Swift / SpriteKit创建一个简单的游戏,规则也很简单。玩家触摸屏幕并且球以抛物线轨迹进入触摸位置。

我希望实现类似http://www.onlinegames.com/basketball/之类的东西,但我不知道如何计算所需的冲动。

代码很简单 ball.physicsBody.applyImpulse(CGVectorMake(x, y));

我所拥有的只是球的重量和重力。

如何找到x,y?请帮忙。

1 个答案:

答案 0 :(得分:1)

冲动是球的动量m*v的变化。因此,考虑到球的质量,impulse/mass = delta_v - 速度的变化。

作为飞行时间函数的冲动

球必须在xy尺寸中达到目标。我们可以把它写成两个方程的系统,每个维度一个,

x' = x + v_x * t,
y' = y + v_y * t + 0.5 * g_y * t^2,

其中t是到达目标所需的时间,'(素数)表示最终位置(在目标处),x,y是初始位置的组成部分,{{ 1}}表示初始速度的分量,v_dim是重力加速度的垂直分量。如果g_y点“向上”, g_y应为否定。

我们也知道初始速度是y,其中v = v0 + impulse/mass是施加冲动之前球的速度,而质量的一切都是矢量。

观察这两个方程,初始位置和目标位置是已知的,重力加速度和初始球速度也是如此。唯一的未知因素是冲动和飞行时间。

冲动是所需飞行时间的函数。因此,首先选择一些飞行时间,然后获得它的冲动。所以,让我们解决冲动:

v0

x' = x + (v0_x + imp_x/mass) * t (x' - x)/t = v0_x + imp_x/mass mass * ((x' - x)/t - v0_x) = imp_x y' = y + (v0_y + imp_y/mass) * t + 0.5 * g_y * t^2, (y' - y)/t = v0_y + imp_y/mass + 0.5 * g_y * t mass * ((y' - y)/t - v0_y - 0.5*g_y*t) = imp_y 的任意,正和非零值意味着我们可以根据某些标准“调整”我们的方法。这将需要表达约束的附加等式并产生t的值。

选择飞行时间

我们可能希望平均球速度t的大小(长度)是固定的,这样飞行时间随着从起点到目标的距离线性变化。

根据定义,v_avg或每个组件:

v_avg = (pos' - pos)/t

由于我们希望限制平均速度或标量平均速度v_avg_x = (x' - x) / t v_avg_y = (y' - y) / t 的大小而不考虑矢量平均速度指向的确切位置,我们得到一个方程式:

vsa

小结

您可以选择一些平均标量vsa^2 = v_avg_x^2 + v_avg_y^2 vsa^2 = (x' - x)^2/t^2 + (y' - y)^2/t^2 t^2 = [(x' - x)^2 + (y' - y)^2] / vsa^2 t = sqrt[(x' - x)^2 + (y' - y)^2] / vsa ,比如说vsa,将其应用到上面以获取1m/s,然后计算timp_x以给定的标量平均速度在给定时间内将球送到其位置。

如果正y指向重力“上升”,请不要忘记,imp_y为负数。