我已经创建了一个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矩阵,后者用于处理更复杂的场景。