4

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

我采用了将速度旋转 90 度的简单方法,即:

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

哪个(不出所料)效果不佳。如果我知道球的位置和速度,以及球会击中的点(但会反弹),我怎么能从那个点反弹呢?

约束:

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

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

谢谢!

4

7 回答 7

5

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

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

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

于 2010-05-16T19:10:48.970 回答
5

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

于 2010-05-16T19:11:23.470 回答
4

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

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

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

于 2010-05-16T19:14:09.987 回答
3

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

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

于 2010-05-16T19:37:24.690 回答
3

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

退出角度 = 180 - 影响角度。

于 2010-05-16T19:11:34.907 回答
1

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

于 2010-05-16T19:12:01.257 回答
0

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

于 2010-05-16T19:37:09.243 回答