【发布时间】: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 处。