我一直在为 openGl 编写一个 .obj 加载器。几何体加载良好,但法线总是乱七八糟。我尝试在 2 个不同的程序中导出模型,但似乎没有任何效果。据我所知,这就是您将法线放入 GL_TRIANGLES 的方式

     glNormal3fv(norm1);
     glVertex3fv(vert1);
     glNormal3fv(norm2);
     glVertex3fv(vert2);
     glNormal3fv(norm3);
     glVertex3fv(vert3);

(法线在其余代码中引用了 GLfloats。)

编辑:这是一张带有破损法线的等面体的图片

这是完整的 obj 加载器代码和文件:
    void loadOBJFromFile(NSString *path,float movex,float movey)
{
    NSString *contentns = [[NSString alloc]initWithContentsOfFile:path encoding:NSASCIIStringEncoding error:NULL];
    NSArray *pieces = [contentns componentsSeparatedByString:@"#"];
    //creating the arrays to read the vertecies and normals from.
    NSArray *normals = [[pieces objectAtIndex:3]componentsSeparatedByString:@"\n"];
    NSArray *vertecies = [[pieces objectAtIndex:2]componentsSeparatedByString:@"\n"];
    //The +1 is to make sure we ignore the texture/ material definition that vomes before the faces.
    int normalCount = [[normals objectAtIndex:0]intValue]+2;
    int faceCount = [[normals objectAtIndex:normalCount]intValue];
    //glTranslatef(movex, 0, movey);

glBegin(GL_TRIANGLES);
{
for (int i = 0; i < faceCount;i++)
{
    //aquires all the numbers in thye current face.
    NSArray *currentFace = [[normals objectAtIndex:normalCount+i+1]componentsSeparatedByString:@" "];
    NSArray *v1 = [[currentFace objectAtIndex:1]componentsSeparatedByString:@"//"];
    NSArray *v2 = [[currentFace objectAtIndex:2]componentsSeparatedByString:@"//"];
    NSArray *v3 = [[currentFace objectAtIndex:3]componentsSeparatedByString:@"//"];

    //crewatres the arrays to contain the vertecies
    NSArray *vertex1 = [[vertecies objectAtIndex:[[v1 objectAtIndex:1]intValue]]componentsSeparatedByString:@" "];
    NSArray *vertex2 = [[vertecies objectAtIndex:[[v2 objectAtIndex:1]intValue]]componentsSeparatedByString:@" "];
    NSArray *vertex3 = [[vertecies objectAtIndex:[[v3 objectAtIndex:1]intValue]]componentsSeparatedByString:@" "];
    //creates all the arrays for the normals
    NSArray *normal1 = [[normals objectAtIndex:[[v1 objectAtIndex:1]intValue]]componentsSeparatedByString:@" "];
    NSArray *normal2 = [[normals objectAtIndex:[[v2 objectAtIndex:1]intValue]]componentsSeparatedByString:@" "];
    NSArray *normal3 = [[normals objectAtIndex:[[v3 objectAtIndex:1]intValue]]componentsSeparatedByString:@" "];

    //creates the vertecies coordinates
    GLfloat vert1[] = {[[vertex1 objectAtIndex:1]floatValue],[[vertex1 objectAtIndex:2]floatValue],[[vertex1 objectAtIndex:3]floatValue]};
    GLfloat vert2[] = {[[vertex2 objectAtIndex:1]floatValue],[[vertex2 objectAtIndex:2]floatValue],[[vertex2 objectAtIndex:3]floatValue]};
    GLfloat vert3[] = {[[vertex3 objectAtIndex:1]floatValue],[[vertex3 objectAtIndex:2]floatValue],[[vertex3 objectAtIndex:3]floatValue]};
    //creates the normals coordinates

    GLfloat norm1[] = {[[normal1 objectAtIndex:1]floatValue],[[normal1 objectAtIndex:2]floatValue],[[normal1 objectAtIndex:3]floatValue]};
    GLfloat norm2[] = {[[normal2 objectAtIndex:1]floatValue],[[normal2 objectAtIndex:2]floatValue],[[normal2 objectAtIndex:3]floatValue]};
    GLfloat norm3[] = {[[normal3 objectAtIndex:1]floatValue],[[normal3 objectAtIndex:2]floatValue],[[normal3 objectAtIndex:3]floatValue]};

     glNormal3fv(norm1);
     glVertex3fv(vert1);
     glNormal3fv(norm2);
     glVertex3fv(vert2);
     glNormal3fv(norm3);
     glVertex3fv(vert3);
}}
glEnd();

}

.obj 文件:
#Wavefront OBJ file created by Hexagon 2
mtllib object.mtl
g Form0
usemtl def_surf_mat
# 12
v -12.533 4.78719 0
v -12.533 20.2788 0
v -7.74583 12.533 -12.533
v -7.74583 12.533 12.533
v 0 0 -7.74583
v 0 0 7.74583
v 0 25.066 -7.74583
v 0 25.066 7.74583
v 7.74583 12.533 -12.533
v 7.74583 12.533 12.533
v 12.533 4.78719 0
v 12.533 20.2788 0
# 12
vn -0.850651 -0.525731 0
vn -0.850651 0.525731 1.50014e-08
vn -0.525731 -1.50014e-08 -0.850651
vn -0.525731 0 0.850651
vn 1.50014e-08 -0.850651 -0.525731
vn -1.50014e-08 -0.850651 0.525731
vn -1.50014e-08 0.850651 -0.525731
vn 1.50014e-08 0.850651 0.525731
vn 0.525731 0 -0.850651
vn 0.525731 7.5007e-09 0.850651
vn 0.850651 -0.525731 1.50014e-08
vn 0.850651 0.525731 -1.50014e-08
usemtl def_surf_mat
20
f 7//7 8//8 12//12
f 7//7 2//2 8//8
f 8//8 4//4 10//10
f 6//6 10//10 4//4
f 7//7 9//9 3//3
f 5//5 3//3 9//9
f 6//6 5//5 11//11
f 6//6 1//1 5//5
f 1//1 4//4 2//2
f 1//1 2//2 3//3
f 12//12 11//11 9//9
f 12//12 10//10 11//11
f 2//2 4//4 8//8
f 10//10 12//12 8//8
f 12//12 9//9 7//7
f 3//3 2//2 7//7
f 3//3 5//5 1//1
f 4//4 1//1 6//6
f 9//9 11//11 5//5
f 11//11 10//10 6//6

最佳答案

有了你在问题中添加的额外信息,我的想法已经用完了。我也无法真正阅读 Objective-C,但我建议仔细检查您所有的数组索引和行计数代码(也许打印出所有内容以查看它们是否真的符合您的预期),因为解析基于对确切布局和注释的信任一个单一的导出商创建看起来很毛茸茸的。

原答案:

没有看到您的加载程序代码和 .obj 文件,这里有几件事情需要检查:

  • 怎么搞砸了?完全错误,或者只是例如平面阴影而不是平滑阴影?
  • 是那些由三个 GLfloat 组成的 norm1、norm2 等数组吗?
  • 普通数组是否包含合理的值(因此从文件中读取它们有效)?
  • 您的法线是否标准化为长度 1?
  • 法线索引是否正确,即您是否有正确顶点的正确法线?
  • 关于c++ - 法线在 openGL 中表现得很奇怪,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/11229110/

    10-10 14:25
    查看更多