首页 文章

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

提问于
浏览
1

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

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

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

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

4 回答

  • 0

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

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

  • 0

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

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

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

  • 0

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

  • 1

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

    • 计算桨板上的碰撞点

    • 计算桨叶的瞬时水平速度pvx

    • 计算冲击点处的标准外表面法线(nx,ny) . 这是设计决定,在桨的中间部分可能想要(nx,ny)=(0,1),而在左侧(nx,ny)=( - 1,0)或一般在WNW方向,在右侧相应地(nx,ny)=(1,0)或在一般的ENE位置 .

    • 使用物理公式与移动的无限大质量对象进行碰撞,以计算新的速度向量(vx,vy):

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

    可以检查点积 dot 是否为正,以避免在碰撞后桨和球没有足够快地分离时的虚假碰撞计算 .

相关问题