java - 如何旋转对象以始终面对鼠标?
问题描述
我正在尝试制作游戏,并且我需要玩家(矩形)始终看着鼠标,我已经找到了一些关于此的页面,但我似乎无法理解数学。主要的:
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
解决方案
你应该使用线性代数——而不是使用正弦和余弦,你使用向量。
如果你有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。
推荐阅读
- javascript - 日期和时间过滤不适用于数据表的日期
- excel - Excel VBA - 组合 If 语句
- angular - 如何使用 Angular 5 向 Web API 插入数据
- python - pandas 数据框行的所有可能组合
- javascript - 我可以随时间变化更改输入标签单选检查值吗?
- javascript - 如何从 Kendo 获取 Id 复选框
- c# - C# - 获取具有指定 DNS 服务器名称的 IP 地址
- c# - 如何在 Avalonia 中扩展控制?
- node.js - 如何在快速路线中显示图像
- java - 在 onClick() 中实例化 ui 元素与在 Fragment 中实例化 onCreateView