使用openGL绘制OBJ文件

时间:2013-11-19 16:43:31

标签: c++ opengl

我遇到使用openGL显示所有对象的问题。我有5个不同的obj文件:立方体,茶壶,灯,男人和汽车。立方体,灯和男人画得很好但是茶壶和汽车没有正确渲染。

我有一个读取obj文件的方法,我已经打印出来仔细检查输出是否与obj文件匹配,并且它们都是正确的。

这是我的draw()代码,我认为问题出在这里

glBegin(GL_TRIANGLES);
for(int i = 0; i < f_count; i++){
    if(f[i].type == 'c'){
        GLfloat * color = new GLfloat[4];
        color[0] = f[i].x;
        color[1] = f[i].y;
        color[2] = f[i].z;
        color[3] = 1;

        glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, color);
    }
    else{
        glVertex3f(vn[(f[i].vn1-1)].x, vn[(f[i].vn1-1)].y, vn[(f[i].vn1-1)].z); // normals
        glVertex3f(vn[(f[i].vn2-1)].x, vn[(f[i].vn2-1)].y, vn[(f[i].vn2-1)].z); // normals
        glVertex3f(vn[(f[i].vn3-1)].x, vn[(f[i].vn3-1)].y, vn[(f[i].vn3-1)].z); // normals

        glVertex3f(v[(f[i].v1-1)].x, v[(f[i].v1-1)].y, v[(f[i].v1-1)].z);
        glVertex3f(v[(f[i].v2-1)].x, v[(f[i].v2-1)].y, v[(f[i].v2-1)].z);
        glVertex3f(v[(f[i].v3-1)].x, v[(f[i].v3-1)].y, v[(f[i].v3-1)].z);   
    }
}
glEnd();

前3个是法线,另外3个是顶点 这是我的带有结构的头文件

 struct NormalVector
 {
     GLfloat x, y, z;
 };

 struct Vertex
 {
     GLfloat x, y, z, w;
 };

 struct Faces
 {
     int v1,v2,v3, vn1,vn2,vn3;
     char type;
     GLfloat x,y,z;
 };

我不确定我做错了什么,或者我对我提供的代码做了什么错误。但是这就是我“感觉”错误的位置。

说明:

Vertex * v是顶点指针 VectorNormal * vn是法线向量指针 Faces * f是面部指针

在draw()方法中,它遍历f结构指针并检查类型,如果是颜色类型,则添加glMaterialfv(..,..,..);如果不是,则它抓取faces的索引值并通过Vertex结构指针和Vector Normal结构指针传递它。

这是我的茶壶 Here is my teapot 这是它想象的茶壶 enter image description here

1 个答案:

答案 0 :(得分:3)

您通过glNormal()提供法线,而不是glVertex()

此外,glNormal()仅锁定某些状态。在下一次glVertex()调用之前,没有任何东西真正被发送到OpenGL,此时锁定的颜色/正常/位置状态被捆绑起来并传递给管道。

只有最近的glNormal()电话会产生任何影响,因为它会覆盖自上次glNormal()以来的任何其他glVertex()

因此,您需要交错glNormal()次来电:

glNormal3f(vn[(f[i].vn1-1)].x, vn[(f[i].vn1-1)].y, vn[(f[i].vn1-1)].z);
glVertex3f(v[(f[i].v1-1)].x, v[(f[i].v1-1)].y, v[(f[i].v1-1)].z);

glNormal3f(vn[(f[i].vn2-1)].x, vn[(f[i].vn2-1)].y, vn[(f[i].vn2-1)].z);
glVertex3f(v[(f[i].v2-1)].x, v[(f[i].v2-1)].y, v[(f[i].v2-1)].z);

glNormal3f(vn[(f[i].vn3-1)].x, vn[(f[i].vn3-1)].y, vn[(f[i].vn3-1)].z);
glVertex3f(v[(f[i].v3-1)].x, v[(f[i].v3-1)].y, v[(f[i].v3-1)].z);