2012-01-10 42 views
1

我有一些代碼沿着x,y和z軸繪製一條線。我的問題是,這些線被修剪,使他們在原點附近無形:gluLookAt問題

clipped axes

這聽起來像一個遠裁剪面的問題,但我給zFar = 50 gluPerspective,這應該是充足的。讓它變得更大似乎沒有幫助。還有什麼可能導致剪輯?

這裏是我的代碼:

import static org.lwjgl.opengl.GL11.*; 

import org.lwjgl.opengl.*; 
import org.lwjgl.util.glu.GLU; 

public class Test { 
    static int width = 300, height = 200; 

    public static void main(String[] _) throws Exception { 
     Display.setDisplayMode(new DisplayMode(width, height)); 
     Display.create(); 
     glClear(GL_COLOR_BUFFER_BIT); 

     // projection matrix 
     glMatrixMode(GL_PROJECTION_MATRIX); 
     glLoadIdentity(); 
     GLU.gluPerspective(50, width/(float) height, .1f, 50); 

     // modelview matrix 
     glMatrixMode(GL_MODELVIEW); 
     glLoadIdentity(); 
     GLU.gluLookAt(
       .8f, .8f, .8f, 
       0, 0, 0, 
       0, 1, 0); 

     // draw a line for each axis 
     glBegin(GL_LINES); 
      // x axis in red 
      glColor3f(1, 0, 0); 
      glVertex3i(0, 0, 0); 
      glVertex3i(10, 0, 0); 
      // y axis in green 
      glColor3f(0, 1, 0); 
      glVertex3i(0, 0, 0); 
      glVertex3i(0, 10, 0); 
      // z axis in blue 
      glColor3f(0, 0, 1); 
      glVertex3i(0, 0, 0); 
      glVertex3i(0, 0, 10); 
     glEnd(); 

     Display.update(); 

     // wait for a close event 
     while (!Display.isCloseRequested()) { 
      Thread.sleep(20); 
      Display.processMessages(); 
     } 
     Display.destroy(); 
    } 
} 

更新 - 刪除glLoadIdentity();glMatrixMode(GL_MODELVIEW);後給出了期望的結果,但我不明白爲什麼。默認的模型視圖矩陣不是單位矩陣嗎?

更新 - 我寫了一個相同代碼的C版本,它的工作原理如下。爲什麼區別?

+0

檢索矩陣堆棧的頂部當前矩陣,你可以提供一個屏幕截圖? – datenwolf 2012-01-11 00:18:50

+0

我把一個放在頂部,它不會顯示出來嗎? – 2012-01-11 02:30:43

+2

也許你應該畫出你的對象的每一幀,而不是繪製一次,然後用'update()'重複調用swapBuffers。你應該在'// modelview matrix'和'glEnd()'之間的所有內容之後的while循環開始。也可以在循環開始時調用'glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)'以獲得良好的測量結果 – PeterT 2012-01-11 07:10:14

回答

2

事實上,經過測試,結果發現glMatrixMode(GL_PROJECTION_MATRIX);應該是glMatrixMode(GL_PROJECTION);

如此看來,模型視圖是活躍在默認情況下並glLoadIdentity()清除GLU.gluPerspective(50, width/(float) height, .1f, 50);

編輯的結果:順便說一下。如果你想知道什麼GL_PROJECTION_MATRIX是,它與glGetFloatv(GL_PROJECTION_MATRIX,output);glGetDoublev(GL_PROJECTION_MATRIX,output);

+0

啊,很好!謝謝,我會盡快給你這個賞金。 – 2012-01-13 11:39:06