2014-06-15 127 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