【问题标题】:Small offset when calculating rotation based on touch point基于触摸点计算旋转时的小偏移
【发布时间】:2014-07-15 13:25:09
【问题描述】:

我需要让精灵面对光标/触摸点。 触摸点的向量计算如下:

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);
}

问题是例如在某些旋转中存在一个小偏移(红点表示触摸位置,箭头是需要旋转的精灵),在第一张图片中它大致应该在它应该在的位置但在其他的都走了,是什么导致了这个错误?:

正如您在前 2 张图片中看到的那样,X 轴有微小的变化,准确度会急剧下降。

更多示例:

【问题讨论】:

  • 我不认为这是问题所在,但要小心像rotation = (float) Math.toDegrees(angle) - 90; 这样的事情我认为在这种情况下它实际上会先做减法,然后将结果转换为浮点数,从而导致角度的精度损失相当大。或者我可能是错的。无论哪种方式,通常最好明确说明您的演员表。也许rotation = ((float) Math.toDegrees(angle)) - 90f; 其中 f 使 90 成为浮点数,并且 (float) 强制转换仅适用于方法 toDegrees
  • 哦,另外,我最初的想法是:确保你将精灵的原点设置在箭头线的某处,而不是左上角之类的地方。这可能是你的问题:)
  • @ChristopherWirt 尝试做sprite.setOriginCenter();,结果相同,我认为 libgdx 默认将原点设置为中心。
  • 但是精灵中心实际上是沿着箭头的轴吗?这会让它看起来像是关闭了。
  • @ChristopherWirt 是的,精灵是 60 像素宽,箭头中心正好在中心 30 处。

标签: java android math libgdx


【解决方案1】:

无论原点如何,位置都在左下角,因为原点是相对于位置的。所以你是根据精灵的左下角而不是中心来计算角度。如果要测量相对于精灵中心的角度,则需要将位置偏移原点。

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

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

【讨论】:

  • 显而易见 :P 很好,你注意到了! +1
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-11-18
  • 1970-01-01
  • 1970-01-01
  • 2021-11-28
  • 2017-04-23
  • 2022-11-09
相关资源
最近更新 更多