2011-02-24 83 views
4

我已经检查了关于这个主题的其他问题,他们的解决方案没有为我工作。我有点不知所措。我在我的GLEventListener实现中具有以下功能。在Java中的GLU.gluLookAt OpenGL绑定似乎什么都不做

public void init(GLAutoDrawable gl) { 
    GL2 gl2 = gl.getGL().getGL2(); 

    gl2.glMatrixMode(GL2.GL_PROJECTION); 
    gl2.glLoadIdentity(); 
    GLU glu = GLU.createGLU(gl2); 
    glu.gluPerspective(45.0f, 1, 0.1f,100.0f); 
    gl2.glMatrixMode(GL2.GL_MODELVIEW); 
    gl2.glLoadIdentity(); 
    gl2.glViewport(0, 0, width, height); 
    gl2.glEnable(GL.GL_DEPTH_TEST); 
} 

private void render(GLAutoDrawable drawable) { 

    GL2 gl = drawable.getGL().getGL2(); 
    GLU glu = GLU.createGLU(gl); 

    gl.glClear(GL.GL_COLOR_BUFFER_BIT); 
    gl.glMatrixMode(GL2.GL_MODELVIEW); 
    gl.glLoadIdentity(); 
    glu.gluLookAt(5, 0, 20, 
        0, 30, 0, 
        0, 1, 0); 

    gl2.glPushMatrix(); 
    gl2.glClear(GL.GL_COLOR_BUFFER_BIT | GL.GL_DEPTH_BUFFER_BIT);     
    gl2.glLoadIdentity(); 
    gl2.glTranslatef(x, y, z);   
    gl2.glBegin(GL2.GL_QUADS); 
     gl2.glColor3f(1, 0, 0); 

     //24 glVertex3f calls & some colour changes go here. 
     gl2.glVertex3f(...) 

    gl2.glEnd(); 
    gl2.glPopMatrix(); 

    gl.glFlush(); 
} 

无论我将哪些值放入gluLookAt()矩阵中,视图都不会改变。我仍然看着一个立方体的同一面。

任何想法?

感谢

+0

您是否使用着色器绘制立方体? – kvark 2011-02-24 18:50:21

+0

我对此很陌生,不知道这意味着什么。该立方体只是24个glVertex3f()调用,并且在glBegin(四边形)和glEnd()之间会有一些颜色变化。我将编辑我的帖子以显示更多的绘图代码。 – Joel 2011-02-24 20:17:06

+0

查看下面的答案 - 我认为你的绘图代码中有一个错误。 – 2011-02-25 15:13:56

回答

6

编辑:应对在原来的问题编辑。下面留下原文,因为人们似乎觉得它很有用。

我认为你的问题是在你的多维数据集绘图代码。检查以下评论:该glLoadIdentity呼叫做的正是你所期望的 - 迫使立方体在那里在你的面前:

gl2.glPushMatrix();  
gl2.glClear(GL.GL_COLOR_BUFFER_BIT | GL.GL_DEPTH_BUFFER_BIT); 
/** Try removing the following glLoadIdentity call below. 
    * That call was blowing out the MODELVIEW matrix - it's removing your 
    * gluLookAt call and returning to the identity. 
    * As a result, the cube will always be right there in front of you. 
    */ 
// gl2.glLoadIdentity(); 
gl2.glTranslatef(x, y, z); 
gl2.glBegin(GL2.GL_QUADS); 
gl2.glColor3f(1, 0, 0); //24 glVertex3f calls & some colour changes go here. 
gl2.glVertex3f(...) 
gl2.glEnd(); 
gl2.glPopMatrix(); 

下面是关于什么相关的调用会做一个非常简单说明。查看文档的详细信息:

gl2.glPushMatrix(); // This preserves current MODEL_VIEW matrix so you can get back here. 
        // Think of it as a checkpoint save in a game. 
        // Most of your objects will be wrapped in push and pop. 
gl2.glLoadIdentity(); // This erases the MODEL_VIEW and replaces it with an identity. 
         // This un-does your previous gluLookAt call. You will rarely use 
         // this inside an object (but it's not impossible). 
         // Does not apply here so don't use. 
