计算OpenGL旋转的角度

时间:2015-02-18 04:07:27

标签: java opengl math rotation vector-graphics

我在计算这个角度时遇到了一些麻烦,我希望你们中的一个天才可以帮助我。

我有一个带有大炮的游戏,可以在游戏世界的任何地方。使用OpenGL的矩阵变换,我希望大炮的纹理旋转到面向玩家放置手指的任何方向。为此,我需要计算一个发送到旋转矩阵的角度。

目前我在正确计算角度时遇到一些麻烦。

见图:

enter image description here

注: A)始终指向屏幕顶部的常量单位矢量。 B)根据用户点击屏幕的位置设置的点。 theta)我需要测量的角度

如您所见,我使用恒定单位向量,该向量始终指向基线(A)。我的算法需要做的是正确测量A和B之间的角度(θ)。

以下是设定目标位置的代码:

    public void setTarget(Vector2 targetPos) {

    //calculate target's position relative to cannon
    targetPos = sub(targetPos, this.position);

    //replace target
    this.target = targetPos;

    //calculate new angle
    //This is broken
    this.cannonAngle = findAngleBetweenTwoVectors(POINT_UP, target);

" findAngleBetweenTwoVectors"方法似乎并不起作用。它的代码在这里:

 public static float findAngleBetweenTwoVectors(Vector2 baseVec, Vector2 newVec) {

    //first, make copies of the vectors
    Vector2 baseCopy = new Vector2(baseVec);
    Vector2 newCopy = new Vector2(newVec);

    //next, ensure they're normalized
    baseCopy.nor();
    newCopy.nor();

    //the arc-cosine is the angle between the two vectors
    //this is used as the "cannonAngle" value (does not work)

    return (float) Math.acos(newCopy.dot(baseCopy));
}

我知道这可能是一个矢量数学问题,我似乎无法正确地进行角度计算。

提前感谢您的帮助。

1 个答案:

答案 0 :(得分:0)

获取B的坐标并从中减去大炮的坐标,从而得出指向所需方向的向量。 Java atan2函数可用于获取弧度的向量角度。为了获得相对于向上矢量的角度,顺时针旋转,将参数以x,y而不是y,x的顺序传递给atan2(这将使结果从右指向的矢量逆时针旋转)。

所以您需要这样的东西:

double dx = b_x - cannon_x;
double dy = b_y - cannon_y;
double angle_in_degrees = Math.toDegrees(Math.atan2(dx,dy));

此答案假设A向量指向您,因此为(0,1)。如果A向量是任意的,那么您的原始答案看起来几乎是正确的,但是您需要按照评论者的说法转换为度,并可能还要检查您的答案是顺时针还是逆时针。