Лекция 8::Задача 0
- Forums:
Генериране на нормали
В случаи като примера със сърцето в тестовата сцена (meshes.fmiray), няма как да пуснем normal smoothing върху обекта, защото нямаме самите нормали, т.е. няма върху какво да интерполираме. Целта на задачата е да решите този проблем, като напишете алгоритъм, който създава нормалите във върховете на сърцето чрез усредняване на геометричните нормали на прилежащите триъгълници. Т.е., за всеки връх в Mesh-а, създавате по един нормален вектор, който е "вързан" към върха, и го задавате като сума на всички геометрични нормали (gnormals) на триъгълниците, в който съответния връх участва. Понеже всеки нормал накрая ще представлява сума от няколко други нормала, ще трябва да ги нормирате. По-конкретно:
- Добавете проверка в края на loadFromOBJ метода на класа Mesh. Ако флагът hasNormals е false, значи вашият алгоритъм трябва да се изпълни
- Добавете толкова нормални вектора към масива normals, колкото и върха има обекта, т.е. vertices и normals трябва да имат еднакъв брой елементи. Новите елементи в normals инициализирайте с нули
- Обходете всички триъгълници на Mesh-а. На всеки триъгълник, сложете normal indices да съвпадат с vertex indices (n[i] = v[i]), и добавете gnormal-а на триъгълника към трите нормални вектора на триъгълника.
- След като приключите с триъгълниците, обходете новополучените нормални вектори и ги нормирайте (normalize())
- Не забравяйте да сложите и hasNormals = true
В резултат, трябва да получите нещо такова: пример
Бонус (1т):
Да се добави опция с име "generateNormals" на Mesh обекта, която указва дали да се пуска написаният от вас алгоритъм. За целта добавете един bool към Mesh класа и го регистрирайте в Mesh::registerProperties, и освен това го инициализирате на false в Mesh конструктора. В резултат на това, ако в meshes.fmiray в "Mesh dice {..." блока добавите ред "generateNormals true", то сърцето трябва да е загладено. Ако го смените на false или махнете въобще, сърцето трябва да си стои както сега (фасетно). Не забравяйте, че парсъра работи с файла отгоре надолу, така че редът с "generateNormals" трябва да е преди реда, указващ името на .OBJ файла.