C++ 用openGL绘制OBJ文件

C++ 用openGL绘制OBJ文件,c++,opengl,C++,Opengl,我在使用openGL显示所有对象时遇到问题。我有5个不同的obj文件:立方体、茶壶、台灯、男人和汽车。立方体、灯和人画得很好,但茶壶和汽车渲染不正确 我有一个读取obj文件的方法,我已经打印了输出,以仔细检查输出是否与obj文件匹配,并且它们都是正确的 这是我的draw()代码,我认为问题就在这里 glBegin(GL_TRIANGLES); for(int i = 0; i < f_count; i++){ if(f[i].type == 'c'){ GLfloa

我在使用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();
我不确定我做错了什么,或者我所展示的代码是否做错了什么。。然而,这就是我“感觉”错误所在的地方

说明:

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

在draw()方法中,它循环遍历f struct指针并检查类型,如果是颜色类型,则添加glmaterialsv(…,…);如果不是,则它将获取面的索引值,并将其传递给顶点结构指针和向量法线结构指针

这是我的茶壶 这是茶壶,它应该是这样的

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

另外,
glNormal()
仅锁定某些状态。在下一个
glVertex()
调用之前,不会向OpenGL发送任何内容,此时锁定的颜色/正常/位置状态将被捆绑并沿管道传递

只有最近的
glNormal()
调用才会有任何效果,因为它将覆盖自上次
glVertex()
以来的任何其他
glNormal()

因此,您需要交错
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); 

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

另外,
glNormal()
仅锁定某些状态。在下一个
glVertex()
调用之前,不会向OpenGL发送任何内容,此时锁定的颜色/正常/位置状态将被捆绑并沿管道传递

只有最近的
glNormal()
调用才会有任何效果,因为它将覆盖自上次
glVertex()
以来的任何其他
glNormal()

因此,您需要交错
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); 

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

另外,
glNormal()
仅锁定某些状态。在下一个
glVertex()
调用之前,不会向OpenGL发送任何内容,此时锁定的颜色/正常/位置状态将被捆绑并沿管道传递

只有最近的
glNormal()
调用才会有任何效果,因为它将覆盖自上次
glVertex()
以来的任何其他
glNormal()

因此,您需要交错
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); 

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

另外,
glNormal()
仅锁定某些状态。在下一个
glVertex()
调用之前,不会向OpenGL发送任何内容,此时锁定的颜色/正常/位置状态将被捆绑并沿管道传递

只有最近的
glNormal()
调用才会有任何效果,因为它将覆盖自上次
glVertex()
以来的任何其他
glNormal()

因此,您需要交错
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); 


立方体、灯和人与茶壶和汽车还有什么不同吗?所有的对象都是从.obj文件加载的,并且它们都应该是用灯光绘制的吗?为什么这被否决了?我知道现代OpenGL有一个非常陡峭的学习曲线,但是直接模式(glVertex等)自OpenGL 3以来就被弃用了。立方体、灯和人与茶壶和汽车之间还有什么不同吗?所有的对象都是从.obj文件加载的,并且它们都应该是用灯光绘制的吗?为什么这被否决了?我知道现代OpenGL有一个非常陡峭的学习曲线,但是直接模式(glVertex等)自OpenGL 3以来就被弃用了。立方体、灯和人与茶壶和汽车之间还有什么不同吗?所有的对象都是从.obj文件加载的,并且它们都应该是用灯光绘制的吗?为什么这被否决了?我知道现代OpenGL有一个非常陡峭的学习曲线,但是直接模式(glVertex等)自OpenGL 3以来就被弃用了。立方体、灯和人与茶壶和汽车之间还有什么不同吗?是否所有对象都是从.obj文件加载的,并且它们都应该使用照明绘制?为什么会被否决?我知道现代OpenGL有一个非常陡峭的学习曲线,但自OpenGL 3以来,立即模式(glVertex等)已被弃用。这解决了汽车问题,并使其他图像看起来更好!但是茶壶不是固定的…:/是的,我改变了法线并将它们交织在一起,所有的物体看起来都很完美,除了茶壶。。这就是我贴出的问题的答案。这解决了汽车问题,使其他图像看起来更好!但是茶壶不是固定的…:/是的,我改变了法线并将它们交织在一起,所有的物体看起来都很完美,除了茶壶。。这就是我贴出的问题的答案。这解决了汽车问题,使其他图像看起来更好!但是茶壶不是固定的…:/是的,我改变了法线并将它们交织在一起,所有的物体看起来都很完美,除了茶壶。。这就是我贴出的问题的答案。这解决了汽车问题,使其他图像看起来更好!但是茶壶不是固定的…:/是的,我改变了法线并将它们交织在一起,所有的物体看起来都很完美,除了茶壶。。这就是我贴出的问题的答案。