gl2.glTranslatef(x, y, z); // This is what puts your object out in space for you to find 
          // as opposed to putting it at the origin. Most objects will 
          // have a translate (and likely a rotate as well). 
          // Note that the order of operations matters: 
          // translate and then rotate != rotate and then translate. 
// QUAD strip code with vertices and colors - you're okay with these. 
gl2.glPopMatrix(); // This brings back the MODEL_VIEW that you originally saved by pushing 
        // it. 

约在OpenGL矩阵码伟大的事情是,一旦你的示例代码组合,你明白,你总是有它作为参考。当我在当天从IrisGL切换到OpenGL时,我花了一些时间来移植我的实用程序,然后我再也没有回头。

ORIGINAL:您需要添加立方体的绘制代码 - 如果你把立方体在(0,30,0),这是很有可能的代码是做什么你问它附近。

检查OpenGL常见问答,有一个具体的问题和答案,可能与您正在做的事情有关:8.080 Why doesn't gluLookAt work?我要引用整个答案,因为确实没有一个好的休息,但请访问OpenGL FAQ ,答案很可能出现在:

这通常是由不正确的 转换造成的。

假设你与zNear和zFar投影 矩阵堆栈上使用 gluPerspective()作为 第三和第四个参数,则 需要设置gluLookAt的模型视图 矩阵堆栈上,并将参数传递所以 您的几何落在zNear和 zFar之间。

当您试图了解观看 变换时,通常最好使用 简单的代码片段进行试验。假设您是 试图查看以原点为中心的单位球体 。你要 设置你转换为 如下:

glMatrixMode(GL_PROJECTION); 
glLoadIdentity(); 
gluPerspective(50.0, 1.0, 3.0, 7.0); 
glMatrixMode(GL_MODELVIEW); 
glLoadIdentity(); 
gluLookAt(0.0, 0.0, 5.0, 
      0.0, 0.0, 0.0, 
      0.0, 1.0, 0.0); 

重要的是要注意投影 和模型视图是如何将工作 在一起是很重要的。

在这个例子中,投影 变换设置了一个50.0度的字段 的视图,宽高比为1.0。 zNear剪裁平面在眼前是3.0单位 ,而剪裁平面是眼前的7.0单位 。这留下了Z量为4.0单位的距离,为单位球体提供了充足的空间。

模型视点转换集在(0.0,0.0,5.0)的眼 位置,并且 查找点是在 中心我们的单位球体的原点。请注意, 的眼球位置是距离观看点5.0个单位 。这是 重要,因为眼前的单位距离是 投影变换所定义的Z体积的中间位置 。如果 gluLookAt()调用已将眼睛置于 (0.0,0.0,1.0),它将产生距离原点1.0的距离。这个 不足以包含视图体积中的 球体,并且它将被zNear剪辑 平面剪切。

同样,如果你把在 眼(0.0,0.0,10.0),10.0 的距离的外表在点将会导致 单位球面上是10.0单位处 从眼睛和远远落后于zFar 剪切平面放置在7.0单位。

如果这让您感到困惑,请阅读 OpenGL红皮书 或OpenGL规范中的转换。 了解对象坐标空间后, 眼坐标空间,和 坐标空间,上面应该 变得清晰。另外,还可以试用 小测试程序。如果您的 在您的主应用程序项目中遇到问题 错误,那么 可能会编写一小段 代码,尝试以较简单的几何重现 问题。

+0

我实际上已经阅读了FAQ的这一部分,但没有找到任何帮助。我在这里输入gluLookAt()矩阵的数字是任意的。立方体的居中位置是(0,0,-5.0),边长为1.当我的程序开始时,无论gluLookAt()中的坐标如何,我总是直接看正面。 – Joel 2011-02-24 18:28:38

+0

它工作!这会教会我不要忽略我认为的样板代码......但有一个问题。我认为loadIdentity()仅适用于堆栈的顶部。由于在调用它之前我推了一个矩阵,在弹出堆栈之后它不应该没有效果吗? – Joel 2011-02-25 16:20:29

+0

@Joel,我会添加到答案。不挂断。 – 2011-02-25 22:03:15