我想知道是否有一种简单的方法可以将创建的矩阵存储到变量中,稍后由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);
}
目标是将生成的矩阵存储到一个单独的变量中,以便在乘以它之前有效地保存当前矩阵状态。
答案 0 :(得分:0)
我已经建议完全停止使用GL矩阵堆栈。它被删除并已从现代OpenGL的核心配置文件中删除。可以使用像glm这样的库。
但是,您要求的是矩阵堆栈。只需使用glGetFloatv()
与GL_MODELVIEW
矩阵,GL_PROJECTION_MATRIX
或GL_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_MODELVIEW
和GL_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()
次呼叫。