如何旋转对象始终面对鼠标?
How to rotate object to always face mouse?
我正在尝试制作游戏,我需要玩家(矩形)始终看着鼠标,我找到了一些关于此的页面,但我似乎无法理解数学。
主要:
g2d.rotate(calculateRotation, x,y);
g2d.fill(player);
g2d.rotate(-calculateRotation, x,y);
鼠标监听器:
int mx = e.getX();
int mY = e.getY();
float rotation = Math.atan((mouseX-playerX)/(mouseY-playerY)); //<--- I don't know
would it be something like this?
您应该使用线性代数 - 而不是使用正弦和余弦,而是使用向量。
如果你有 P1=(x1,y1)(玩家所在的位置)和 P2=(x2,y2)(鼠标指针所在的位置),则得到向量 V=(x2-x1,y2-y1)=(v1,v2),其长度为 v=|V|=sqrt (v1^2+v2^2)。然后你有 versor(这是一个长度为 1 的向量) M=(v1/v,v2/v)=(m1,m2).
那么您可以通过映射 (x,y)->(x* m1-y* m2, x* m2+y*m1) 来旋转点,而不是计算角度。
另见 https://en.wikipedia.org/wiki/Rotation_matrix#In_two_dimensions
(记得注意V=0的情况)
注意:使用 atan 是可以的,但是你需要检查 x 和 y 的符号。如果它们都是负数,你会发现错误的角度;如果一个为正,另一个为负,您仍然不知道您的箭头指向 NW 还是 SE。
我正在尝试制作游戏,我需要玩家(矩形)始终看着鼠标,我找到了一些关于此的页面,但我似乎无法理解数学。 主要:
g2d.rotate(calculateRotation, x,y);
g2d.fill(player);
g2d.rotate(-calculateRotation, x,y);
鼠标监听器:
int mx = e.getX();
int mY = e.getY();
float rotation = Math.atan((mouseX-playerX)/(mouseY-playerY)); //<--- I don't know
would it be something like this?
您应该使用线性代数 - 而不是使用正弦和余弦,而是使用向量。
如果你有 P1=(x1,y1)(玩家所在的位置)和 P2=(x2,y2)(鼠标指针所在的位置),则得到向量 V=(x2-x1,y2-y1)=(v1,v2),其长度为 v=|V|=sqrt (v1^2+v2^2)。然后你有 versor(这是一个长度为 1 的向量) M=(v1/v,v2/v)=(m1,m2).
那么您可以通过映射 (x,y)->(x* m1-y* m2, x* m2+y*m1) 来旋转点,而不是计算角度。
另见 https://en.wikipedia.org/wiki/Rotation_matrix#In_two_dimensions
(记得注意V=0的情况)
注意:使用 atan 是可以的,但是你需要检查 x 和 y 的符号。如果它们都是负数,你会发现错误的角度;如果一个为正,另一个为负,您仍然不知道您的箭头指向 NW 还是 SE。