2012-11-23 51 views
1

當我這樣做,指針的座標改變。現在,如何在草圖繪製另一個對象之前重置我的座標系以便成爲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。我認爲重點在於已經勾畫出來的圓柱體。

還有,如果我的第一個草圖後,另一個對象,它也被轉動。爲什麼?

+1

我再次建議你:從小開始,先畫一個以視口爲中心的三角形。然後將變換應用於三角形。然後鏈接這些轉換。接下來繪製兩個三角形,並進行獨立轉換。一旦你得到了,你可以開始使用變換層次。 – datenwolf

+0

通過使用矩陣堆棧。 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

回答

1

glPushMatrix()推矩陣到目前有源矩陣堆棧(可能是模型觀察你的情況)。 glTranslate(),glRotate()等與頂層模型視圖矩陣一起工作,就像渲染一樣。 glPopMatrix()從堆棧中移除頂層矩陣。

因此,一旦您平衡glPushMatrix()glPopMatrix()調用,堆棧將處於與啓動時相同的狀態。

+0

如果我在我的代碼頂部調用旋轉,它將旋轉此調用下的所有對象。但我不想要這樣的事情,我該如何防止這種Sie效應? – user1845897

+0

@ user1845897你瞭解堆棧的工作原理嗎?以及如何將轉換存儲在矩陣中? – Angew

+0

是與此相關的解決方案嗎? – user1845897

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()呼叫需要一個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);