Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/339.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
java中回弹角的计算_Java_Lwjgl_Computational Geometry_Slick2d - Fatal编程技术网

java中回弹角的计算

java中回弹角的计算,java,lwjgl,computational-geometry,slick2d,Java,Lwjgl,Computational Geometry,Slick2d,我正试图把一枚弹丸从光滑的墙上弹下来。当墙垂直或水平时,我可以反转射弹的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()*co

我正试图把一枚弹丸从光滑的墙上弹下来。当墙垂直或水平时,我可以反转射弹的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是一个向量2f,我正试图从中反弹(从一条直线转换为一个向量,但不确定这是否必要),vect是我的投射物的轨迹

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

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

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

这是最常见的光线讨论,但它的工作原理与简单的射弹相同。

如何计算这些角度 假设有一个向量表示墙的法线,还有一个向量表示射弹。对于二维向量,这实际上很容易。你应该有几个不错的选择。一种方法可能是得到两个向量的角度,然后减去它们来求差

现在我们知道了角度的大小,但我们现在需要创建一个角度相同但位于法向量另一侧的向量。矢量库可以方便地按给定角度调整矢量。您应该能够获取投射物的当前速度向量,并在正确方向上调整它,调整两倍于它与垂直于壁向量之间的角度,并在反射后获得所需的速度向量。我将留给你们去弄清楚的诀窍是一个很好的方法来确定你们是否需要顺时针或逆时针方向调整你们的向量

有关Vector2f的一些注意事项

  • getNormal()
    方法返回与向量方向相同的单位向量
  • 如果希望向量垂直于某个向量,则必须使用
    getvertical()
    方法
  • 可以使用
    sub(双θ)
    方法将矢量旋转/调整一定角度
  • 如果要检索向量的角度,可以使用
    getTheta()
    方法

非常感谢。我想我的主要问题是我认为getNormal给了我法向量。我将尝试实施这一计划,并让你知道进展如何。我现在必须给你一个假想的+1,因为我没有15的声誉。它似乎按照预期工作,虽然我还没有真正完成我正在做的工作,所以很难确定地测试它。一旦我确定它工作正常,我将把工作代码添加到第一条注释中(我认为这是合适的?)