Vector 旋转libgdx box2d中的向量,从加农炮发射炮弹

Vector 旋转libgdx box2d中的向量,从加农炮发射炮弹,vector,rotation,box2d,libgdx,Vector,Rotation,Box2d,Libgdx,我有一门大炮可以发射炮弹和烟雾粒子效果,我希望炮弹从大炮的末端开始,我可以通过将大炮的宽度添加到它的x位置,并将高度的一半添加到大炮。当加农炮未旋转时,这可以正常工作,但当我旋转加农炮时,其位置不正确。这就是我用来旋转向量的方法 Vector2 rotPos = cannon.position.tmp().add(cannon.bounds.width, cannon.bounds.height/2).rotate(cannon.angle); 我怎样才能得到一个旋转的向量来把炮弹发射到正确的

我有一门大炮可以发射炮弹和烟雾粒子效果,我希望炮弹从大炮的末端开始,我可以通过将大炮的宽度添加到它的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() );

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

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

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

你应该有这样的东西:

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

轰,你有你的y坐标

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

所以r*cos(角半径)=x

这是你的x坐标


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

我遇到了一个与你类似的问题。以下是问题和答案:

你需要像这样的东西

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

另请参阅函数GetWorldPoint,它可以使用
Vector2 rotPos=world.CannonBody.getWorldVector(world.CannonBody.getPosition())为您提供起始位置im如图所示,球不是从大炮末端射出,而是从左边射出。我正在使用setTransform旋转炮身。如何在旋转后获得炮身末端以从炮身末端射出球?我有正确的角度和速度,我只需要把球放在正确的位置。下面的代码可以工作,但只适用于0到45度的角度<代码>位置.tmp().add(bounds.width*(float)Math.cos(Math.toRadians(angle)),bounds.width*(float)Math.sin(Math.toRadians(angle))谢谢你的回答。我已经有一段时间没看代码了,这个问题有点老了,但我正在做的数学和你贴的类似。看到我上面的评论,它仍然不起作用?这个数学应该适用于角度θ的所有实际值,你确定你一开始就给它提供了正确的角度吗?如果不是这样的话,那么可能是因为您不正确地将像素坐标转换为box2d坐标。另外,你可能想考虑用哪种方法来定位炮弹。如果我的记忆正确,我会使用setTransform方法。另外,请确保您对x和y坐标分别使用了正确的trig函数,不仅仅是上面提到的,而是在代码中。。逆转它们会使它无法工作