2012-01-10 13 views
1

x、y、z軸に沿って線を引くコードがあります。私の問題は、彼らが原点付近見えないように、これらの線がクリップされていることをされていますgluLookAt trouble

clipped axes

これはファークリッピング平面の問題のように聞こえるが、私は十分でなければなりませんgluPerspectiveで、にzFar = 50を与えました。それをさらに大きくすることは助けに見えません。他に何がクリッピングを引き起こす可能性がありますか?ここで

は私のコードです:

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

更新からglMatrixMode(GL_MODELVIEW);glLoadIdentity();を削除すると、望ましい結果が得られますが、私は理由を理解していません。デフォルトのmodelview行列は単位行列ではありませんか?

更新 - 私は同じコードのCバージョンを書いて、それは必要に応じて動作します。なぜ違い?

+0

のように、現在のマトリックスをマトリックススタックの先頭から取得することができますか? – datenwolf

+0

私は一番上に置いて、それはあなたのために現れませんか? –

+2

オブジェクトを一度描画してから、swapBuffersを 'update()'で繰り返し呼び出すのではなく、フレームごとにオブジェクトを描画する必要があります。後に続くwhileループの始めに、 '// modelview matrix'と' glEnd() 'の間にすべてを入れるべきです。また、ループの開始時に 'glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)'を呼んでください。 – PeterT

答えて

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

ああ、良いキャッチ!ありがとう、私はあなたが私にできるようにすぐに恩恵を与えるでしょう。 –