我目前正在编写像Breakout这样的游戏,我想知道如何才能在表面上正确地反弹球。
我采用天真的方式将速度旋转了90度,这是:
[vx, vy] -> [-vy, vx]
哪个(不出所料)没有那么好用。如果我知道球的位置和速度,以及球将击中的点(但是反而会反弹)我怎样才能将它从那一点反弹?
约束:
我不需要任何特定于语言的代码。如果有人能提供一个小的数学公式来说明如何正确地做到这一点对我来说很好。
谢谢!
答案 0 :(得分:5)
假设你只是从垂直或水平表面反弹,你可以分别否定X或Y方向的速度。
所以,如果你有[vx,vy],并且它从垂直墙反弹,你将[-vx,vy]。
如果你有[vx,vy],并且它从水平墙反弹,你将[vx,-vy]。
答案 1 :(得分:5)
我试试[vx,vy] - >水平墙上的[vx,-vy]和[vx,vy] - >垂直墙上的[-vx,vy]。
答案 2 :(得分:4)
您需要在接触点计算法向量。沿法线的速度分量将切换方向,而垂直于法线的速度分量将保持不变。
对于水平/垂直曲面,法线很容易计算。对于更复杂的表面,它可能取决于表面等式。
此外,这假设球的能量不会改变。如果考虑到摩擦/热量损失/球的旋转等,它可能会变得复杂。
答案 3 :(得分:3)
您正在围绕垂直于撞击点处表面的直线反射矢量。在2D中:
exit_angle = 180 - impact_angle。
答案 4 :(得分:3)
假设在碰撞中没有能量损失,以速度(vx,vy)行进的球将在从垂直表面反弹后以速度(-vx,vy)行进,并且在从水平方向反弹之后(vx,-vy)行进表面上。
对于一般情况(从具有任意法向量的平面反弹,仍然假设没有能量损失),请参阅计算部分下的这个维基百科文章:http://en.wikipedia.org/wiki/Specular_reflection
答案 5 :(得分:1)
你需要知道球的表面和速度。例如,平行于x轴[vx,vy]的线反弹将成为[vx,-vy]。如果线与y轴平行,则[vx,vy]将变为[-vx,vy]。如果线与任一轴不平行,则会更复杂,但是您正在寻找沿着曲面方向性((1,0)和(0,1)对x,y轴)的简单速度反射。
答案 6 :(得分:0)
轴对齐框的90度反射是适当地反转X / Y速度符号的问题。除此之外,它需要一个点积和一个小矢量,但数学仍然非常安全 - 如果需要,可以很容易地作为固定点完成。