Как правильно получить нормальные векторы лица из файлов OBJ? - PullRequest
0 голосов
/ 06 февраля 2020

В моем трассировщике пути я построчно загружаю файлы 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)
}

В большинстве случаев этот код работает нормально, но программа отображает некоторые модели (но они видны только с отражающими материалами) с некоторыми черными гранями, как здесь:

render with black spots

Я предполагаю, что эта проблема связана с неправильными нормалями, потому что это не происходит, когда модель имеет материал Ламберта, это происходит только с материалами, где вектор нормали используется для расчета отражения или преломления (например, reflected := r.direction.Reflection(rec.normal)). Эта проблема либо не возникает при более рассеянном освещении, либо выглядит лучше, потому что вместо черных пятен я получаю пятна того же цвета, что и среднее освещение в сцене.

...