0

我想要一个正方形(由 表示head)始终面向鼠标(由Mouse- 是的,它是 LWJGL 表示)。由于我正在使用glRotatef(angle)它,我实际上很难让它面向鼠标

  1. 需要度数,而大多数 javaMath函数都涉及弧度
  2. 很难做到,因为我无法知道我必须旋转多远才能指向鼠标

我编写了以下 java 代码,它假设 0 度是直的:

double mx = Mouse.getX();
double my = Mouse.getY();
double rx = head.x;
double ry = head.y + 1;
double vx = head.x;
double vy = head.y;
double mtor = Math.sqrt(Math.pow(mx + rx, 2) + Math.pow(my + ry, 2));
double mtov = Math.sqrt(Math.pow(mx + vx, 2) + Math.pow(my + vy, 2));
double rtov = Math.sqrt(Math.pow(rx + vx, 2) + Math.pow(ry + vy, 2));
double rotate = Math.toDegrees(Math.acos((Math.pow(mtov, 2) + Math.pow(rtov, 2) - Math.pow(mtor, 2))/(2*mtov*rtov))));

但是,这会产生一些奇怪的结果:

什么

(有白色方块的一面是正面。完整专辑请访问http://imgur.com/a/4DwFg

这是一些控制台输出:

Mouse X: 555.0
Mouse Y: 439.0
Reference X: 400.0
Reference Y: 301.0
Vertex X: 400.0
Vertex Y: 300.0
Rotation: 65.56236879269605

Mouse X: 552.0
Mouse Y: 440.0
Reference X: 400.0
Reference Y: 301.0
Vertex X: 400.0
Vertex Y: 300.0
Rotation: 65.5244609346555

那么,我做错了什么?(额外的信用:在openGL中有没有更好的方法来做到这一点?)

4

1 回答 1

1

这假设 0 度是直线向上,逆时针是正数,x 向右增加,y 向上增加。(我不知道这是否适用于 LWJGL。)我使用的范围是 -180 到 180,而不是 0 到 360,因为这看起来更自然(例如,如果头部要缓慢旋转)

double dx = (mx-vx); // change in x from head to mouse
double dy = (my-vy); // change in y from head to mouse
double dist = Math.sqrt(dx*dx + dy*dy); // distance, pythagorean theorem
double degrees = Math.toDegrees((Math.acos(dy/dist)) * -Math.signum(dx));
        // dy/dist is the cosine
        // the sign of dx determines positive (CCW) or negative (CW) angle

如果您担心性能,您可以通过使用 atan 来避免 sqrt 操作,但是您需要进行额外的测试来确定象限并避免除以零。它仍然可能会更快,但可能不值得。

于 2013-07-10T00:43:45.233 回答