2012-10-25 73 views
-3

我想讓我的場景在OpenGL中移動,但是我遇到了麻煩。我查閱了幾篇教程,並瞭解了OpenGL矩陣背後的數學概念。我只是遇到了麻煩。我需要的只是一個例子。如果我能看到一個例子,說明按下按鍵時「相機」如何向一個方向移動,我可以修改代碼以達到我自己的目的。OpenGL和SFML中的3D攝像頭

+0

你現在怎麼設置你的視圖矩陣? – paddy

+0

我正在使用'glMatrixMode(GL_PROJECTION); glLoadIdentity(); gluPerspective(90.f,8.f/6.f,1.f,100.f);'和'glPushMatrix(); glTranslate(); glPopMatrix();' – tref95

+0

當我谷歌「如何在OpenGL中移動攝像頭」,第一個結果是http://www.opengl.org/archives/resources/faq/technical/viewing.htm - 你讀過那個頁面,仍然沒有得到它? – paddy

回答

0

您可以使用gluLookAt「移動」您的相機。

gluLookAt(eyex,eyey,eyez, centerx,centery,centerz, upx,upy,upz); 

他們的前3個座標是你的虛擬眼睛的座標。接下來的3個是您的眼睛「看上去」的座標。最後3個是指向場景上方的矢量(將其視爲旋轉你的眼睛)。

例如,

gluLookAt(1,1,1, 0,0,0, 0,1,0); 

這使得你的眼睛在(1,1,1)和你正在尋找原點。向上矢量的方向是正y軸。

如果您想移動相機,每次從按鍵回撥功能中按下某個鍵時,可以使用更新的參數調用gluLookAt

3

那麼,OpenGL並沒有真正的「相機」。它有一個轉換管道(固定功能或可編程)。另外,OpenGL不會保留一個「場景」,只是一次一個繪製點,線和三角形到幀緩衝區。一旦你圍繞這個事實思考,你基本上不是一個非常不同的東西,比如使用任何其他的繪圖API(goTo(x,y); lineTo(x,y);或類似的),OpenGL中的很多東西更有意義。

因此,OpenGL中的「相機」僅僅是在頂點轉換管道中的某個點上應用的查看轉換。通常作爲模型視圖矩陣中的最後一次轉換 - 模型轉換之後是視圖轉換,因此是模型視圖。

有很多方法可以指定視圖轉換,並且經常使用的典型幫助函數是gluLookAt。由於變換以相反的順序應用,所以它們被乘到一個矩陣上(如果使用OpenGL的glMultMatrix或者至少使用了一個內置的矩陣操作函數),在定義模型視圖矩陣時,首先要查看變換。因此,在您的繪圖功能中,代碼通常看起來像

glMatrixMode(GL_MODELVIEW) 
glLoadMatrix(view.transformation) # same as glLoadIdentity(); glMultMatrix(view.transformation) 

foreach(object o in objects): 
    glMatrixMode(GL_MODELVIEW) 
    glPushMatrix() 
    glMultMatrix(o.transformation) 

    o.draw() 

    glMatrixMode(GL_MODELVIEW) 
    glPopMatrix() 

您是否注意到我在每次矩陣操作之前總是確保我處於正確的矩陣模式?這是因爲object :: draw可能會切換到另一個矩陣模式(比如說GL_TEXTURE),而切換矩陣模式的成本只有可以忽略的程度,所以在一系列矩陣操作之前,您應該始終這樣做。

作爲進一步提示:您應始終將您的代碼設置爲視圖和投影矩陣在繪圖代碼的開頭。 請勿將放置在窗口的resize事件處理程序中。