2011-04-08 54 views
1

我已阅读其使像这样的立方体(只有关键部分)的码:OpenGL:如何根据以前的转换结果进行新的转换?

static GLfloat theta[] = {0.0,0.0,0.0}; 
static GLint axis = 2; 

void display(void) 
{ 
/* display callback, clear frame buffer and z buffer, 
    rotate cube and draw, swap buffers */ 

glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 
    glLoadIdentity(); 
    glRotatef(theta[0], 1.0, 0.0, 0.0); 
    glRotatef(theta[1], 0.0, 1.0, 0.0); 
    glRotatef(theta[2], 0.0, 0.0, 1.0); 

colorcube(); 

glFlush(); 
    glutSwapBuffers(); 
} 

void spinCube() 
{ 

/* Idle callback, spin cube 2 degrees about selected axis */ 

    theta[axis] += 2.0; 
    if(theta[axis] > 360.0) theta[axis] -= 360.0; 
    /* display(); */ 
    glutPostRedisplay(); 
} 

void mouse(int btn, int state, int x, int y) 
{ 

/* mouse callback, selects an axis about which to rotate */ 

    if(btn==GLUT_LEFT_BUTTON && state == GLUT_DOWN) axis = 0; 
    if(btn==GLUT_MIDDLE_BUTTON && state == GLUT_DOWN) axis = 1; 
    if(btn==GLUT_RIGHT_BUTTON && state == GLUT_DOWN) axis = 2; 
} 

它保持一个可变thetadisplay功能以外,跟踪角的变化 。每次它只是重新定义矩阵转换 矩阵,然后它看起来像新的转换基于最后一个 。

但是,这仅仅是旋转的情况。当考虑到翻译和 翻译。我觉得很难用类似的方法其中 保持一些变量外跟踪转换和每一次重新定义了 矩阵,因为旋转和平移是不能互换的

我的一个想法是使用glPushMatrixglPopMatrix。但我不知道 是否这是处理这样的事情的标准方式。

你能帮忙吗?谢谢。

回答

1

是的,当您想要更改模型视图矩阵时,这是标准方法,这就是glPushMatrix()glPopMatrix()所做的,将当前的模型视图矩阵保存在矩阵堆栈上。

比方说,你有第二个对象,一个球体,它的坐标有不同的变化,参数只是在OX轴上平移-5。

如果你尝试:

//for spehere 
glTranslatef(-5.0f,0.0f,0.0f): 

drawSphere(); 

//for cube 
glTranslatef(-1.0f,0.0f,0.0f) 
glRotatef(theta[0], 1.0, 0.0, 0.0); 
glRotatef(theta[1], 0.0, 1.0, 0.0); 
glRotatef(theta[2], 0.0, 0.0, 1.0); 

drawCube(); 

你会实际上是由-6.0上牛年轴,而不是-5.0翻译你的立方体。

要解决这个问题,您只需要使用glPushMatrix(), glPopMatrix()

//for spehere 
glPushMatrix(); 
glTranslatef(-5.0f,0.0f,0.0f): 

drawSphere(); 
glPopMatrix(); 

//for cube 
glPushMatrix(); 

glTranslatef(-1.0f,0.0f,0.0f) 
glRotatef(theta[0], 1.0, 0.0, 0.0); 
glRotatef(theta[1], 0.0, 1.0, 0.0); 
glRotatef(theta[2], 0.0, 0.0, 1.0); 

drawCube(); 

glPopMatrix(); 

这样您可以保存您的原始模型视图矩阵,以便您可以为每个对象应用正确的转换。

+0

嗯,那不是我的问题。但是'glPushMatrix'和'glPopMatrix'起作用。谢谢你们一样。 – Roun 2011-04-09 07:19:04