Java 基于接触点计算旋转时的小偏移

Java 基于接触点计算旋转时的小偏移,java,android,math,libgdx,Java,Android,Math,Libgdx,我需要在光标/触摸点上有一个精灵面。 接触点的矢量计算如下: game.getCamera().unproject( new Vector3().set(Gdx.input.getX(), Gdx.input.getY(), 0) , 0, 0, Gdx.graphics.getWidth(), Gdx.graphics.getHeight()) 然后我用以下方法计算精灵需要转动的度数: public void rotateTo(Vector3 vector) { double ang

我需要在光标/触摸点上有一个精灵面。 接触点的矢量计算如下:

game.getCamera().unproject(
new Vector3().set(Gdx.input.getX(), Gdx.input.getY(), 0)
, 0, 0, Gdx.graphics.getWidth(), Gdx.graphics.getHeight())
然后我用以下方法计算精灵需要转动的度数:

public void rotateTo(Vector3 vector) {
    double angle = Math.atan2(vector.y - position.y, vector.x - position.x);
    rotation = (float) Math.toDegrees(angle) - 90;
    sprite.setRotation(rotation);
}
问题在于某些旋转中存在小偏移,例如(红色圆点表示触摸位置,箭头是需要旋转的精灵),在第一张图片中,它大致位于应该的位置,但在其他图片中,它偏离了位置,是什么导致了此错误

正如您在前两张图片中看到的,X轴有一个小的变化,精确度会显著降低

更多示例:


不管原点是什么,位置都在左下角,因为原点是相对于位置的。因此,您是基于精灵的左下角而不是中心来计算角度的。如果要测量相对于精灵中心的角度,需要通过原点偏移位置

double angle = Math.atan2(
    vector.y - position.y - spriteOrigin.y, 
    vector.x - position.x - spriteOrigin.x);

在绘制精灵时也要记住这一点……它的位置总是在左下角,所以在设置其位置时要考虑到这一点。

我认为这不是问题所在,但在做旋转=(浮动)数学之类的事情时要小心。toDegrees(angle)-90我认为在这个例子中,它实际上会先进行减法运算,然后将结果转换为浮点,从而导致精度损失相当大的角度裕度。或者我可能错了。不管是哪种方式,通常最好是明确你的演员阵容。可能
rotation=((浮点)数学到角度))-90f其中f使90成为浮点,而(浮点)转换仅适用于方法
toDegrees
哦,还有,我的原始想法:确保精灵的原点设置在箭头的某个位置,而不是左上角。这可能是您的问题:)@ChristopherWirt尝试了
sprite.setOriginCenter(),我认为libgdx会将原点设置为默认的中心。但是精灵的中心实际上是沿着箭头的轴吗?这会使它看起来像关闭了一样。@ChristopherWirt是的,精灵有60像素宽,箭头的中心正好在30像素的中心。很明显:P很好,你注意到了+1.