【问题标题】:Bouncing a ball off a surface将球从表面弹起
【发布时间】:2011-02-20 03:54:36
【问题描述】:

我目前正在编写一个像 Breakout 这样的游戏,我想知道如何才能正确地将球从表面反弹。

我采用了将速度旋转 90 度的幼稚方式,即:

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

其中(不出所料)效果不佳。如果我知道球的位置和速度,以及球会击中的点(但会反弹),我该如何将球从该点反弹?

约束:

  • 我正在使用整数数学(无 FP 任何地方)
  • 我所有的表面都很简单 平面(垂直, 水平,或块)
  • 我只想以 90 度角反弹
  • 所有碰撞都是纯弹性的(这是突破 -- 无需摩擦等)

我不需要任何特定于语言的代码。如果有人可以提供一个关于如何正确执行此操作的小型数学公式,那么这对我来说很好。

谢谢!

【问题讨论】:

  • 将速度旋转 180° 将是 [vx, vy] -> [-vx, -vy]。你现在旋转了 90°。
  • 我错了,我的意思是写 90 度,而不是 180 度。
  • 要获得适当的突破,您还必须将动作从球棒转移到球上。

标签: collision game-physics


【解决方案1】:

假设你只会从垂直或水平表面反弹,你可以分别否定 X 或 Y 方向的速度。

所以,如果你有 [vx, vy],它会从垂直墙上反弹,你将有 [-vx, vy]。

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

【讨论】:

  • 我怎么知道它是垂直穿墙还是水平穿墙?
【解决方案2】:

我会在水平墙壁上尝试 [vx, vy] -> [vx, -vy],在垂直墙壁上尝试 [vx, vy] -> [-vx, vy]。

【讨论】:

    【解决方案3】:

    您正在围绕垂直于撞击点表面的线反射矢量。二维:

    exit_angle = 180 - Impact_angle。

    【讨论】:

      【解决方案4】:

      您需要知道球的表面和速度。例如,从平行于 x 轴的线反弹 [vx, vy] 将变为 [vx, -vy]。如果直线平行于 y 轴,则 [vx, vy] 将变为 [-vx, vy]。如果线不平行于任一轴,则更复杂,但您正在寻找沿表面方向性的速度的简单反映( x, y 轴的 (1, 0) 和 (0, 1) )。

      【讨论】:

        【解决方案5】:

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

        对于水平/垂直表面,法线很容易计算。对于更复杂的表面,它可能取决于表面的方程等。

        此外,这假设球的能量不变。如果考虑到摩擦/热损失/球的旋转等,它可能会变得复杂。

        【讨论】:

        • 谢谢。这解决了我的问题。我试图创建一个统一的反弹函数,它可以在任何东西上工作,所以我可以在任何表面(块、墙、桨)的接触点上调用它。
        【解决方案6】:

        轴对齐框的 90 度反射只是适当地反转 X/Y 速度符号的问题。除此之外,它需要一个点积和一个小向量旋转,但该数学仍然非常安全 - 如果需要,可以很容易地作为定点完成。

        【讨论】:

        • 虽然这是正确的并且准确地回答了 OP 的问题,但就 OP 实际想要的而言,这是不正确的。想象一个球垂直于墙壁移动;你不希望那个球“反弹”并开始平行于墙壁移动。
        【解决方案7】:

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

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-07-20
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多