我正在寻找答案很长时间,但我仍然没有找到解决方案。
我正在使用 Swift/SpriteKit 创建一个简单的游戏,规则也很简单。玩家触摸屏幕,球以抛物线轨迹到达触摸位置。
我想实现类似http://www.onlinegames.com/basketball/但是我不知道如何计算所需的冲动。
代码很简单
ball.physicsBody.applyImpulse(CGVectorMake(x, y));
我所拥有的只是球的质量和重力。
如何找到x,y?请帮忙。
我正在寻找答案很长时间,但我仍然没有找到解决方案。
我正在使用 Swift/SpriteKit 创建一个简单的游戏,规则也很简单。玩家触摸屏幕,球以抛物线轨迹到达触摸位置。
我想实现类似http://www.onlinegames.com/basketball/但是我不知道如何计算所需的冲动。
代码很简单
ball.physicsBody.applyImpulse(CGVectorMake(x, y));
我所拥有的只是球的质量和重力。
如何找到x,y?请帮忙。
冲量是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_x
和imp_y
以在给定的时间以给定的标量平均速度使球到达其位置。
不要忘记,g_y
如果正 y 点重力“向上”,则你的值为负。