gpt4 book ai didi

java - 在 JOGL 中进行翻译后无法按预期使用 glLoadIdentity

转载 作者:行者123 更新时间:2023-11-30 04:58:51 25 4
gpt4 key购买 nike

我刚刚开始使用JOGL,有一些我无法做到的事情:NeHe tutorials中有一个基本绘图和旋转的示例,一切都工作得很好,除了在第一个三角形之后和下一个四边形之前使用的 glLoadIdentity(); 。 JOGL 代码如下:

float rtri  = 0.0f;
float rquad = 0.0f;

@Override
public void display(GLAutoDrawable drawable) {

final GL2 gl = drawable.getGL().getGL2();

gl.glClear(GL2.GL_COLOR_BUFFER_BIT | GL2.GL_DEPTH_BUFFER_BIT);

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

gl.glTranslatef(-1.5f,0.0f,-6.0f);
gl.glRotatef(rtri, 0.0f, 1.0f, 0.0f);

gl.glBegin(GL2.GL_TRIANGLES);
{
gl.glColor3f(1.0f,0.0f,0.0f);
gl.glVertex3f( 0.0f, 1.0f, 0.0f);

gl.glColor3f(0.0f,1.0f,0.0f);
gl.glVertex3f(-1.0f,-1.0f, 0.0f);

gl.glColor3f(0.0f,0.0f,1.0f);
gl.glVertex3f( 1.0f,-1.0f, 0.0f);
}
gl.glEnd();

// Here seems to be the problem
gl.glLoadIdentity();

gl.glTranslatef(3.0f, 0.0f, 0.0f);
gl.glRotatef(rquad, 1.0f, 0.0f, 0.0f);

gl.glBegin(GL2.GL_QUADS);
{
gl.glColor3f(0.5f, 0.5f, 1.0f);
gl.glVertex3f(-1.0f, 1.0f, 0.0f);
gl.glVertex3f( 1.0f, 1.0f, 0.0f);
gl.glVertex3f( 1.0f,-1.0f, 0.0f);
gl.glVertex3f(-1.0f,-1.0f, 0.0f);
}
gl.glEnd();

gl.glFlush();

rtri += 0.15f;
rquad -= 0.5f;
}

正如你所看到的,在定义Quad之前有一个gl.glLoadIdentity();。如果注释掉这一行,最终程序将渲染第一个三角形旋转,并且四边形围绕三角形平移,但四边形也有自己的旋转。

如果该行没有注释,则根本不会渲染四边形,而只会渲染三角形,并具有定义的颜色和旋转。

到目前为止我看到的所有示例似乎都使用 gl.glLoadIdentity(); 来恢复当前矩阵模式 (GL_MODELVIEW) 的默认状态,但在这种情况下,似乎有其他东西即将发生。

我在每次绘图操作之前使用 gl.glPushMatrix();gl.glPopMatrix(); 进行了测试,围绕所有绘图代码,无论是否有gl.glLoadIdentity(); 在中间,但似乎没有任何帮助。

我检查了其他示例的 init 和 reshape 方法,但一切似乎都很好:

@Override
public void init(GLAutoDrawable drawable) {
final GL2 gl = drawable.getGL().getGL2();
gl.glShadeModel(GL2.GL_SMOOTH);
gl.glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
gl.glClearDepth(1.0f);
gl.glEnable(GL2.GL_DEPTH_TEST);
gl.glDepthFunc(GL2.GL_LEQUAL);
gl.glHint(GL2ES1.GL_PERSPECTIVE_CORRECTION_HINT, GL2.GL_NICEST);
}

@Override
public void reshape(GLAutoDrawable drawable, int x, int y, int width, int height) {
final GL2 gl = drawable.getGL().getGL2();
if (height <= 0) {
height = 1;
}
float h = (float) width / (float) height;
gl.glMatrixMode(GL2.GL_PROJECTION);
gl.glLoadIdentity();
glu.gluPerspective(50.0f, h, 1.0, 1000.0);
gl.glMatrixMode(GL2.GL_MODELVIEW);
gl.glLoadIdentity();
}

我想继续学习 OpenGL,同时使用 Java(我喜欢 Java,很久以前我不使用 C++),但我应该了解 OpenGL 的基础知识,并且我不想继续错过这样一个“基本”的东西。感谢大家的帮助,如果我的英语有错误,抱歉。

最佳答案

您的问题不是 glLoadIdentity。你的问题是这样的:

gl.glTranslatef(3.0f, 0.0f, 0.0f);
gl.glRotatef(rquad, 1.0f, 0.0f, 0.0f);

您将四边形沿 X 方向平移 3 个单位。好的,但它的 Z 值仍然为零。您的相机的 Z 值也为零,因为您是在相机空间中操作。由于您的近 Z 值为 1,因此您将剪掉相机的大部分内容。

另外,事实上,考虑到您的 FOV 为 50 度,并且您将 4 个 3 单元放置在 X 方向,它可能位于相机的右侧。所以它根本就看不见。

如果您想看到物体,则需要将其移离相机。

关于java - 在 JOGL 中进行翻译后无法按预期使用 glLoadIdentity,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7606006/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com