我希望一个正方形(由head
表示)始终面向鼠标(由Mouse
表示 - 是的,它是LWJGL)。我实际上遇到了一些麻烦,因为我正在使用glRotatef(angle)
,
Math
函数涉及弧度我掀起了以下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中有更好的方法吗?)
答案 0 :(得分: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操作,但是您需要进行额外的测试以确定象限并避免除以零。它可能仍然是一个更快的头发,但可能不值得。