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()
呼叫需要一個correspondending glPopMatrix()
呼叫。如果您想對一個對象進行「局部」轉換(即平移,旋轉),則只需致電glPushMatrix()
,進行轉換,繪製對象並致電glPopMatrix()
。然後你的座標系統最終不會再被轉換,你可以繪製下一個物體。
如果你沒有得到,你也可以在你的Modelview矩陣上使用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);
我再次建議你:從小開始,先畫一個以視口爲中心的三角形。然後將變換應用於三角形。然後鏈接這些轉換。接下來繪製兩個三角形,並進行獨立轉換。一旦你得到了,你可以開始使用變換層次。 – datenwolf
通過使用矩陣堆棧。 glPushMatrix創建當前矩陣的副本並將其放置在活動堆棧的頂部。 glPopMatrix刪除頂部元素。 OpenGL使用每個矩陣堆棧的最頂層元素進行轉換。在固定函數OpenGL中有4個堆棧:GL_PROJECTION,GL_MODELVIEW,GL_TEXTURE和GL_COLOR。如果你不知道堆棧是如何工作的,你首先必須學習:http://en.wikipedia.org/wiki/Stack_(abstract_data_type) - 關於OpenGL轉換管道是如何組織的以及它如何工作http:// www.opengl.org/wiki/Viewing_and_Transformations – datenwolf