代码之家  ›  专栏  ›  技术社区  ›  Mike Bailey

把球弹离地面

  •  4
  • Mike Bailey  · 技术社区  · 15 年前

    我现在正在写一个像突破这样的游戏,我想知道我怎样才能把球弹离地面。

    [vx, vy] -> [-vy, vx]
    

    这(毫不奇怪)不太奏效。如果我知道球的位置和猛烈程度,以及球将击中的点(但将反弹离开),我如何将球反弹离开该点?

    约束条件:

    • 我使用整数数学(没有FP) 任何地方)
    • 平面(垂直, 水平,或块)
    • 我只想弹成90度角
    • 所有碰撞都是纯弹性的(这是突破——不需要摩擦等)

    我不需要任何特定语言的代码。如果有人能提供一个小的,数学公式,就如何正确地做到这一点,将工作的罚款为我。

    谢谢!

    7 回复  |  直到 15 年前
        1
  •  4
  •   Aryabhatta Aryabhatta    15 年前

    你需要计算接触点的法向量。沿法线方向的速度分量将改变方向,而垂直于法线方向的速度分量将保持不变。

    同样,这假设球的能量不变。如果你把摩擦/热损失/球的旋转等因素考虑进去,事情可能会变得复杂。

        2
  •  5
  •   retracile    15 年前

    假设你只是从垂直面或水平面上弹跳,你可以分别抵消X或Y方向的速度。

    如果你有[vx,vy],它从水平的墙上反弹,你就有[vx,-vy]。

        3
  •  5
  •   Kaniu    15 年前

    我想试试[vx,vy]->[vx,-vy]和[vx,vy]->[-垂直墙壁上。

        4
  •  3
  •   drawnonward    15 年前

    你是在撞击点处,围绕一条垂直于表面的线反射向量。在2D中:

        5
  •  3
  •   Oskar Alexanderson    15 年前

    假设在碰撞中没有能量损失,以速度(vx,vy)移动的球在弹离垂直表面后将以速度(-vx,vy)移动,在弹离水平表面后将以速度(-vx,-vy)移动。

    对于一般情况(使用任意法向量从平面上弹跳,仍然假设没有能量损失),请参阅维基百科计算部分下的这篇文章: http://en.wikipedia.org/wiki/Specular_reflection

        6
  •  1
  •   patros    15 年前

    你需要知道球的表面和速度。例如,从一条平行于x轴的直线上反弹[vx,vy]会变成[vx,-vy]。如果直线平行于y轴,那么[vx,vy]将变成[-vx,vy]。如果直线与任一轴都不平行,则情况更为复杂,但您要寻找沿曲面方向的速度简单反射((1,0)和(0,1)表示x,y轴)。

        7
  •  0
  •   Michael Dorgan    15 年前