2012-03-15 51 views
2

我有一个init()方法,我试图创建一个Perspective呈现。下面是我到目前为止的代码,但我传递给gluPerspective(fovy, aspect, zNear, zFar)的数字是错误的。我认为fovy是视场(60度),而aspect是纵横比(宽/高),但我不知道zNearzFar是什么。如何在jogl中使用gluPerspective()?

public void init(GLAutoDrawable gld) { 
    //We will use the default ViewPort 

    GL gl = gld.getGL(); 
    glu = new GLU(); 

    gl.glClearColor(0.0f, 0.0f, 0.0f, 1.0f); 


    glu.gluLookAt(
      25, 15, 0, // eye 
      25, 15, 30, // at 
      0, 1, 0 // up 
      ); 



    // Set up camera for Orthographic projection: 
    gl.glMatrixMode(GL.GL_PROJECTION); 
    gl.glLoadIdentity(); 
    glu.gluPerspective(60, 500/300, 0.0, 60.0); 

    gl.glMatrixMode(GL.GL_MODELVIEW); 
    gl.glLoadIdentity(); 

} 
+1

您是否阅读过手册页? http://www.opengl.org/sdk/docs/man/xhtml/gluPerspective.xml。此外,你正在做方面的整数除法,你需要做浮动部分,否则它会围绕500/300到1.(500.f/300.f) – Tim 2012-03-15 17:35:26

回答

2

近端和远端的值指定哪些对象是可见的范围内(它们限定了近端和远端剪切planes)。实际上,使用该角度看不到60.0的物体将不可见。

作为蒂姆已经评论,这是明确写出浮点值(即500.0f/300.0f)。

但更糟糕的是,在将其设置为标识(假定在方法开始时,矩阵模式为GL.GL_MODELVIEW)之前,您需要设置查看矩阵。可能是更好的以下序列:

gl.glMatrixMode(GL.GL_MODELVIEW); 
gl.glLoadIdentity(); 
glu.gluLookAt(...); 

也许你需要调查更多关于相机抽象。

+0

家伙我不能感谢你够了... – 2012-03-16 00:30:43

0

就像卢卡所说的那样,近和远定义了可见物体的范围。但最重要的是,绝对不要使用近值或远值的值(您当前所做的值)为< = 0,因为这会导致奇异的投影矩阵(伴随任何奇怪的渲染结果)。

对于近剪裁平面使用一些相当小的值,但不能太小,否则会导致深度缓冲精度不佳。使用合理的东西,例如在对一个正常的现实世界进行建模时,10cm的近距离通常是一个好的选择(无论在实际应用中的通用单位数量是多少),因为你不会看到任何物体更接近任何物体。但它取决于你的应用程序,就像远远的价值。

当然,就像蒂姆说的那样,目前你的长宽比是1.0,因为你要做整数除法。