我试图在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());
墙壁是我试图反弹的Vector2f(从一条线转换为一个矢量,但不确定是否有必要)并且vect是我的射弹的轨迹。
任何建议都会有所帮助。如果有人可以向我解释答案而不仅仅是给我代码,我会很高兴,因为我认为我可能需要稍后实现稍微不同的东西。 感谢。
答案 0 :(得分:2)
这里的答案主要是数学问题。我简要介绍了所涉及的数学/物理,并相信你应该能够自己在代码中实现数学/物理。
弹丸是如何从墙上反弹的 在经典物理学中,或者至少在经典物理学的合理代表性模型中,当射弹与墙壁碰撞时,它离开墙壁相对于正常物理的角度的大小。墙的矢量等于它相对于正常的墙接近墙的大小。向量。换句话说,画一条垂直于物体碰撞的墙的线。此线与您的射弹向量移向墙壁的矢量之间的角度将与您的射弹远离墙壁的矢量角度相同。
这是最常见的光线讨论,但对于简单的射弹它的工作方式相同。 http://hyperphysics.phy-astr.gsu.edu/hbase/phyopt/fermat.html
如何计算这些角度 所以,让我们说你有一个用于墙的法线的矢量,以及一个用于射弹的矢量。对于二维向量,这实际上非常简单。你应该在这里有几个不错的选择。一种方法可能是获取两个向量的角度并减去它们以找到差异。
现在我们知道了角度的大小,但我们现在需要创建一个具有相同角度的矢量,但是在法线矢量的另一侧。您的矢量库可以方便地按给定角度调整矢量。您应该能够获取射弹的当前速度矢量,并在正确的方向上调整它与正常到墙矢量之间的角度的两倍,并在反射后获得所需的速度矢量。我将让你弄明白的一个好方法是确定你是否需要顺时针或逆时针方向调整矢量。
有关Vector2f
的一些注意事项getNormal()
方法返回与向量getPerpendicular()
方法sub(double theta)
方法getTheta()
方法