2013-02-01 66 views
1

我目前正試圖通過OpenGL的方式瞭解基礎知識。 當時我嘗試渲染一個帶有金字塔的浮動立方體。我希望立方體在Input(已經在工作)和Pyramid上旋轉,以保持它應該在的位置。(OpenGL)將「舊」矩陣推入堆棧

確定了使用Push-PopMatrix後我設法只旋轉立方體。 我的問題是,立即停止旋轉,只要我放開鑰匙。 player.XPlayer.Z在此時未被重置(檢查)。

所以我的猜測是,PushMatrix將某種標準矩陣放入堆棧,然後旋轉並顯示它。由於1 * x總是等於x,因此不存在輪換。

所以問題是: 如何設法將「舊」矩陣推入堆棧而不是新的?

glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 

glPushMatrix(); 
glRotatef(-(player->Z), 1.0f, 0.0f, 0.0f); 
glRotatef(-(player->X), 0.0f, 1.0f, 0.0f); 
glBegin(GL_QUADS); 
//Draw Cube 
glEnd(); 
glPopMatrix(); 

glBegin(GL_TRIANGLES); 
//Draw Pyramid 
glEnd(); 


glFlush(); 
SwapBuffers (hDC); 

回答

1

glPushMatrix()不推動一個「標準的」基質壓入堆棧,它推動當前矩陣。希望你已經在某個點用glLoadIdentity()初始化矩陣,並且可能有一些初始變換來設置視圖,所以這就是推動的。

您通常不應該逐幀更新矩陣,因爲錯誤最終會累積。

取而代之的是,在某些更新循環中更新您的旋轉值,而不是在按鍵式例程中。

此外,請注意,使用GL進行渲染的這種方法已被視爲棄用。推薦的方法是使用可編程管道,其中涉及創建您自己的矩陣(以及其他更改)。 (如果你非常希望保持持久變換,同時推動和彈出渲染其他東西,可以用glGet()讀取當前矩陣,將它存儲在某個地方,然後執行glLoadMatrix()以稍後再恢復它...但不這樣做)

+0

該解決方案的ineed是編寫一個旋轉函數(包括一個靜態結構)並將每次運行時的旋轉值相加... thx很多 – celphy