2014-06-15 158 views
0

我有一個簡單的應用程序,它可以顯示在所有軸上旋轉的3D立方體,並且可以通過鼠標控制攝像機,使您可以調整正在查看立​​方體的角度。gluPerspective()顯示黑屏?

當我使用glOrtho時,整個應用程序的工作原理與我想要的完全一樣,但是一旦將其更改爲gluPerspective,我只會看到一個黑屏。

這裏是我的方法來初始化的openGL:

public void initializeOpenGL() 
{ 
    glMatrixMode(GL_PROJECTION); 
    glLoadIdentity(); 
    gluPerspective(45.0f, ((float)WIDTH)/((float)HEIGHT), 0.01f, 500f); 
    //glOrtho(0, 640, 480, 0, 600, -1); //displays everything correctly 
    glMatrixMode(GL_MODELVIEW); 
    glEnable(GL_DEPTH_TEST); 
} 

然後這裏是我的循環方法:

public void begin() 
{ 
    float degrees = 0; 
    Mouse.setGrabbed(false); 
    while(!Display.isCloseRequested()) 
    { 
     moveCamera(); //calculates the changes in mouse position    
     GL11.glLoadIdentity(); 
     glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 
     camera.lookThrough(); //applies the changes 
     glTranslatef((float)WIDTH/2,(float)HEIGHT/2,10f); 
     glRotatef(degrees++,1f,1f,1f); 
     glScalef(100,100,100); 

     drawQuad(); 

     Display.update(); 
     Display.sync(60); 
    } 
    Display.destroy(); 
    System.exit(0);  
} 
+1

傳遞給您的正交投影矩陣的值翻轉Z軸(也是Y軸,但這不會影響多邊形卷繞)。當您使用透視投影時,您應該考慮用** z = -10f **進行翻譯,以便您的物體位於近平面的前方。 –

+0

還有你的深度測試方向的問題。你可能需要使用'glDepthRange(1.0f,0.0f);'如果你確實倒過來了你的近/遠平面。 –

+0

這一切都取決於您正在繪製的座標範圍,以及您的「相機」適用的轉換方式。使用您正在創建的'gluProjection()'調用時,您需要移動幾何圖形,以便從原點向下查看負Z軸時可以看到它。 –

回答

0

我創建了一個圖像顯示在相機外觀:http://i.imgur.com/9NVSyqj.png 正如你所看到的照相機沿着-z軸看起來像

- >你應該嘗試翻譯四個像這樣的東西:

glTranslatef(0,0, -10f); 

取而代之的是四移動到顯示屏的中間,你動它的顯示屏尺寸的一半在無處您的景觀

短版:要點:https://gist.github.com/Chronove/11da12b2635bfc040981

package me.tutorial; 

import static org.lwjgl.opengl.GL11.*; 
import static org.lwjgl.util.glu.GLU.gluPerspective; 

import org.lwjgl.opengl.Display; 
import org.lwjgl.opengl.DisplayMode; 

/** 
* @author Chronove 
*/ 
public class Example { 

    public static void main(String[] args) throws Exception { 

     int WIDTH = 600; 
     int HEIGHT = 400; 

     // INIT 
     Display.setDisplayMode(new DisplayMode(WIDTH,HEIGHT)); 
     Display.create(); 

     glMatrixMode(GL_PROJECTION); 
     glLoadIdentity(); 

     gluPerspective(45.0f,(float)(WIDTH/HEIGHT),0.1f,500f); 

     glMatrixMode(GL_MODELVIEW); 
     glEnable(GL_DEPTH_TEST); 

     float degrees = 0; 

     while(!(Display.isCloseRequested())){ 

      glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 
      glLoadIdentity(); 

      glTranslatef(0,0,-10f); 
      glRotatef(degrees++,0f,0f,1f); 

      // drawQuad(); 
      { 

       glBegin(GL_QUADS); 

       glVertex3f(-1f,-1f,0f); 
       glVertex3f(1f,-1f,0f); 
       glVertex3f(1f, 1f,0f); 
       glVertex3f(-1f, 1f,0f); 

       glEnd(); 

      } 

      Display.update(); 
      Display.sync(60); 

     } 

     Display.destroy(); 
     System.exit(0); 

    } 

} 
+0

哦哦哦!我現在明白了!我會試試看看它是否有效! :D – 84danie

+0

所以我回到了原來的課堂,並將我的翻譯調整到了原來的水平,並且工作正常!非常感謝C: – 84danie