我想在openGL中绘制一个3D对象但是最好的方法是什么呢?我正在考虑在2D中绘制它的侧面轮廓,然后可能将它充实成3D,但这可能吗?我认为这样做会更容易,然后直接进入3D,但如果你不能再这样就浪费我的时间了。
我也无法弄清楚如何添加天空甚至可能是大海的反射,这很容易吗?
gl.glClear(GL.GL_COLOR_BUFFER_BIT);
gl.glColor3f(1.0f, 1.0f, 1.0f);
gl.glPushMatrix();
gl.glTranslatef(-1.0f, 0.0f, 0.0f);
gl.glRotatef((float) shoulder, 0.0f, 0.0f, 1.0f);
gl.glTranslatef(1.0f, 0.0f, 0.0f);
// gl.glPushMatrix();
gl.glScalef(2.0f, 0.4f, 1.0f);
glut.glutWireCube(1.0f);
// gl.glPopMatrix();
gl.glTranslatef(1.0f, 0.0f, 0.0f);
gl.glRotatef((float) elbow, 0.0f, 0.0f, 1.0f);
gl.glTranslatef(1.0f, 0.0f, 0.0f);
// gl.glPushMatrix();
gl.glScalef(2.0f, 0.4f, 1.0f);
glut.glutWireCube(1.0f);
// gl.glPopMatrix();
gl.glTranslatef(1.0f, 1.0f, 1.0f);
gl.glRotatef((float) hand, 0.0f, 0.0f, 1.0f);
gl.glTranslatef(1.0f, 0.0f, 0.0f);
// gl.glPushMatrix();
gl.glScalef(2.0f, 0.4f, 1.0f);
glut.glutWireCube(1.0f);
// gl.glPopMatrix();
我一直在尝试使用随机数来尝试让它工作,但到目前为止还没有这样的运气!
答案 0 :(得分:1)
好的,首先,根据你想要的方式,反思很难。在尝试这样的事情之前,你肯定需要学习更多的OpenGL。其次,3D对象需要更多矩阵内容,这是我在3D游戏中使用init方法的一个例子:
private void initGl() {
glViewport(0, 0, Display.getWidth(), Display.getHeight());
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
GLU.gluPerspective(45.0f, Display.getWidth() / Display.getHeight(), 1.0f, 100.0f);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
glClearDepth(1.0f);
glDepthFunc(GL_LEQUAL);
glEnable(GL_DEPTH_TEST);
glShadeModel(GL_SMOOTH);
glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST);
glEnable(GL_FOG);
glFogi(GL_FOG_MODE, GL_EXP2);
glFogf(GL_FOG_DENSITY, density);
glHint(GL_FOG_DENSITY, GL_FASTEST);
glEnable(GL_CULL_FACE);
glCullFace(GL_BACK);
}
在绘制之前,您还需要像这样清除缓冲区:
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
当你说只是充实2D物体时,你几乎是正确的。如果我们仍然使用立即模式(glBegin()/glEnd()
),您的方法将是正确的。但是,立即模式现在已弃用,我们通常使用VBO。如果你使用的是LWJGL,我会建议去YouTube上搜索编码宇宙,他有一个关于VBO和高级渲染的视频,我是如何学习它们的!
在3D世界中祝你好运,它根本不容易,但它(在我看来),当你得到一些工作时,比2D更令人满意。
另外,考虑投资RedBook,全部是关于LWJGL。