如何重置系统

时间:2012-11-23 12:38:42

标签: c++ c opengl

当我执行以下操作时,指针的坐标会发生变化。现在,如何在绘制另一个对象之前重置我的坐标系以便0,0,0

glPushMatrix();
glTranslatef(0.0f, -500.0f, 1200.0f);
glRotatef(270.0f, 1.0f, 0.0f, 0.0f);

glPushMatrix();
glColor3f(0.0f, 1.0f, 1.0f);
gluCylinder(quadric,10.0f,10.0f,1000.0f,32,32);
glPopMatrix();

我将绘制另一个对象,但当前的原始系统不是0,0,0。我认为重点在于已经勾勒出的圆柱体。

而且,如果我在第一个之后绘制另一个对象,它也会旋转。为什么呢?

2 个答案:

答案 0 :(得分:1)

glPushMatrix()将矩阵推送到当前活动的矩阵堆栈(在您的情况下可能是modelview)。 glTranslate()glRotate()等处理顶级模型视图矩阵,渲染也是如此。 glPopMatrix()从堆栈中删除顶部矩阵。

因此,一旦您平衡glPushMatrix()glPopMatrix()次调用,堆栈将处于与您启动时相同的状态。

答案 1 :(得分:1)

glPushMatrix () ;
glTranslatef(0.0f, -500.0f, 1200.0f ) ;
glRotatef ( 270.0f, 1.0f, 0.0f, 0.0f );
glColor3f ( 0.0f, 1.0f, 1.0f );
gluCylinder(quadric,10.0f,10.0f,1000.0f,32,32);
glPopMatrix();

glPushMatrix () ;
glTranslatef(0.0f, -500.0f, 1200.0f ) ;
glRotatef ( 270.0f, 0.0f, 1.0f, 0.0f );
glColor3f ( 0.0f, 1.0f, 1.0f );
gluCylinder(quadric,10.0f,10.0f,1000.0f,32,32);
glPopMatrix();

(此代码绘制2个独立的对象:一个具有旋转的x轴,另一个具有旋转的y轴)

每次glPushMatrix()来电都需要相应的glPopMatrix()来电。如果你想为一个对象进行“局部”转换(即翻译,旋转),你可以简单地调用glPushMatrix(),进行转换,绘制对象并调用glPopMatrix()。然后你的坐标系最终再次变换,你可以绘制下一个对象。

如果你没有得到它,你也可以在应用一些变换后使用模型视图矩阵上的glLoadIdentity()(再次重置所有变换) - 但是如果你正在使用与变换相关的代码(即gluLookAt)在您的ModelviewMatrix上,您必须在每次glLoadIdentity()电话后再次执行此操作。

glLoadIdentity();
glTranslatef(0.0f, -500.0f, 1200.0f ) ;
glRotatef ( 270.0f, 1.0f, 0.0f, 0.0f );
glColor3f ( 0.0f, 1.0f, 1.0f );
gluCylinder(quadric,10.0f,10.0f,1000.0f,32,32);

glLoadIdentity();
glTranslatef(0.0f, -500.0f, 1200.0f ) ;
glRotatef ( 270.0f, 0.0f, 1.0f, 0.0f );
glColor3f ( 0.0f, 1.0f, 1.0f );
gluCylinder(quadric,10.0f,10.0f,1000.0f,32,32);