Opengl es 矢量旋转(OpenGL ES)

Opengl es 矢量旋转(OpenGL ES),opengl-es,vector,rotation,Opengl Es,Vector,Rotation,我有一个问题,我不能动脑 我使用一个球体,当用户触摸球体上的任何地方时,我会得到一个三维矢量(x,y,z)形式的点,所有这些都在opengl坐标中 我在球体上还有一个定义点,也是一个3D向量 例如: 实际V x:-0.288181,y:0.25460157,z:0.9231087 其中“实V”是定义为开始的点。(球体的readius为1.0) 使用gl.glRotatef旋转球体后,我想用OpenGL坐标“real V”固定新点 通过这样做,我使用了如下内容: real.rotate(-mode

我有一个问题,我不能动脑

我使用一个球体,当用户触摸球体上的任何地方时,我会得到一个三维矢量(x,y,z)形式的点,所有这些都在opengl坐标中

我在球体上还有一个定义点,也是一个3D向量

例如:

实际V x:-0.288181,y:0.25460157,z:0.9231087

其中“实V”是定义为开始的点。(球体的readius为1.0)

使用gl.glRotatef旋转球体后,我想用OpenGL坐标“real V”固定新点

通过这样做,我使用了如下内容:

real.rotate(-model.getRotationX(), 1f, 0f, 0);
    real.rotate(-model.getRotationY(), 0f, 1f, 0);
    public Vector3 rotate(float angle, float axisX, float axisY, float axisZ)
{
    inVec[0] = x;
    inVec[1] = y;
    inVec[2] = z;
    inVec[3] = 1;

    Matrix.setIdentityM(matrix, 0);
    Matrix.rotateM(matrix, 0, angle, axisX, axisY, axisZ);
    Matrix.multiplyMV(outVec, 0, matrix, 0, inVec, 0);
    x = outVec[0];
    y = outVec[1];
    z = outVec[2];
    return this;
}
其中“getRotationX和Y是球体的总旋转(我知道这是正确的)

和真实。旋转看起来像这样:

real.rotate(-model.getRotationX(), 1f, 0f, 0);
    real.rotate(-model.getRotationY(), 0f, 1f, 0);
    public Vector3 rotate(float angle, float axisX, float axisY, float axisZ)
{
    inVec[0] = x;
    inVec[1] = y;
    inVec[2] = z;
    inVec[3] = 1;

    Matrix.setIdentityM(matrix, 0);
    Matrix.rotateM(matrix, 0, angle, axisX, axisY, axisZ);
    Matrix.multiplyMV(outVec, 0, matrix, 0, inVec, 0);
    x = outVec[0];
    y = outVec[1];
    z = outVec[2];
    return this;
}
在这样做的同时,通过将spehere的原始向量添加到“real(V)”向量来转换向量“real(V)”,我相信我会在spehere上获得正确的新点,例如,我可以在该点设置标志或类似标记

问题是在向量旋转之后,有些东西不正确

如果我不旋转球体,因此不旋转矢量,一切都会变成我想要的方式。但是当我旋转球体时,旋转的次数越多,我从正确的点出发的次数就越多

以下是LogCat的概述:

实际V x:-0.288181,y:0.25460157,z:0.9231087
旋转的V x:0.10823092,y:0.79800075,z:0.5928582
增加了x:0.10823092,y:0.79800075,z:-3.4071417
减去Vx:0.10823092,y:0.79800075,z:0.5928583
反向旋转的V x:-0.5257477,y:0.21287462,z:0.8235738

正如您所能看到的,由于某些原因,当反向旋转时,它与原始的不一样

    Vector3 real = Result.getRealVector(location);

    Log.d(TAG, "real V "+ real.toString());
    real.rotate(-model.getRotationX(), 1f, 0f, 0);
    real.rotate(-model.getRotationY(), 0f, 1f, 0);
    Log.d(TAG, "rotated V " + real.toString());

    real.add(model);
    Log.d(TAG, "added V " + real.toString());

    real.sub(model);
    Log.d(TAG, "subtracted V " + real.toString());
    real.rotate(model.getRotationX(), 1f, 0f, 0f);
    real.rotate(model.getRotationY(), 0f, 1f, 0f);

    Log.d(TAG, "backRotated V " + real.toString());
它不是那么远,点总是在它应该在的地方,但仍然

我知道可能很难理解我的问题,有点难以解释。
我希望有人能看到任何明显的问题。

矩阵运算的顺序非常重要。如果你绕每个轴单独旋转,为了撤销这些运算,你需要以相反的顺序执行反向运算,以恢复原始向量

real.rotate(-model.getRotationX(), 1f, 0f, 0f);
real.rotate(-model.getRotationY(), 0f, 1f, 0f);
...
real.rotate(model.getRotationY(), 0f, 1f, 0f);
real.rotate(model.getRotationX(), 1f, 0f, 0f);
从数学上说: (其中A和B为矩阵,A-1和B-1分别为逆矩阵,I为单位矩阵)

A*B*B-1*A-1==I

然而

A*B*A-1*B-1!=I


如果你还没有学习线性代数,我建议你学习一点,因为在做图形编程时,良好的基本理解是非常有帮助的。

你我的朋友刚刚解决了过去5个小时让我感到沮丧的问题,现在它就可以了。谢谢!