存储由函数opengl创建的矩阵

时间:2015-03-21 01:09:20

标签: opengl matrix

我想知道是否有一种简单的方法可以将创建的矩阵存储到变量中,稍后由glLoadMatrix()调用,重点是将矩阵重置为较早的状态。

例如:

void reshape(int w, int h){
    glViewport(0, 0, (GLsizei)w, (GLsizei)h);
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    gluPerspective(dist, (GLfloat)w / (GLfloat)h, 1.0, 20.0);
    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();
    glTranslatef(x_shift, y_shift, z_shift);
}

目标是将生成的矩阵存储到一个单独的变量中,以便在乘以它之前有效地保存当前矩阵状态。

2 个答案:

答案 0 :(得分:0)

我已经建议完全停止使用GL矩阵堆栈。它被删除并已从现代OpenGL的核心配置文件中删除。可以使用像glm这样的库。

但是,您要求的是矩阵堆栈。只需使用glGetFloatv()GL_MODELVIEW矩阵,GL_PROJECTION_MATRIXGL_TEXTURE_MATRIX来查询当前相应的矩阵:

GLfloat m[16];
glGetFloatv(GL_MODELVIEW_MATRIX, m);
// other GL code modifying the MODELVIEW matrix
// ...
glMatrixMode(GL_MODELVIEW); // make sure we restore to MODELVIEW
glLoadMatrixf(m); // restore it

答案 1 :(得分:0)

使用您正在使用的旧版功能,矩阵作为堆栈进行管理。或者确切地说,作为4种矩阵模式中每种模式的单独堆栈,其中最常用的是GL_MODELVIEWGL_PROJECTION

保存/恢复矩阵的最直接方法是使用此矩阵堆栈上的实际堆栈操作,该操作由glPushMatrix()glPopMatrix()完成,其中Push和{{1遵循通常的堆栈语义:

  • Pop:通过复制当前的顶部条目添加堆栈条目。
  • Push:删除当前的顶部条目。

假设您首先设置矩阵1,然后设置矩阵2,然后想要恢复矩阵1.为了说明,我将矩阵1设置为旋转矩阵,矩阵2设置为平移矩阵,但它们当然可以是任何东西。

Pop

您还可以使用glMatrixMode(GL_MODELVIEW); glLoadIdentity(); glRotatef(...); // This is our matrix 1, now on top of the stack. glPushMatrix(); // Push a new stack entry, to save matrix 1. glLoadIdentity(); glTranslatef(...); // Now we have matrix 2 on top of the stack. glPopMatrix(); // Since we popped the top entry (matrix 2) off the stack, matrix 1 is // now the active matrix at the top of the stack again. glGetFloatf(GL_MODELVIEW_MATRIX, ...)获取当前矩阵,然后使用glGetFloatf(GL_PROJECTION_MATRIX, ...)再次设置它们。但是,如果您完全关心性能,则应该避免glLoadMatrix()次呼叫。