如果不使用glPushMatrix,第一个球体的变换如何影响第二个球体?

时间:2014-05-18 15:26:41

标签: opengl glut transformation

当我运行此代码时,我得到了2个缩放的球体,第一个球体的变换也影响了第二个球体。

 glTranslatef(0,1,0);
 glScalef(1,1,0.5);
 glutWireSphere(0.5, 20, 16);  

 glTranslatef(0,-1,0);
 glutWireSphere(0.5, 20, 16);  

我有3个问题:

    当我使用pop / push矩阵时,
  1. glTranslateglScale被认为是一个或两个矩阵?
  2. 第一个球体的变换是如何影响第二个球体的?
  3. 如何仅使用glPushMatrix保存缩放转换,以便glTranslatef(0,1,0)不会影响第二个球体?

1 个答案:

答案 0 :(得分:4)

首先,您应该知道您正在使用已弃用的功能。您应该查看如何使用着色器执行上述操作。

那就是说,回答你的问题:

  1. 有一个当前的变换矩阵。您执行的任何矩阵运算都会连接到当前变换矩阵上(覆盖它的glLoadMatrix()除外)。因此,缩放,翻译,乘法等都会改变当前矩阵。使用glBegin()glEnd()绘制某些几何图形时,它们会使用当前的变换矩阵。 (大部分OpenGL以这种方式工作。有一堆状态,无论当前状态如何,这都是用来绘制内容的东西。)
  2. 由于转换是连接的,因此第一个转换仅使用转换和缩放。第二个是使用翻译和缩放加上另一个翻译。第二次翻译发生在一个音阶之后,因此它的单位与第一个翻译单位不同。
  3. 我不确定我是否理解你通过推送和弹出矩阵来实现的目标。通常情况下,您可以像这样使用glPushMatrix() / glPopMatrix()
  4. glPushMatrix();
    glTranslatef(0,1,0);
    glScalef(1,1,0.5);
    glutWireSphere(0.5, 20, 16);  
    glPopMatrix();
    
    glutWireSphere(0.5, 20, 16);
    

    但是你想要两者都缩放,但只有1被翻译吗?如果你澄清一下,我可以解决上述问题,做你想做的事。

    基本上,glPushMatrix()会保存矩阵的当前状态。然后,您可以对其进行任何更改,并使用这些更改绘制任何几何体。然后,当您致电glPopMatrix()时,它会将其恢复为您拨打glPushMatrix()时所处的状态。