[英]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 上使用glRotate
和glTranslate
操作,不如考慮查看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.