java - java计算回弹角度

标签 java lwjgl computational-geometry slick2d

我正在尝试在 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(从直线转换为 vector ,但不确定这是否有必要),而 vect 是我的射弹的轨迹。

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

最佳答案

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

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

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

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

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

有关 Vector2f 的一些注意事项

  • getNormal() 方法返回与 vector 方向相同的单位 vector
  • 如果您想要垂直于某个 vector 的 vector ,则必须使用 getPerpendular() 方法
  • 可以使用 sub(double theta) 方法将 vector 旋转/调整一定角度
  • 如果您想检索 vector 的角度,可以使用 getTheta() 方法

关于java - java计算回弹角度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28711583/

相关文章:

python - 确定和存储 Voronoi Cell Adjacency

java - 是否有任何关于 Spring MVC 与 Struts 2 和其他框架的使用情况的统计数据?

java - 使用 LWJGL 生成浮雕渲染?

java - 调用方法时将代码设置为属性

python - 点定位算法的正确数据结构

algorithm - 如何找出几何中位数

Java接口(interface)静态变量未初始化

java - 如何修复 spring security oauth 中不安全的 jwt-set-uri?

java - hibernate/C3P0 : Is there a way to check if the connection is down in real time?

java - 使用 LWJGL 在 glDrawElements 中偏移