正在计算 java 中的反弹角度

Calculating angle of rebound in java

我正试图在 Slick 中将弹丸从墙上弹开。当墙是垂直或水平时,我可以反转射弹的 x 或 y 速度,但如果不是这种情况,我就会很挣扎。我在 C# 中找到了类似问题的另一个答案,并尝试实现它,但结果是球每次都以 180 度角离开。我有的是:

Vector2f norm = wall.getNormal();
float comp = (vect.dot(norm)/norm.dot(norm));
Vector2f u = new Vector2f(norm.getX()*comp,norm.getY()*comp);
Vector2f w = new Vector2f(vect.getX()-u.getX(),u.getX());
vect.set(w.getX()-u.getX(),w.getY()-u.getY());

wall 是我试图反弹的 Vector2f(从线转换为矢量,但不确定是否有必要),vect 是我的射弹的轨迹。

任何建议都会很有帮助。如果有人能向我解释一个答案而不是仅仅给我代码,我会很高兴,因为我想我以后可能需要实现一些稍微不同的东西。 谢谢

这里的答案最终将主要是一个数学问题。我简要回顾了所涉及的 math/physics 并相信您应该能够自己在代码中实现 math/physics。

射弹应该如何从墙上反弹 在经典物理学中,或者至少在经典物理学的合理代表性模型中,当弹丸与墙壁碰撞时,它离开墙壁的角度相对于墙壁的 'normal' 矢量的大小等于它相对于 'normal' 矢量接近墙壁的幅度。换句话说,画一条垂直于物体碰撞的墙的线。这条线和你的射弹向墙壁移动的矢量之间的角度将与你的射弹远离墙壁的矢量的角度相同。

这是针对光线最常讨论的问题,但对于简单的抛射物,它的工作方式相同。 http://hyperphysics.phy-astr.gsu.edu/hbase/phyopt/fermat.html

如何计算这些角度 假设您有一个墙的法线向量和一个射弹向量。对于二维向量,这实际上很容易。你应该在这里有几个不错的选择。一种方法可能是获取两个向量的角度并将它们相减以找出差异。

现在我们知道了角度的大小,但我们现在需要创建一个具有相同角度但位于法向量另一侧的向量。您的矢量库允许您方便地按给定角度调整矢量。您应该能够采用射弹的当前速度矢量并在正确的方向上将其调整为它与法向墙矢量之间的角度的两倍,并获得所需的速度矢量 post-反射。我要留给您的技巧是确定是否需要顺时针或逆时针方向调整向量的好方法。

关于 Vector2f 的一些注意事项

  • getNormal() 方法returns 与矢量方向相同的单位矢量
  • 如果你想要一个垂直于某个向量的向量,你必须使用getPerpendicular()方法
  • 使用sub(double theta) 方法
  • 可以将向量 rotated/adjusted 一定角度
  • 如果您想检索矢量的角度,可以使用 getTheta() 方法