OpenGL ES 2.0:在Android上围绕自身旋转对象

时间:2012-05-11 12:19:44

标签: android opengl-es

我正在尝试旋转移动物体,但它围绕坐标系统的中心旋转。如何让它在移动时绕自身旋转?代码是:

Matrix.translateM(mMMatrix, 0, 0, -y, 0);
Matrix.setRotateM(mMMatrix, 0, mAngle, 0, 0, 1.0f);
y += speed;
Matrix.translateM(mMMatrix, 0, 0, y, 0); 

3 个答案:

答案 0 :(得分:2)

不要使用视图矩阵来旋转对象,此矩阵用作所有场景的摄像机。要变换对象,您应该使用模型矩阵。要围绕其自己的中心旋转,您可以使用以下方法:

public void transform(float[] mModelMatrix) {
    Matrix.setIdentityM(mModelMatrix, 0);
    Matrix.translateM(mModelMatrix, 0, 0, y, 0);
    Matrix.rotateM(mModelMatrix, 0, mAngle, 0.0f, 0.0f, 1.0f); 
}

不要忘记使用单位矩阵来重置每个循环中的转换。

我认为你的代码很糟糕。您应该在应用任何转换之前更新'y'的值。

public void onDrawFrame(GL10 gl) {
    ...
    y += speed;
    transform(mModelMatrix);
    updateMVP(mModelMatrix, mViewMatrix, mProjectionMatrix, mMVPMatrix);
    renderObject(mMVPMatrix);
    ...
}

updateMVP方法将结合模型,视图和投影矩阵:

private void updateMVP( 
        float[] mModelMatrix, 
        float[] mViewMatrix, 
        float[] mProjectionMatrix,
        float[] mMVPMatrix) {

    // combine the model with the view matrix
    Matrix.multiplyMM(mMVPMatrix, 0, mViewMatrix, 0, mModelMatrix, 0);

    // combine the model-view with the projection matrix
    Matrix.multiplyMM(mMVPMatrix, 0, mProjectionMatrix, 0, mMVPMatrix,   0);
}

最后,渲染方法将执行着色器绘制对象:

public void renderObject(float[] mMVPMatrix) {

    GLES20.glUseProgram(mProgram);

    ...

    // Pass the MVP data into the shader
    GLES20.glUniformMatrix4fv(mMVPMatrixHandle, 1, false, mMVPMatrix, 0);

    // Draw the shape
    GLES20.glDrawElements (...);
}

我希望这会对你有所帮助。

答案 1 :(得分:0)

你在哪里画对象?

我想这是在你提到的代码之后,例如:

Matrix.translateM(mMMatrix, 0, 0, -y, 0);
Matrix.setRotateM(mMMatrix, 0, mAngle, 0, 0, 1.0f);
y += speed;
Matrix.translateM(mMMatrix, 0, 0, y, 0); 
drawHere();//<<<<<<<<<<<<<<<<<<<

然后,第二个翻译电话是问题。 您应该在第二次翻译之前移动您的绘制调用。 要么 干净的方法是:

Matrix.setIdentityM(mMMatrix, 0);//<<<<<<<<added
Matrix.translateM(mMMatrix, 0, 0, -y, 0);
Matrix.setRotateM(mMMatrix, 0, mAngle, 0, 0, 1.0f);
y += speed;
//Matrix.translateM(mMMatrix, 0, 0, y, 0); //<<<<<<<<<removed
drawHere();

答案 2 :(得分:0)

我只使用了视图矩阵而不是模型矩阵,一切都解决了。有关模型,视图和投影矩阵的详细信息see