3d 什么';这是获得脸的正确方法;从OBJ文件中提取法向量?

3d 什么';这是获得脸的正确方法;从OBJ文件中提取法向量?,3d,geometry,normals,wavefront,3d,Geometry,Normals,Wavefront,在我的路径跟踪器中,我逐行加载OBJ文件,加载顶点和顶点法线,如下所示: faceVerts = append(faceVerts, [3]Tuple{ vertices[v1-1], vertices[v2-1], vertices[v3-1], }) faceNormals = append(faceNormals, [3]Tuple{ vertNormals[vn1-1], vertNormals[vn2-1], vertNormals[vn3-1], }) for i

在我的路径跟踪器中,我逐行加载OBJ文件,加载顶点和顶点法线,如下所示:

faceVerts = append(faceVerts, [3]Tuple{
    vertices[v1-1], vertices[v2-1], vertices[v3-1],
})

faceNormals = append(faceNormals, [3]Tuple{
    vertNormals[vn1-1], vertNormals[vn2-1], vertNormals[vn3-1],
})
for i := 0; i < len(faceVerts); i++ {
    triangle := Triangle{
        TrianglePosition{
            faceVerts[i][0],
            faceVerts[i][1],
            faceVerts[i][2],
        },
        material,
        Tuple{0, 0, 0, 0},
    }
    normal0 := faceNormals[i][0]
    normal1 := faceNormals[i][1]
    normal2 := faceNormals[i][2]
    triangle.normal = (normal0.Add(normal1).Add(normal2)).Normalize()
    *list = append(*list, triangle)
}
然后我试着像这样计算每个三角形的面法线:

faceVerts = append(faceVerts, [3]Tuple{
    vertices[v1-1], vertices[v2-1], vertices[v3-1],
})

faceNormals = append(faceNormals, [3]Tuple{
    vertNormals[vn1-1], vertNormals[vn2-1], vertNormals[vn3-1],
})
for i := 0; i < len(faceVerts); i++ {
    triangle := Triangle{
        TrianglePosition{
            faceVerts[i][0],
            faceVerts[i][1],
            faceVerts[i][2],
        },
        material,
        Tuple{0, 0, 0, 0},
    }
    normal0 := faceNormals[i][0]
    normal1 := faceNormals[i][1]
    normal2 := faceNormals[i][2]
    triangle.normal = (normal0.Add(normal1).Add(normal2)).Normalize()
    *list = append(*list, triangle)
}
i:=0的
;i
大多数情况下,此代码似乎工作正常,但程序会使用一些黑色面渲染某些模型(但仅在使用反射材质时可见),如下所示:


我假设这个问题与错误的法线有关,因为当模型具有朗伯材质时不会发生这种情况,它只发生在法线向量用于计算反射或折射的材质上(例如,
反射:=r.direction.reflection(rec.normal)
)。这个问题不是在漫反射照明较多的情况下发生,就是看起来更好,因为我没有得到黑点,而是得到了与场景中平均照明颜色相同的点。

在建模软件中打开文件以可视化法线,例如Blender,并确保它们都朝向同一方向。如果没有,那么这些软件提供了正确重新计算法线的方法。你从哪里得到OBJ?还要注意的是“斯坦福模型”是从点云扫描和重建的。它们通常包含退化面、重复顶点、自相交,在使用路径跟踪时可能会产生瑕疵。有些人试图清理它们,但它们总是有可能包含不受欢迎的特性。这些“不受欢迎的特性”对于研究是有好处的,因为它们可以作为压力测试,但生产中使用的干净模型很少包含这么多人工制品。我从这里获取了模型:但我将在Blender中检查法线,感谢提示,一些法线朝向错误的方向,我将重新计算它们并重新渲染图像!很高兴你能解决你的问题。