2011-02-24 84 views
4

我已經檢查了關於這個主題的其他問題,他們的解決方案沒有爲我工作。我有點不知所措。我在我的GLEventListener實現中具有以下功能。在Java中的GLU.gluLookAt OpenGL綁定似乎什麼都不做

public void init(GLAutoDrawable gl) { 
    GL2 gl2 = gl.getGL().getGL2(); 

    gl2.glMatrixMode(GL2.GL_PROJECTION); 
    gl2.glLoadIdentity(); 
    GLU glu = GLU.createGLU(gl2); 
    glu.gluPerspective(45.0f, 1, 0.1f,100.0f); 
    gl2.glMatrixMode(GL2.GL_MODELVIEW); 
    gl2.glLoadIdentity(); 
    gl2.glViewport(0, 0, width, height); 
    gl2.glEnable(GL.GL_DEPTH_TEST); 
} 

private void render(GLAutoDrawable drawable) { 

    GL2 gl = drawable.getGL().getGL2(); 
    GLU glu = GLU.createGLU(gl); 

    gl.glClear(GL.GL_COLOR_BUFFER_BIT); 
    gl.glMatrixMode(GL2.GL_MODELVIEW); 
    gl.glLoadIdentity(); 
    glu.gluLookAt(5, 0, 20, 
        0, 30, 0, 
        0, 1, 0); 

    gl2.glPushMatrix(); 
    gl2.glClear(GL.GL_COLOR_BUFFER_BIT | GL.GL_DEPTH_BUFFER_BIT);     
    gl2.glLoadIdentity(); 
    gl2.glTranslatef(x, y, z);   
    gl2.glBegin(GL2.GL_QUADS); 
     gl2.glColor3f(1, 0, 0); 

     //24 glVertex3f calls & some colour changes go here. 
     gl2.glVertex3f(...) 

    gl2.glEnd(); 
    gl2.glPopMatrix(); 

    gl.glFlush(); 
} 

無論我將哪些值放入gluLookAt()矩陣中,視圖都不會改變。我仍然看着一個立方體的同一面。

任何想法?

感謝

+0

您是否使用着色器繪製立方體? – kvark 2011-02-24 18:50:21

+0

我對此很陌生,不知道這意味着什麼。該立方體只是24個glVertex3f()調用,並且在glBegin(四邊形)和glEnd()之間會有一些顏色變化。我將編輯我的帖子以顯示更多的繪圖代碼。 – Joel 2011-02-24 20:17:06

+0

查看下面的答案 - 我認爲你的繪圖代碼中有一個錯誤。 – 2011-02-25 15:13:56

回答

6

編輯:應對在原來的問題編輯。下面留下原文,因爲人們似乎覺得它很有用。

我認爲你的問題是在你的多維數據集繪圖代碼。檢查以下評論:該glLoadIdentity呼叫做的正是你所期望的 - 迫使立方體在那裏在你的面前:

gl2.glPushMatrix();  
gl2.glClear(GL.GL_COLOR_BUFFER_BIT | GL.GL_DEPTH_BUFFER_BIT); 
/** Try removing the following glLoadIdentity call below. 
    * That call was blowing out the MODELVIEW matrix - it's removing your 
    * gluLookAt call and returning to the identity. 
    * As a result, the cube will always be right there in front of you. 
    */ 
// gl2.glLoadIdentity(); 
gl2.glTranslatef(x, y, z); 
gl2.glBegin(GL2.GL_QUADS); 
gl2.glColor3f(1, 0, 0); //24 glVertex3f calls & some colour changes go here. 
gl2.glVertex3f(...) 
gl2.glEnd(); 
gl2.glPopMatrix(); 

下面是關於什麼相關的調用會做一個非常簡單說明。查看文檔的詳細信息:

gl2.glPushMatrix(); // This preserves current MODEL_VIEW matrix so you can get back here. 
        // Think of it as a checkpoint save in a game. 
        // Most of your objects will be wrapped in push and pop. 
gl2.glLoadIdentity(); // This erases the MODEL_VIEW and replaces it with an identity. 
         // This un-does your previous gluLookAt call. You will rarely use 
         // this inside an object (but it's not impossible). 
         // Does not apply here so don't use. 
