使用矢量旋转(OpenGL ES)

时间:2011-12-26 00:35:26

标签: opengl-es vector rotation

我有一个问题,我无法理解。

我使用球体,当用户触摸球体上的任何位置时,我会在opengl坐标中得到一个3D矢量(x,y,z)形式的点。

我在球体上也有一个定义的点,也是一个3D矢量。

例如:

  

real V x:-0.2881811,y:0.25460157,z:0.9231087

其中“真实V”是定义为开头的点。 (球体的读数为1.0)

在使用gl.glRotatef旋转球体后,我想用OpenGL坐标“真实V”来确定新点。

通过这样做我使用这样的东西:

real.rotate(-model.getRotationX(), 1f, 0f, 0);
    real.rotate(-model.getRotationY(), 0f, 1f, 0);

其中“getRotationX和Y是球体的总旋转(我知道是正确的)。

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

    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的原始向量添加到“真(V)”向量来翻译向量“real(V)”时,我相信我会在spehere上获得正确的新点,我将能够例如,在。

设置一个标志或类似物

问题是在向量旋转后某些事情没有正确。

如果我不旋转球体从而不旋转矢量,一切都成为我想要的方式。但是当我旋转它时,旋转越多,我就越来自正确的点。

以下是LogCat的概要:

real V x:-0.2881811,y:0.25460157,z:0.9231087
旋转V x:0.10823092,y:0.79800075,z:0.5928582
添加V x:0.10823092,y:0.79800075,z:-3.4071417
减去V x:0.10823092,y:0.79800075,z:0.5928583
backRotated 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());

不是那么远,关键点总是在它应该的位置附近,但仍然......

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

1 个答案:

答案 0 :(得分:4)

使用矩阵运算顺序非常重要。如果围绕每个轴单独旋转,为了撤消这些操作,您需要以相反的顺序执行逆操作以恢复原始矢量。

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

如果您还没有线性代数,我建议稍微研究一下,因为在进行图形编程时,良好的基本理解非常有用。