我已经创建了一个Android应用程序来使用OpentGl绘制mCircle和mTriangle:

public void onDrawFrame(GL10 gl) {
    gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT);

    //Draw Triangle
    gl.glLoadIdentity();
    gl.glTranslatef(0.0f, 0.0f, -10.0f);
    mTriangle.draw(gl); // Draw triangle

    //Draw Circle
    gl.glTranslatef(-1.5f, 0.0f, -20.0f);
    mCircle.draw(gl);
}


我的问题是当我尝试通过以下方式移动mTriangle时:

   gl.glTranslatef(NewX, NewY, -10.0f);


然后mCircle也在移动!

我的问题是,如何仅移动mTriangle(mCircle的位置固定为(0,0))?还是可以在运行时更改mTriangle位置的命令?

最佳答案

将转换应用于当前模型矩阵。每个新的变换都累积在此矩阵中。为了保持初始转换,OpenGL(

//For each model

    glPushMatrix() //save current matrix

    // Apply current model transformations

    // Render model

    glPopMatrix() //restore matrix


因此,在您的代码中:

public void onDrawFrame(GL10 gl) {
    gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT);

    gl.glLoadIdentity();

    //Draw Triangle
    gl.glPushMatrix();
    gl.glTranslatef(NewX, NewY, -10.0f);
    mTriangle.draw(gl); // Draw triangle
    gl.glPopMatrix();


    //Draw Circle
    gl.glPushMatrix();
    gl.glTranslatef(-1.5f, 0.0f, -20.0f);
    mCircle.draw(gl);
    gl.glPopMatrix();

}


请注意,由于您的模型矩阵是Identity矩阵,因此您可以简单地在每个模型之间重新加载Identity来代替push / pop矩阵,后者用于处理更复杂的场景。

07-27 21:51