我遇到使用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结构指针传递它。
这是我的茶壶 这是它想象的茶壶
答案 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);