簡體   English   中英

OpenGL 中的攝像頭無法向前移動

[英]Can't Move Foward with Camera in OpenGL

我正在嘗試使用 pyOpenGL,但無法讓相機正常工作。

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()

這些旋轉效果很好,但我無法朝着相機所面對的方向前進。 當我修改代碼以能夠以這種方式向前移動時,場景將無法正確旋轉。 如果我后退足夠遠,將會發生的情況是場景將旋轉一圈。

如果您正在編寫一個具有相機移動概念的應用程序(我想也可以旋轉),那么與其在 object 上使用glRotateglTranslate操作,不如考慮查看gluLookAt ,它允許您以相機為中心的方式進行設置, 可以這么說。

順便說一句, gluLookAt已被棄用,盡管有些人說他們“非常想念它”。 如果您希望遠離這個已棄用的實用程序 function,請參閱此 function 的源代碼並在 CPU 上滾動您自己的矩陣。

要前進,您必須首先確定前進的位置 您需要獲取指向相機朝向的方向的 3D 向量。 一種方法是將向量 (0, 0, -1) 乘以相機矩陣的旋轉部分的倒數。 通常,有更簡單的方法可以做到這一點,但它們都取決於您如何計算相機矩陣。

一旦你有一個指向相機正面方向的單位向量,這很容易。 只需將其乘以您要沿該方向移動的距離,然后將其添加到相機的當前 position 中。

請注意,如果您使用 gluLookAt,您還需要同時偏移觀察點。 否則,您的相機將移動,但它會嘗試面向世界空間中的一個不動點。

雖然我最習慣於在 JOGL 中編程而不是任何其他 OpenGL 綁定,但我建議您使用以下檢查點:

*) 您是否在正確的 function 中設置(對我來說是 JOGL GLEventListener 的 reshape(int x, int y, int width, int height) 方法)、視口和截錐體?

=> 對於視口(用於 OpenGL 繪圖的框架區域),您通常只需調用 glViewport(x,y,width,height) => 為您的 GL 繪圖分配所有 Canvas 區域

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

*) 您是否想過在您的繪圖 function 中使用對 gluLookAt 的調用,正如您建議的 Ray Toal 一樣? 我建議你打電話給 gluLookAt(

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

0,0,0, // 相機瞄准 (0,0,0)

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

希望這可以幫到你

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM