如何重置系统

how to reset system

本文关键字:系统 何重置      更新时间:2023-10-16

当我执行以下操作时,指针的坐标发生了变化。现在,如何重置坐标系以便在草绘另一个对象之前进行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. 我认为重点在于已经勾勒出的圆柱体。

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

glPushMatrix()

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

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

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() - 但是如果你在ModelviewMatrix上使用与转换相关的代码(即gluLookAt),你必须在每次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);