当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《打砖块物理学(弹丸物理模拟)》经验,为你挑选了1个好方法。

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

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

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

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

现在球更新如下:

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

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



1> Filipq..:

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

在此输入图像描述

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

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

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

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

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

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

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

推荐阅读
手机用户2502852037
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有