Java 计算OpenGL旋转的角度

Java 计算OpenGL旋转的角度,java,opengl,math,rotation,vector-graphics,Java,Opengl,Math,Rotation,Vector Graphics,我计算这个角度有点困难,我希望你们中的一个天才能帮我 我有一个加农炮游戏,可以在游戏世界的任何地方。使用OpenGL的矩阵变换,我想让加农炮的纹理朝着玩家放手指的任何方向旋转。为此,我需要计算发送到旋转矩阵的角度 目前我在正确计算角度方面有点困难 如图所示: 图例: A) 始终指向屏幕顶部的恒定单位向量。 B) 根据用户单击屏幕的位置设置的点。 θ)我需要测量的角度 如你们所见,我使用一个恒定的单位向量,它总是指向上作为基线(a)。我的算法需要做的是正确测量A和B之间的角度(θ) 下面是设置目

我计算这个角度有点困难,我希望你们中的一个天才能帮我

我有一个加农炮游戏,可以在游戏世界的任何地方。使用OpenGL的矩阵变换,我想让加农炮的纹理朝着玩家放手指的任何方向旋转。为此,我需要计算发送到旋转矩阵的角度

目前我在正确计算角度方面有点困难

如图所示:

图例: A) 始终指向屏幕顶部的恒定单位向量。 B) 根据用户单击屏幕的位置设置的点。 θ)我需要测量的角度

如你们所见,我使用一个恒定的单位向量,它总是指向上作为基线(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);
“FinDangleBetweetwoVectors”方法似乎不起作用。代码如下:

 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));
}
我知道这可能是一个向量数学问题,我只是不能正确计算角度


提前感谢您的帮助。

获取B的坐标,并从中减去加农炮的坐标,得到指向所需方向的矢量。Java atan2函数可用于获取向量的角度(以弧度为单位)。要获得相对于上方向向量的角度,请顺时针方向,将参数按x,y的顺序传递给atan2,而不是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向量是任意的,那么您的原始答案看起来几乎正确,但您需要像评论员所说的那样转换为度,还可能需要检查您的答案是顺时针还是逆时针。

您的向量数学看起来正确,但
math.acos
方法返回以弧度为单位的值。如果这是你想要的,那么我不确定是什么错了。这里有一个非常相似的问题