OpenGL ES 2.0:无法执行简单的旋转

时间:2013-11-19 14:38:32

标签: android ios opengl-es

我在open gl es2中使用了以下行来旋转对象。 翻译和缩放可以正常工作,但不会发生轮换。

//modelViewMatrix is float[16];

Matrix.setIdentity(modelViewMatrix,0);
Matrix.translateM(modelViewMatrix, 0, x, y, z);
Matrix.rotateM(modelViewMatrix, 0, ax, 1, 0, 0);

//shader concatentation
//gl_Position = projection*modelview*position;

我尝试制作一个自定义矩阵进行旋转,但结果仍然相同。

如果我删除旋转线,那么平移就可以完美地工作,但是当我添加旋转线时,平移也会停止。

很惊讶地发现这种方法在iOS上的OpenGLES2中正常工作。

我该如何解决这个问题?什么是在Android上的OpenGL es2中旋转对象的正确方法。

1 个答案:

答案 0 :(得分:2)

由于还没有合格的答案,我会投入使用openGLES2来“拾取”的内容,这可能是准确的,也可能是不准确的。

我的代码似乎与ClayMontogmery所说的相似 - 我翻译我的模型矩阵然后有一个单独的float [16]矩阵来保持旋转(mCurrentRotation)。完成后,我将矩阵乘以并将结果放入一个临时矩阵,然后我将其用于投影(我的术语可能有点散乱),下面显示了我是如何进行平移和旋转的。我不久就从一些例子中拼凑起来了:

    Matrix.translateM(mModelMatrix, 0, 0.0f, 0.8f, -3.5f);

    // Set a matrix that contains the current rotation.
    Matrix.setIdentityM(mCurrentRotation, 0);
    Matrix.rotateM(mCurrentRotation, 0, mDeltaX, 0.0f, 1.0f, 0.0f);
    Matrix.rotateM(mCurrentRotation, 0, mDeltaY, 1.0f, 0.0f, 0.0f);

    // Multiply the current rotation by the accumulated rotation, and then set the accumulated rotation to the result.
    Matrix.multiplyMM(mTemporaryMatrix, 0, mCurrentRotation, 0, mAccumulatedRotation, 0);
    System.arraycopy(mTemporaryMatrix, 0, mAccumulatedRotation, 0, 16);

    // Rotate the model taking the overall rotation into account.
    Matrix.multiplyMM(mTemporaryMatrix, 0, mModelMatrix, 0, mAccumulatedRotation, 0);
    System.arraycopy(mTemporaryMatrix, 0, mModelMatrix, 0, 16);

然后在drawModel中我有

/* this multiplies the modelview matrix by the projection matrix, and stores the result in the MVP matrix (which now contains model * view * projection). */
Matrix.multiplyMM(mTemporaryMatrix, 0, mProjectionMatrix, 0, mMVPMatrix, 0);

onSurfaceCreated的最后一行:

Matrix.setIdentityM(mAccumulatedRotation, 0);

这可能无法完全回答您的问题,但此代码适用于我需要的内容,因此您可以从中获取一些内容。我提前道歉,如果其中任何一个是“天真的”,我对此的了解最多,我只回答,因为没有其他人给出任何可用的答案。