OpenGL:如何根据以前的转换结果进行新的转换?

时间:2011-04-08 10:43:13

标签: c opengl glut

我已经阅读了一个像这样旋转立方体的代码(只有关键部分):

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;
}

它在theta函数之外保留变量display来跟踪 改变角度。每次它只是重新定义转型 矩阵,然后看起来新的转型是基于 最后一个。

然而,这只是轮换的情况。当旋转和 考虑翻译。我发现很难使用类似的方法 将一些变量保留在外面以跟踪转换并重新定义 每次都是矩阵,因为旋转和翻译不可互换

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

你能帮帮忙吗?谢谢。

1 个答案:

答案 0 :(得分:1)

是的,这是您想要更改模型 - 视图矩阵时的标准方法,即glPushMatrix()glPopMatrix()所做的,将当前模型视图矩阵保存在矩阵堆栈中。< / p>

假设你有第二个物体,一个球体,它的坐标有不同的变化,参数只是在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();

您实际上将在Ox轴上将您的立方体翻译为-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();

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