【问题标题】:How to rotate object to always face mouse?如何旋转对象以始终面对鼠标?
【发布时间】:2018-10-23 12:33:50
【问题描述】:

我正在尝试制作游戏,我需要玩家(矩形)始终注视鼠标,我找到了一些关于此的页面,但我似乎无法理解数学。 主要:

 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?

【问题讨论】:

  • 2D 还是 3D?更多信息会很好
  • @Grantly,2d,很抱歉造成混乱。
  • 你应该使用atan2,而不是atan,否则你无法区分直接面对鼠标和直接背对鼠标的区别。
  • 所以数学 Math.atan2((mouseX-playerX)/(mouseY-playerY)); ?
  • Math.atan2(mouseY-playerY, mouseX-playerX)

标签: java mouse rectangles drawing2d


【解决方案1】:

你应该使用线性代数——而不是使用正弦和余弦,你应该使用向量。

如果您有 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。

【讨论】:

  • 向量计算会比 sin/cos/tan 更快吗? (我倾向于认为向量更快,但重视你的发现)
猜你喜欢
  • 1970-01-01
  • 2013-03-17
  • 1970-01-01
  • 1970-01-01
  • 2013-05-25
  • 1970-01-01
  • 2017-02-28
  • 2016-08-25
  • 1970-01-01
相关资源
最近更新 更多