打砖块物理学(弹丸物理模拟)

时间:2011-11-09 10:32:50

标签: math physics game-physics

我有一个滑块,其速度我通过每个刻度位置之间的差异计算(由于通过触摸屏使用它有时可能很大,所以也许我应该将它夹在一些任意数字以避免其中一些问题?)

我有一个具有3维方向向量和速​​度的球。

当球与滑块碰撞时,我在Z轴上反转其方向(远离滑块),然后使用滑块速度来操纵其X(左 - 右)方向。这样:

ball.direction.x += (slider_friction * slider_velocity)

现在球的更新如下:

velocity = ball.velocity * time
ball.direction.normalise()
ball.position = ball.direction * ball.velocity

这似乎很有效,除了在某些情况下,任何球轴似乎都很可能等于零,导致它在某些情况下永远不会返回到滑块。什么是一个很好的解决方案?什么是与块碰撞时处理块响应的好方法?它应该返回到以正确的角度弹跳,还是应该保持反射与滑块应用的相同的弹跳修改器?此外,对于这种射弹模拟的任何其他物理技巧都将不胜感激。

1 个答案:

答案 0 :(得分:7)

嗯,这是一个很好的问题;问题是,一个很好的解决方案(即看起来和感觉就像真实物理一样)是一个使用真实物理的天生的解决方案。幸运的是,这个问题中的大部分牛顿物理都可以很容易地简化。请原谅我,如果我过于冗长,但物理学往往会对你这么做。

enter image description here

因此,为了定义问题,这是一个有弹性的(如在没有能量被吸收的情况下)一个arkanoid球和一个桨之间的碰撞。首先,由于你显然已经完成了垂直动作,我不会关心它。所以接下来是关于collsions的水平组成部分。

桨叶将一定量的水平动量传递给球(尽管由于这是打砖块物理学,桨叶本身没有动量:P)。这可以通过两种方式接收 - 通过使球旋转,并通过给球一些水平动量(显然,如果球已经具有水平动量或旋转,增加的动量将是......好的,添加)。

delta动量+ delta角动量=动量桨给出

当然,使用momenta可能会很烦人,因为你真的不需要。我会假设球和桨具有恒定的质量(也就是说,球不会突然变得更重,尽管你可以很容易地使用它),因为那样你就可以将每个球的质量从你的动量方程中分解出来。那么,

delta水平速度+ delta角速度=桨速度*桨的质量/球的质量

要获得一个你可以使用的方程式,你必须设置从桨中进入旋转的动量有多少,以及进入球的运动量。例如,

mass_factor = 2 # ratio between paddle and ball masses
angular_factor = 0.3 # the amount of the paddle's movement which will go into the ball's spin

# and now for the bouncy-bouncy

ball.hVel += (1 - angular_factor) * paddle.hVel * mass_factor * friction or whatever
ball.spin += angular_factor * paddle.hVel * mass_factor * friction or whatever
ball.vVel = - ball.vVel # of course, its vertical velocity reverses

这足以设置一个准逼真的弹跳,​​但是一个金块仍然存在(你不需要加入,但是它会使你的打砖块惊人) - 旋转的所有事情会发生什么?可以通过某种方式使用旋转来获得更有趣的反弹吗?

所以,回顾一下,你的旋转是球的外围相对于中心移动的速度。事实上,只要一个旋转的球在静止的情况下反弹,它的旋转就会发生变化。如果旋转球撞击静止表面,则bal在与其旋转相反的方向上(如果在接触点处测量旋转)稍微“踢”,并且旋转将改变。

#Upon collision with a surface (assumed horizontal, with the ball above the surface)
ball.hVel += -(ball.Avel * rate) # Where "rate" is the ratio which determines how much angular velocity decays with each bounce
ball.Avel *= 1 - rate # So the angular velocity decays properly

由于角速度是旋转对称的,你只需要处理不同角度的碰撞(墙上的球,天花板上的球)作为旋转。

Phew,这是无意中啰嗦,而且还远未完成,但它足以回答你的问题恕我直言。