【问题标题】:Using glMatrixMode() in succession?连续使用glMatrixMode()?
【发布时间】:2019-10-10 19:35:49
【问题描述】:
如何连续使用两种不同的矩阵模式?即,假设我想使用glOrtho() 对投影矩阵进行一些操作。所以我打电话给glMatrixMode(GL_PROJECTION),然后执行操作。据我了解,使用glPushMatrix() 会将这些更改应用于投影矩阵。现在我想对模型视图矩阵进行一些更改。我对如何正确执行此操作感到困惑。我是弹出矩阵然后调用glMatrixMode 还是直接继续使用glMatrixMode?
【问题讨论】:
标签:
c
opengl
opengl-compat
【解决方案1】:
glPushMatrix 和glPopMatrix 用于存储/恢复当前选择的矩阵。它用于例如子网格(如机械臂),您需要返回到根子网格的状态...
您所描述的是glMatrixMode 的用途。所以你的代码应该是这样的:
glMatrixMode(GL_PROJECTION);
// here your stuff for setting projection
glMatrixMode(GL_MODELVIEW);
// here your stuff for setting modelview
您应该在处理矩阵的每个代码块之前调用glMatrixMode。不要期望当前矩阵设置为您将其设置为最后的东西。这会在以后导致混乱......例如,许多绘图算法会在运行时更改模型视图和/或纹理矩阵,并且在您的代码中您可以有这样的东西:
glMatrixMode(GL_MODELVIEW);
// here your stuff for setting modelview
glMatrixMode(GL_PROJECTION);
// here your stuff for setting projection
object1.draw();
// and here the current matrix could be changed from the object1.draw()
【解决方案2】:
glMatrixMode(GL_PROJECTION); glPushMatrix(); glLoadIdentity();
glOrtho(a, b, c,d, e,f);//
glMatrixMode(GL_MODELVIEW); glPushMatrix(); glLoadIdentity();
//----------
//----------
glMatrixMode(GL_PROJECTION); glPopMatrix();
glMatrixMode(GL_MODELVIEW); glPopMatrix();
【解决方案3】:
float mat_proj[16];
float mat_model[16];
glGetFloatv(GL_PROJECTION_MATRIX,mat_proj );
glGetFloatv(GL_MODELVIEW_MATRIX ,mat_model);
glMatrixMode(GL_PROJECTION);glLoadIdentity();
glOrtho(a,b,c,d,e,f);
glMatrixMode(GL_MODELVIEW);glLoadIdentity();
//---------
//---------
glMatrixMode(GL_PROJECTION); glLoadMatrixf(mat_proj);
glMatrixMode(GL_MODELVIEW); glLoadMatrixf(mat_model);