gl2.glTranslatef(x, y, z); // This is what puts your object out in space for you to find 
          // as opposed to putting it at the origin. Most objects will 
          // have a translate (and likely a rotate as well). 
          // Note that the order of operations matters: 
          // translate and then rotate != rotate and then translate. 
// QUAD strip code with vertices and colors - you're okay with these. 
gl2.glPopMatrix(); // This brings back the MODEL_VIEW that you originally saved by pushing 
        // it. 

約在OpenGL矩陣碼偉大的事情是,一旦你的示例代碼組合,你明白,你總是有它作爲參考。當我在當天從IrisGL切換到OpenGL時,我花了一些時間來移植我的實用程序,然後我再也沒有回頭。

ORIGINAL:您需要添加立方體的繪製代碼 - 如果你把立方體在(0,30,0),這是很有可能的代碼是做什麼你問它附近。

檢查OpenGL常見問答,有一個具體的問題和答案,可能與您正在做的事情有關:8.080 Why doesn't gluLookAt work?我要引用整個答案,因爲確實沒有一個好的休息,但請訪問OpenGL FAQ ,答案很可能出現在:

這通常是由不正確的 轉換造成的。

假設你與zNear和zFar投影 矩陣堆棧上使用 gluPerspective()作爲 第三和第四個參數,則 需要設置gluLookAt的模型視圖 矩陣堆棧上,並將參數傳遞所以 您的幾何落在zNear和 zFar之間。

當您試圖瞭解觀看 變換時,通常最好使用 簡單的代碼片段進行試驗。假設您是 試圖查看以原點爲中心的單位球體 。你要 設置你轉換爲 如下:

glMatrixMode(GL_PROJECTION); 
glLoadIdentity(); 
gluPerspective(50.0, 1.0, 3.0, 7.0); 
glMatrixMode(GL_MODELVIEW); 
glLoadIdentity(); 
gluLookAt(0.0, 0.0, 5.0, 
      0.0, 0.0, 0.0, 
      0.0, 1.0, 0.0); 

重要的是要注意投影 和模型視圖是如何將工作 在一起是很重要的。

在這個例子中,投影 變換設置了一個50.0度的字段 的視圖,寬高比爲1.0。 zNear剪裁平面在眼前是3.0單位 ,而剪裁平面是眼前的7.0單位 。這留下了Z量爲4.0單位的距離,爲單位球體提供了充足的空間。

模型視點轉換集在(0.0,0.0,5.0)的眼 位置,並且 查找點是在 中心我們的單位球體的原點。請注意, 的眼球位置是距離觀看點5.0個單位 。這是 重要,因爲眼前的單位距離是 投影變換所定義的Z體積的中間位置 。如果 gluLookAt()調用已將眼睛置於 (0.0,0.0,1.0),它將產生距離原點1.0的距離。這個 不足以包含視圖體積中的 球體,並且它將被zNear剪輯 平面剪切。

同樣,如果你把在 眼(0.0,0.0,10.0),10.0 的距離的外表在點將會導致 單位球面上是10.0單位處 從眼睛和遠遠落後於zFar 剪切平面放置在7.0單位。

如果這讓您感到困惑,請閱讀 OpenGL紅皮書 或OpenGL規範中的轉換。 瞭解對象座標空間後, 眼座標空間,和 座標空間,上面應該 變得清晰。另外,還可以試用 小測試程序。如果您的 在您的主應用程序項目中遇到問題 錯誤,那麼 可能會編寫一小段 代碼,嘗試以較簡單的幾何重現 問題。

+0

我實際上已經閱讀了FAQ的這一部分,但沒有找到任何幫助。我在這裏輸入gluLookAt()矩陣的數字是任意的。立方體的居中位置是(0,0,-5.0),邊長爲1.當我的程序開始時,無論gluLookAt()中的座標如何,我總是直接看正面。 – Joel 2011-02-24 18:28:38

+0

它工作!這會教會我不要忽略我認爲的樣板代碼......但有一個問題。我認爲loadIdentity()僅適用於堆棧的頂部。由於在調用它之前我推了一個矩陣,在彈出堆棧之後它不應該沒有效果嗎? – Joel 2011-02-25 16:20:29

+0

@Joel,我會添加到答案。不掛斷。 – 2011-02-25 22:03:15