Це норма: що таке карти нормалей та як вони працюють

Протягом кількох років я намагався розібратися в картах нормалей та проблемах, які зазвичай виникають при роботі з ними.

Більшість знайдених пояснень була надто технічною, неповною або надто складною для мого розуміння, тому я вирішив спробувати пояснити зібрану мною інформацію. Я розумію, що ці пояснення можуть бути неповними чи не зовсім точними, але все одно спробую.

Перші створені людиною 3D-моделі виглядали приблизно так:

Це чудово, але така модель має очевидне обмеження: вона виглядає занадто полігональною.

Найбільш очевидне рішення: додати більше полігонів, зробивши поверхню рівномірнішою і гладкішою, аж до того, щоб полігони здавалися єдиною гладкою поверхнею. Але виявляється, для того, щоб зробити поверхні на зразок сфер гладкими, потрібна величезна кількість полігонів (особливо сьогодні).

Потрібно інше рішення, і так були винайдені нормалі. (Все відбувалося не зовсім так, але так простіше пояснювати та розуміти.)

Давайте простежимо за лінією з центру полігону, перпендикулярної його поверхні. Ми дамо цій лінії дуже незвичну назву: нормаль. Мета нормалі – контролювати, куди вказує поверхню, щоб коли світло відбитися від цієї поверхні, вона могла використовувати нормаль для обчислення відображення, що вийшло. Коли світло падає на полігон, ми порівнюємо кут променя світла із нормаллю полігону. Промінь відбивається під тим самим кутом щодо напряму нормалі:

Іншими словами, відображення світла буде симетричним щодо нормалі полігону. Саме так працює більшість відображень у реальному світі. За промовчанням промені світла відбиваються від усіх полігонів абсолютно перпендикулярно до їх поверхні (як повинні це робити в реальному житті), тому що нормалі полігону за умовчанням перпендикулярні до поверхні полігону. Якщо в нормалях будуть прогалини, ми побачимо їх як окремі поверхні, оскільки світло відобразиться в одному чи іншому напрямку.

Якщо дві грані з’єднані, ми можемо попросити комп’ютер згладити перехід між нормаллю одного полігону до іншого, щоб нормалі поступово вибудовувалися відповідно до найближчої нормаллю полігону. Таким чином, коли світло потрапить рівно в центр одного полігону, то воно відобразиться прямо, відповідно до напряму нормалі. Але між полігонами цей напрямок нормалі згладжується, змінюючи віддзеркалення світла.

Ми сприйматимемо перехід як єдину поверхню, тому що світло буде відображатися між одним і іншим полігоном плавним чином, і між ними не буде прогалин. По суті, світло відбивається від цих полігонів плавно, начебто ми маємо безліч полігонів.

Саме цим ми керуємо, задаючи smoothing groups (3ds Max, Blender) або вказуючи ребра як hard або smooth (Modo, Maya): ми повідомляємо програмі, які переходи між гранями повинні бути плавними, а які жорсткими.

>

Ось порівняння однієї сфери з 288 полігонів з жорсткими та плавними переходами:

Потенційно ми можемо задати щось на кшталт паралелепіпеда, щоб усі його вершини мали усереднені нормалі. 3D-редактор намагатиметься згладити його поверхню, щоб вона виглядала як єдина плавна поверхня. Для 3D-редактора це цілком логічно, але виглядає дуже дивно, тому що ми маємо об’єкт, який очевидно повинен мати кілька окремих поверхонь (кожна грань паралелепіпеда), проте програма намагається показати їх як одну плавну поверхню.

Саме тому в 3D-редакторах зазвичай є параметр кутів згладжування: якщо у нас є два пов’язані полігони під кутом, що перевищує кут згладжування, то їх перехід буде плавним, а з’єднання полігонів під кутом менше кута згладжування буде жорстким. Завдяки цьому круті кути між поверхнями відображатимуться як різні поверхні, як це буває в реальному світі.