我在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中旋转对象的正确方法。
答案 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);
这可能无法完全回答您的问题,但此代码适用于我需要的内容,因此您可以从中获取一些内容。我提前道歉,如果其中任何一个是“天真的”,我对此的了解最多,我只回答,因为没有其他人给出任何可用的答案。