我很长时间都在寻找答案,但我仍然没有找到解决办法。
我使用Swift / SpriteKit创建一个简单的游戏,规则也很简单。玩家触摸屏幕并且球以抛物线轨迹进入触摸位置。
我希望实现类似http://www.onlinegames.com/basketball/之类的东西,但我不知道如何计算所需的冲动。
代码很简单
ball.physicsBody.applyImpulse(CGVectorMake(x, y));
我所拥有的只是球的重量和重力。
如何找到x,y?请帮忙。
答案 0 :(得分: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
是到达目标所需的时间,'
(素数)表示最终位置(在目标处),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
,然后计算t
和imp_x
以给定的标量平均速度在给定时间内将球送到其位置。
如果正y指向重力“上升”,请不要忘记,imp_y
为负数。