存储由函数opengl创建的矩阵

存储由函数opengl创建的矩阵,opengl,matrix,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.

我想知道是否有一种简单的方法可以将创建的矩阵存储到一个变量中,稍后由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);
}

目标是将生成的矩阵存储到一个单独的变量中,以有效地保存当前矩阵状态,然后再在其上相乘。

我已经建议ET停止使用GL矩阵堆栈。它已被删除,并已从现代OpenGL的核心配置文件中删除。可以使用类似的库来代替

但是,您所要求的可以通过矩阵堆栈来完成。只需与
GL\u MODELVIEW
matrix、
GL\u PROJECTION\u matrix
GL\u TEXTURE\u 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

利用您正在使用的传统功能,矩阵作为堆栈进行管理。或者更准确地说,作为4种矩阵模式中每种模式的单独堆栈,其中最常用的是
GL\u MODELVIEW
GL\u PROJECTION

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

  • Push
    :通过复制当前顶部条目来添加堆栈条目
  • Pop
    :删除当前顶部条目
假设先设置矩阵1,然后设置矩阵2,然后要恢复矩阵1。为了便于说明,我将矩阵1设置为旋转矩阵,矩阵2设置为平移矩阵,但它们当然可以是任何形式

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\u MODELVIEW\u MATRIX,…)
glGetFloatf(GL\u PROJECTION\u MATRIX,…)
获取当前矩阵,然后使用
glLoadMatrix()
再次设置它们。但是,如果您关心性能,您应该真正避免调用
glGet*()

不要使用GL矩阵堆栈,它多年来一直被弃用。切换到类似的矩阵库将自动解决您的问题。啊,这是基于示例结构的家庭作业的一小部分。我会看看glm,但我不确定使用外部库是否会让我的教授满意。@justkeepswiming:告诉你的教授,OpenGL矩阵堆栈从未被任何严肃的程序使用过;工作起来太麻烦了。OpenGL-2试图摆脱它,OpenGL-3终于做到了。值得一提的是,使用适当的矩阵数学库(如GLM)只会重新分配职责,但不会让你作弊。@JustKeepSwimming:哦,你的教授需要考虑的另一件事是:我共同创建的公司不久将招聘实习生,但我们只想要“最好的”,而且会有一场图形编程考试。任何一个写得和glLoadIdentity一样多的申请者都会得到负面评价,并发现自己马上就进入了圆形文件篮。我忍不住对你的第二条评论发笑,因为我有两个glLoadIdentity()函数。我直接从OpenGL3.0/3.1的opengl编程指南中提取了示例代码,示例代码中给出了这两个加载标识。如果你们有额外的资源,我可以查看,以使学习/编写opengl代码更容易,我希望有这些资源,这样我至少知道更有效的替代方案是什么。这正是我所寻找的!非常感谢。