Normal’ное волшебство


Как вы думаете, что необычного в этих кубах? Возможные ответы:
  1. разная детализация;
  2. автор стебается;
  3. весеннее обострение.

Вообще-то правильный ответ первый, но вот крайние примитивы имеют одинаковое количество вершин, хотя и выглядят по-разному.


Как вы уже поняли, секрет «высокополигональности» третьего объекта в правильно повернутых нормалях вершин, за счет чего скосы на ребрах выглядят более пологими. А вот для среднего объекта я уже добавил дополнительные ребра «жесткости». Чтобы было понятно, о чем идет речь, посмотрите на рисунок ниже.

рис. 2 Структура примитивов

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

К примеру, мой скриншот с тремя кубами. Поставленная простая задача — создать фаски на гранях объекта, что я и сделал. Вот только при включении сглаживания всё расплывалось. Для получения более четких переходов пришлось добавить дополнительные элементы. В итоге начальные 24 вершины превратились в 96. Вроде пустяк, но это лишь примитивный куб.

Ручное редактирование нормалей позволило не увеличивать количество элементов и в тоже самое время получить весьма достойный результат. Причем его можно было бы значительно улучшить. Об этом и сказ далее...

рис. 3 Просто нормали

Одна вершина — одна нормаль. Вопрос только в одном, как их редактировать? Стандартные способы Blender здесь не работают. Хотя есть, к примеру, специальный модификатор Normal Edit. Но он хорош только для массового редактирования и не предоставляет доступа к отдельным элементам (это можно сделать, но уж больно извращенным способом).

В последнее время я сконцентрировался на браузерных проектах и, соответственно, на Blend4Web. В его состав входит уникальный редактор нормалей с очень роскошным функционалом. Разумеется, им можно пользоваться не только для подготовки моделей для WebGL. Обработанные с его помощью объекты прекрасно рендерятся или экспортируются в FBX для последующего использования в игровых движках. Так что, это достойный экземпляр для изучения и использования в работе.

рис. 4 Редактор нормалей от Blend4Web

Вся магия заключена в панели с названием Blend4Web. Она хранит дополнительный инструментарий, поставляемый вместе с движком, но кое-что можно использовать и не для реал-тайм. Разумеется, перед этим нужно установить бесплатный SDKBlend4Web. Как это сделать — читайте на сайте разработчика.

Редактор нормалей позволяет кое-какие действия выполнять в автоматическом режиме с массивом вершин. В тоже время нет никаких проблем с редактированием одной конкретной. Чтобы не усложнять материал, я буду демонстрировать все это на примере того же куба со скошенными гранями.

Работа с редактором начинается с его активации (кнопка Activate). Основное действие происходит в режиме редактирования структуры объекта. На рисунке 4 как раз показан куб и его нормали, распространяющихся в стандартных направлениях, т.е. так, как расположил их сам Blender. В принципе, показ нормалей можно включить стандартным для Blenderспособом (панель Mesh Display). Но удобнее воспользоваться специальными опциями в панели Normal Editor. Кнопка Show Normals включает показ, а Size отвечает за длину отображения. Собственно, эти опции дублируют стандартные.

Итак, при включении функции Smooth скосы на ребрах куба становятся незаметными (см. рис. 1, левый крайний куб). Чтобы светотени создали нужный нам эффект, необходимо развернуть нормали вершин плоскостей куба строго перпендикулярно их основе, т.е. они должны «смотреть» параллельно нормали самой плоскости.

Это лучше всего сделать в автоматическом режиме. Выделяете каждую плоскость, нажимаете кнопку Face и вуаля!

рис. 5 а) оригинальный куб, б) куб с измененными нормалями, в) рендер варианта Б

Normal Editor позволяет сделать больше. Например, мне нужны четкие выпуклости скосов. Стандартно это делается добавлением новых ребер «жесткости». Ведь все вершины куба уже смотрят в нужных направлениях. Банально не хватает вершин. Можно сделать «финт ушами» — каждую нормаль подразделить ещё на несколько. Я не особо понимаю, как это происходит технически, но важно другое — буквально каждая вершина объекта может «смотреть» сразу в нескольких  направлениях.

Впанели Normal Editor естькнопка Split Mode. После её включения становится доступной опция Index. Именно в ней выбирается конкретная нормаль вершины. Такая работа требует усидчивости и очень кропотливая. Здесь нет каких-либо автоматических средств типа Face. Всё только ручками, но поверьте, оно того стоит!

рис. 6

Ручное редактирование нормалей осуществляется несколькими способами:

  • Непосредственное вращение в окне 3DView после нажатия кнопки Rotate.
  • Вращение путем изменения координат XYZ.
  • Можно вращать, если перемещать источник света в окне-образце рядом с координатами.

Есть еще две полезные функции для редактирования: кнопка Restore (восстанавливает всё по умолчанию) и Copy/Paste для быстрого копирования координат с одной нормали на другую (увы, в режиме Split копирование не работает).

Вот и результат. Смотрите, что  у меня вышло с такими «размноженными» нормалями. Напоминаю, что количество вершин не изменилось, всё те же 24 вертекса, всё тот же стандартный куб. А выглядит, как будто я минимум утроил количество ребер.

рис. 7 

Конечно, работать с каждой нормалью — это ещё то удовольствие, несмотря на мощные инструменты редактирования в Normal Editor. Впрочем, для ленивых есть несколько автоматических решений. С одним из них (Face) я уже вас познакомил, но на панели редактора можно найти ещё две кнопки Tree и Foliage.

Названия очень многообещающие, но не думайте, что при нажатии на них вы получите идеальные деревья (tree) и листву (foliage)! Все, проще, они позволяют массово распространять нормали в определенных направлениях:

  • Face. Нормали вершин располагаются параллельно нормали полигона.
  • Foliage. Нормали смотрят вверх по координате Z.
  • Tree. Взрывообразный разброс нормалей, где в качестве эпицентра выступает 3DCursor Blender.

Вот как-то так. Спасибо разрабам Blend4Web за столь интересный инструмент!

3
2016-05-25
При сплите нормалей, количество вершин, которые будет видеть движок, изменится, их будет столько же сколько и нормалей
2016-05-25
Опс, не знал. Нужно будет аккуратнее использовать этот инструмент
2016-05-25
Так это же обычные группы сглаживания. Если между полигонами одна группа сглаживания, то нормали объединяются в одну, если разные группы сглаживания, то нормали не объединяются и перпендикулярны полигону.
RENDER.RU