【问题标题】:Rotating a vector in libgdx box2d, firing a cannon ball from a cannon在 libgdx box2d 中旋转矢量,从大炮发射炮弹
【发布时间】:2013-01-20 07:29:31
【问题描述】:

我有一个可以发射炮弹和烟雾粒子效果的大炮,我希望炮弹从大炮的末端开始,我可以通过将大炮的宽度添加到它的 x 位置并添加一半来做到这一点到大炮的高度。当大炮未旋转时,这可以正常工作,但是当我旋转大炮时,它不在正确的位置。这就是我用来尝试旋转矢量的方法。

Vector2 rotPos = cannon.position.tmp().add(cannon.bounds.width, cannon.bounds.height/2).rotate(cannon.angle);

我怎样才能得到一个旋转的矢量,在正确的位置发射炮弹。见下图。

更新 我也试过下面的,同样的结果,球向左飞了

Vector2 rotPos = world.CannonBody.getWorldVector( world.CannonBody.getPosition() );

【问题讨论】:

  • stackoverflow.com/questions/9164146/… 另见函数GetWorldPoint,它可以为您提供起始位置
  • 我使用Vector2 rotPos = world.CannonBody.getWorldVector( world.CannonBody.getPosition() );,球不是从大炮的末端射出,而是从图像左侧射出。我正在使用 setTransform 旋转炮身。
  • 如何让炮身旋转后从炮身末端射球?我有正确的角度和速度,我只需要将球设置在正确的位置。
  • 以下代码有效,但仅适用于 0 到 45 度之间的角度。 position.tmp().add(bounds.width * (float)Math.cos(Math.toRadians(angle)), bounds.width * (float) Math.sin(Math.toRadians(angle)) );

标签: vector rotation box2d libgdx


【解决方案1】:

按照您描述问题的方式,您只解决了一个案例。这真的只是一个数学问题。想想你想要射击的方向,大炮的枪管,作为一个圆圈上的坐标。

既然你知道角度,这很容易。在中心画一个圆点。然后从中心到右边缘画一条线。然后从第一条线向上以 45 度角画另一条线。用直线连接边缘上的两个点。你现在有一个三角形。

让我们将 45 度角线称为“r”。我们将第一行称为 x,最后一行称为 y。

您应该有如下所示的内容: http://i.stack.imgur.com/MJNWZ.jpg

我们知道 sin(angleInRadians) = y/r。做一点代数,我们可以把它变成 r*sin(angleInRadians) = y

Boom,你有你的 y 坐标。

几乎一样:cos(angleInRadians) = x/r

所以 r*cos(angleInRadians) = x

这是你的 x 坐标。

您可以直接从 box2d 中获取物体的角度,这很容易。您只需要为“r”选择一个值,该值代表您用来以给定角度概念化大炮枪管的圆的正确半径。如果大炮围绕圆心旋转,那么 r 就是你的大炮的长度。

【讨论】:

  • 感谢您的回答。我有一段时间没看代码了,这个问题有点老了,但我做的数学与你发布的类似。见我上面的评论
  • 还是不行?该数学应该适用于角度 theta 的所有实际值,你确定你从一开始就给它正确的角度吗?如果不是这样,那么可能是您错误地从像素坐标转换为 box2d 坐标。此外,您可能需要考虑使用哪种方法来定位炮弹。如果我没记错的话,我会使用 setTransform 方法。
  • 另外,请确保您分别为 x 和 y 坐标使用了正确的三角函数,不仅在上面,而且在您的代码中.. 反转它们会使它不起作用
【解决方案2】:

我遇到了一个和你类似的问题。这是有答案的问题:

Android. How to move object in the direction it is facing (using Vector3 and Quaternion)

你需要类似的东西

translation.set(baseDirection).rot(modelInstance.transform).nor()

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-30
    相关资源
    最近更新 更多