gpt4 book ai didi

java - java计算回弹角度

转载 作者:行者123 更新时间:2023-12-02 04:56:38 25 4
gpt4 key购买 nike

我正在尝试在 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com