Java - 突破物理学,球拍碰撞时的球方向?

时间:2014-04-16 14:34:44

标签: java graphics collision

我正在创建一个Breakout游戏来熟悉Java。 目前我已经完成了所有工作,但我注意到球似乎朝着同一方向起飞了。

我已经编程了,所以当球击中球拍时,Y速度反转。这有效,但球似乎遵循相同的路线......

如何使碰撞看起来更逼真?

当球击中球拍的左侧时,我想将其重定向到左侧,但我不确定以哪个角度反射它。任何人都可以提供一个公式来帮助我计算出在接触桨的左侧或右侧时需要引导球的角度吗?

4 个答案:

答案 0 :(得分:1)

如果球从顶部击中球拍,则否定Y速度。

如果球从侧面击中球拍,则否定X速度。

答案 1 :(得分:0)

反转垂直速度对于perfectly elastic collision是正确的做法,这是你在突破游戏中想要的(球在碰撞后保持它的总速度)。

通过随机化初始球位置和速度,或通过将碰撞动力学改为不现实,可以避免遵循相同路线的问题。您可以向两个坐标添加一个小的随机分量(注意保持总速度相同),或者以不同的角度发送球,具体取决于它击中垫的位置(这是许多类型的游戏所做的)

要做到这一点,你需要计算球撞击打击垫的绝对位置,将其标准化(通过减去打击垫位置并除以打击垫长度),并将其映射到一个角度范围(可能是-80到80度)。然后,您可以使用三角函数计算所需的水平和垂直速度。

答案 2 :(得分:0)

一个想法可能是使用桨的运动来稍微改变方向。比方说,如果击球时击球向右移动,除了反转Y方向外,还要将球的X速度向右移动一点。这为用户提供了一种实际使用某种技能将正确的“英语”放在球上的方法。

答案 3 :(得分:0)

涉及两个独立的问题,一个设计问题和一个物理问题。最后,物理问题可能有更简单的解决方案:

  1. 计算划水板上的碰撞点
  2. 计算桨叶的瞬时水平速度pvx
  3. 计算撞击点处的标准外表面法线(nx,ny)。这是设计决定,在桨的中间部分可能想要(nx,ny)=(0,1),而在左侧(nx,ny)=( - 1,0)或通常在WNW方向,在右侧相应地(nx,ny)=(1,0)或在一般的ENE位置。
  4. 使用物理公式与移动的无限大质量对象进行碰撞,以计算新的速度向量(vx,vy):

    dot = nx*(vx-pvx)+ny*vy
    vx = vx - 2*dot*nx
    vy = vy - 2*dot*ny
    

    如果划桨和球在碰撞后没有足够快地分开,可以检查点积dot是否为正,以避免虚假碰撞计算。