使用三个点找到角度

时间:2013-07-09 23:07:46

标签: java math lwjgl

我希望一个正方形(由head表示)始终面向鼠标(由Mouse表示 - 是的,它是LWJGL)。我实际上遇到了一些麻烦,因为我正在使用glRotatef(angle)

  1. 需要度数,而大多数java Math函数涉及弧度
  2. 很难做到,因为我无法知道我需要旋转多远才能指向鼠标
  3. 我掀起了以下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))));
    

    然而,这会产生一些奇怪的结果:

    What

    (带有白色方块的一侧是正面。对于完整的专辑,请转到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中有更好的方法吗?)

1 个答案:

答案 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操作,但是您需要进行额外的测试以确定象限并避免除以零。它可能仍然是一个更快的头发,但可能不值得。