2

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

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

我想实现类似http://www.onlinegames.com/basketball/但是我不知道如何计算所需的冲动。

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

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

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

4

1 回答 1

1

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

脉冲作为飞行时间的函数

x球必须在尺寸和y尺寸上都达到其目标。我们可以把它写成一个由两个方程组成的系统,每个维度一个,

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

其中t是到达目标所需的时间,'(prime) 表示最终位置(在目标处),x,y是初始位置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,将其应用于上面以获得t,然后计算imp_ximp_y以在给定的时间以给定的标量平均速度使球到达其位置。

不要忘记,g_y如果正 y 点重力“向上”,则你的值为负。

于 2014-08-02T19:48:20.233 回答