当我执行以下操作时,指针的坐标会发生变化。现在,如何在绘制另一个对象之前重置我的坐标系以便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
。我认为重点在于已经勾勒出的圆柱体。
而且,如果我在第一个之后绘制另一个对象,它也会旋转。为什么呢?
答案 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);