我已经检查了有关此主题的其他问题,他们的解决方案对我没用。我有点失落。我的GLEventListener实现中有以下函数。
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 :(得分: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 FAQ,有一个特定的问题和答案可能与你正在做的事情有关:8.080 Why doesn't gluLookAt work?我将引用整个答案,因为确实没有好的休息但是请访问OpenGL FAQ,答案可能就在那里:
这通常是由不正确引起的 变换。
假设您正在使用 gluPerspective()关于投影 矩阵堆栈与zNear和zFar为 第三和第四个参数,你 需要在ModelView上设置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);
重要的是要注意投影方式 和ModelView转换工作 在一起。
在此示例中,投影 变换设置了50.0度的字段 视图,纵横比为1.0。 zNear剪裁平面为3.0个单位 在眼前和zFar 剪裁平面前面是7.0个单位 的眼睛。这留下Z体积 距离4.0单位,充足的空间 单位领域。
ModelView变换设置了眼睛 位于(0.0,0.0,5.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规范。在你之后 理解物体坐标空间, 眼睛坐标空间和剪辑 坐标空间,上面应该 变得清晰。另外,试验一下 小测试程序。如果你有 无法获得正确的转换 在你的主要应用程序项目中,它 可写教育小 试图重现的一段代码 几何更简单的问题。