2011-07-16 35 views
0

我與pyOpenGL試驗和我有麻煩了相機的正常工作。無法用相機移動FOWARD在OpenGL

def Draw(): 

    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT) 
    glMatrixMode(GL_MODELVIEW) 
    glLoadIdentity() 

    glRotatef(roty,1,0,0) 
    glRotatef(rotx,0,1,0) 
    glTranslate(0,0,eyez) 

    glPushMatrix() 

    glTranslate(0,0,-80) 

    glBegin(GL_QUADS) 
    glColor(0,1,0) 
    glVertex3f(-50,-5,10) 
    glVertex3f(-50,50,10) 
    glVertex3f(50,50,10) 
    glVertex3f(50,-5,10) 

    glColor(1,0,0) 
    glVertex3f(-50,-5,10) 
    glVertex3f(-50,50,10) 
    glVertex3f(-50,50,70) 
    glVertex3f(-50,-5,70) 
    glEnd() 

    glPopMatrix() 

    glutSwapBuffers() 

這些旋轉效果很好,但我無法沿着相機朝向的方向前進。當我修改代碼以便能夠以這種方式向前移動時,場景將不會正確旋轉。如果我的備份足夠的話,會發生什麼情況就是場景會旋轉。

回答

5

如果您正在編寫具有相機移動(和旋轉得我想)然後,而不是與glRotate對象上進行操作和glTranslate考慮尋找到gluLookAt,它允許你設置的東西,這個概念的應用以相機爲中心的方式,可以這麼說。

順便說一句,gluLookAt已過時,即使有些人說他們「失去了很多。」如果您希望遠離此棄用的實用程序功能,請參閱the source of this function,並在CPU上滾動您自己的矩陣。

2

要前進,必須首先確定前進。您需要獲取指向相機朝向的3D矢量。一種方法是將矢量(0,0,-1)乘以相機矩陣的旋轉部分的逆。一般來說,有更簡單的方法來完成它,但它們都取決於您如何計算相機矩陣。

一旦你在相機的面對方向的單位向量指向,這很容易。只需將此乘以您想要移動的方向多遠,並將其添加到相機的當前位置即可。

請注意,如果你使用gluLookAt,你也需要在同一時間,以抵消LOOKAT點。否則,你的相機會移動,但它會嘗試在世界空間中面對一個不動的地方。

0

雖然我最習慣程序JOGL比其他任何OpenGL的結合,我建議你以下關卡:

*)你設置,以正確的功能(對我來說是JOGL GLEventListener的重塑(INT x,int y,int width,int height)方法),視口和視錐體?

=>對於視口(用於OpenGL的繪圖框區域)時,通常只需要調用glViewport(X,Y,寬度,高度)=>分配所有的畫布區爲您的GL附圖

= >對於平截頭體(相機視野),您必須先切換到投影矩陣(glMatrixMode(GL_PROJECTION)),然後設置您的平截頭體,然後切換回GL_MODELVIEW矩陣以便爲您的繪圖做好準備。我建議你,爲了定義平截頭體,可以調用gluPerspective(45,(float)width/height,0.001f,1000f)。 45度半角,給出屏幕比例的寬度/高度,0.001f給出離你的眼睛(或屏幕)0.001f的近截斷平面,1000f給出遠離你的眼睛的遠截斷平面1000f。

*)你有沒有想過使用,在你的繪圖功能,以gluLookAt呼叫,如建議你雷特里?我建議你調用gluLookAt(

0,0,1,//相機被設置爲(0,0,1),所以它會看到0,0,0點

0,0 ,0,//相機瞄準的是(0,0,0)

0,1,0)//相機對於它的向上矢量有(0,1,0)(所以,Oy是向上的向量。 ..邏輯)

希望這可以幫助你