我有一个滑块,其速度我通过每个刻度位置之间的差异计算(由于通过触摸屏使用它有时可能很大,所以也许我应该将它夹在一些任意数字以避免一些这些问题?)
我有一个具有3维方向向量和速度的球.
当球与滑块碰撞时,我在Z轴上反转其方向(远离滑块),然后使用滑块速度来操纵其X(左< - >右)方向.所以:
ball.direction.x += (slider_friction * slider_velocity)
现在球更新如下:
velocity = ball.velocity * time ball.direction.normalise() ball.position = ball.direction * ball.velocity
这看起来效果很好,除了在某些情况下,任何球轴似乎都很可能等于零,导致它在某些情况下永远不会返回到滑块.什么是一个很好的解决方案?什么是与块碰撞时处理块响应的好方法?它应该返回到以正确的角度弹跳,还是应该保持反射与滑块应用的相同的弹跳修改器?此外,任何其他物理技巧的这种弹丸模拟将不胜感激.
嗯,这是一个很好的问题; 问题是,一个很好的解决方案(即看起来和感觉就像真实物理一样)是一个使用真实物理的天生的解决方案.幸运的是,这个问题中的大部分牛顿物理都可以很容易地简化.请原谅我,如果我过于冗长,但物理学往往会对你这么做.
因此,为了定义问题,这是一个有弹性的(如在没有能量被吸收的情况下)一个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
由于角速度是旋转对称的,你只需要处理不同角度的碰撞(墙上的球,天花板上的球)作为旋转.
哎呀,这是无意中啰嗦,而且还远未完成,但它足以回答你的问题恕我直言.