В моем трассировщике пути я построчно загружаю файлы 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)
}
В большинстве случаев этот код работает нормально, но программа отображает некоторые модели (но они видны только с отражающими материалами) с некоторыми черными гранями, как здесь:
Я предполагаю, что эта проблема связана с неправильными нормалями, потому что это не происходит, когда модель имеет материал Ламберта, это происходит только с материалами, где вектор нормали используется для расчета отражения или преломления (например, reflected := r.direction.Reflection(rec.normal)
). Эта проблема либо не возникает при более рассеянном освещении, либо выглядит лучше, потому что вместо черных пятен я получаю пятна того же цвета, что и среднее освещение в сцене.