Добрый день. Я занимаюсь web-разработкой и почти всем, что с этим связано.

Создание и анимирование плазменной лампы

Введение

Автором этого урока является человек с ником ssv_170379. Весь текст ниже — немного изменённый текст оригинального урока.

Всем привет! Сегодня мы создадим анимированную плазменную лампу, примерно такую, как на фото ниже (да-да, это фото). Урок состоит из трёх этапов: моделирование, анимация и настройка материалов. Итак, приступим.

—

Результат

Моделирование

Начнём с корпуса. В данной работе мы будем использовать Dynamic Paint, поэтому наша сфера должна иметь UV-развёртку. К сожалению, я не знаю быстрого способа развернуть существующую сферу, поэтому мы создадим её из плоскости: ставим 3D-курсор в 0.0.0 (Shift-S, Cursor to center), добавляем плоскость, подразделяем её (Ctrl-R) на 16 частей по одной из осей и на 32 по второй, делаем ей развёртку.

—

Ориентируем окно вида вдоль той оси, которая содержит меньше делений (в моём случае Х, горячая клавиша Numpad3), ставим 3D-курсор в 0.0.1 (через N-панель, 1 — радиус будущей сферы.) и сворачиваем нашу плоскость в полуцилиндр (Shift-W, 180, Enter). Ориентируем вид вдоль другой оси (Y, Numpad1) и сворачиваем полуцилиндр в сферу (Shift-W, 360, enter). Ставим сферу вертикально, назначаем плавное затенение (Shade Smooth), сшиваем дубликаты вершин у полюсов (Remove doubles), центрируем начальную точку объекта (Origin to geometry), пересчитываем нормали (Normals → Recalculate). Теперь у нас есть сфера с UV-координатами.

—

Теперь создадим молнии. Моделируем несколько (с десяток) разных сплайнов примерно такого вида. Отклонение сплайна от центровой линии в каждой точке будет влиять на толщину молнии, поэтому логичнее сделать концевые вершины близко к центровой линии, а серединные — вразброс. Кривизну задаём по обеим осям. Длина сплайнов берётся с запасом около 20% радиуса шара, т. к. в процессе анимации они будут искривляться, и, если брать размер «впритык», они не достанут до внутренней поверхности оболочки. В конце сплайны-молнии преобразуем в полигоны (Alt-C).

—

Моделируем толщину стекла, ядро и опору, на которой оно стоит. Нормали внутренней поверхности стекла должны быть направлены внутрь. Сфера ядра и внутренняя поверхность стекла тоже должны иметь UV-координаты, поэтому создаём их из уменьшенных копий сферы корпуса. На этом моделирование заканчивается, приступаем к анимации.

—
Анимация

Молния должна иметь объём. Этот эффект достигается с помощью быстрого вращения каждой из молний вокруг локальной оси Z и использования Motion blur. Скроем наружные сферы и все молнии кроме какой-нибудь одной, выставим ей ключ на параметр Delta rotation: Z (можно и просто Rotation, не принципиально). Теперь в Graph editor добавляем к ключу модификатор Noise с параметрами Strength порядка 12 (размах вращения близкий к ±180°, т.е. полный оборот), Depth 3 (чуть повышаем хаотичность) и Scale тоже около 12 (скорость вращения). В настройках рендера включаем Motion blur (значение Shutter ставим в 2, это количество кадров, которые оцениваются для расчёта смазывания, больше кадров — сильнее размытие). Делаем тестовый рендер, должно получиться что-то похожее на:

—

Так как на данный момент (2.67.1) Blender не поддерживает визуализацию Motion blur в окне просмотра, рендер придётся делать через F12. Копируем нашу анимацию на все имеющиеся молнии (Ctrl-L, Animation data).

Степень размытия молнии пока что невелика, но в процессе урока мы её увеличим, добавляя другие анимации.

Далее, реализуем хаотичное плавное движение молний внутри шара. Т.к. ось Z уже занята, а нам нужны все три оси для нового движения, мы создадим набор пустышек по количеству молний, сделаем их родителями молний и анимируем их. На данном этапе удобно разделить сцену по слоям: первый слой – молнии, второй слой — остальная геометрия плазма-шара, третий слой — пустышки. Сейчас есть 10 молний, создаём 10 пустышек (удобнее брать Single arrow), каждую из них делаем родителем одной из молний (удобнее выделать пары объектов через Outliner). Bezier curve парентим (Ctrl-P) к Empty, Bezier curve.001 к Empty.001 и так до .009. Так как молний должно быть больше, мы создаём несколько копий наших 10 связанных объектов, выделяем молнии и пустышки, и несколько раз делаем Alt-d, без изменения координат копий. Я сделаю 5 копий, итого в сцене будет 60 молний.

Теперь анмируем одну из пустышек. Устанавливаем ключ на Rotation (для всех 3 осей), в Graph editor добавляем шум ко всем трём ключам Scale = 200 (медленное перемещение), Strength = 7 для осей X, Y и 8 для Z (разброс по X, Y чуть меньше, чтобы молнии меньше заходили в нижний сектор сферы, где подставка), Depth = 0. Копируем (Ctrl-L) анимацию на все 10 пустышек, и сразу делаем каждую анимацию уникальной (Make single user), (U → Object animation → Selected objects). Теперь мы изменим фазу и скорость каждой из анимаций, чтобы каждая пустышка двигалась по индивидуальной траектории. Для этого используем скрипт, написанный пользователем Nuarn (http://blender3d.org.ua/forum/animation/270-28.html#455).


import bpy
import mathutils
for empt in bpy.context.selected_objects:
    bpy.context.scene.objects.active = empt
    for fcurv in empt.animation_data.action.fcurves:
        fcurv.modifiers[0].phase = mathutils.noise.random()*20000-10000
        fcurv.modifiers[0].scale = mathutils.noise.random()*100+150
—

Скрипт задаст всем выделенным объектам разброс фазы модификатора анимации Noise в диапазоне ± 10000 и скорости в пределах 150-250 (в чистом виде mathutils.noise.random() выдаёт дробное значение в диапазоне 0…1).

Итак, выделяем все пустышки (в моём случае их 60, все находятся на отдельном слое) и выполняем скрипт. Теперь все пустышки (и молнии вместе с ними) движутся независимо (см. рисунок слева).

Если в районе нулевого кадра разброс молний окажется неравномерным (большинство пустышек смотрят в одну сторону), просто меняем диапазон кадров для анимации, например не 0-200, а 60-260. Также можно выполнять скрипт несколько раз, он каждый раз будет присваивать новые уникальные значения всем пустышкам, давая «букет» разной формы.

Также с помощью этого скрипта стоит дать разброс фазы и нашей первой (Z delta rotation) анимации.

—

Молнии уже имеют толщину и анимацию движения. Далее с помощью модификатора Displace мы анимируем их искривление. Создаём пустышку (удобно взять Sphere большого размера), называем её displace_coords, она будет анимировать Displace-текстуру. Назначаем ей ключи Location и Rotation, и добавляем всем ключам шум (Scale: 350, Strength: 8, Depth: 0, фаза везде разная). Теперь наша пустышка будет плавно-хаотично дрейфовать в пространстве.

Берём одну молнию, добавляем модификатор Displace, копируем на все молнии (см. рисунок).

Верхний левый кадр — молнии до Displace, правый — после. Чёрная сфера на заднем плане — пустышка displace_coords. Кстати, именно этот модификатор даёт искажение длины молнии, поэтому при моделировании мы брали её с запасом.

Последний штрих: Если внимательно посмотреть на ядро, то мы увидим, что часть молний всё-таки проходит сквозь конструкцию основания (см. рис. ниже). Создаём пустышку где-то на полпути вниз от ядра к корпусу шара, называем её obstacle. Добавляем к любой молнии модификатор Warp, и в конце Subsurf 1 уровня, чтобы чуть сгладить молнию. Копируем модификаторы на все молнии (см. рисунок).

Сверху слева молнии до применения модификатора, справа — после. Теперь молнии не проходят сквозь подставку и стали плавнее. Чёрный каркасный шар на правой картинке — пустышка obstacle. Модификатор Warp искривляет молнии на основе полей From (откуда: пустышка obstacle) и To (куда: объект-ядро, шарик, из которого выходят молнии). Таким образом, сегменты молний, попадающие в радиус действия (0,5) модификатора, плавно смещаются вверх.

—

С анимацией справились. Визуализация молний на данном этапе выглядит примерно так:

—

Материалы

Список материалов: наружное стекло, внутреннее стекло, молния, ядро, опора ядра.

Опора ядра — простой глосси с шероховатостью 0.1.

Молнии. Как видно из картинки-исходника, цвет молний бело-голубой около ядра, переходящий в более интенсивный голубовато-синий в середине, и малиновый снаружи. Используем ColorRamp с такой раскраской. Теперь нужно привязать этот цвет к положению молнии внутри шара. Так как молнии будут изгибаться и точная длина сегмента внутри шара неизвестна, UV-маппинг не подходит. Мы будем назначать цвет, исходя из расположения конкретной точки внутри шара:

—

Красный блок: получаем координату точки относительно центра объекта (независимую от расположения объекта в сцене).
Далее нужно получить модуль значения, т.к. нас интересует только удалённость точки от центра (Origin) объекта, неважно в положительную или отрицательную сторону.
Зелёный: вычисляет модуль координаты по каждой из осей.
Синий: собираем координаты в одно число, оно получается пропорциональным расстоянию точки от центра объекта.
Далее (нода Divide) делим на радиус внутренней стенки корпуса, пропускаем через ColorRamp и подаём на цвет Emission. Всё, что выходит за стекло (нода Greater than) — не рендерим.

Стекло наружное: просто стекло, ближе к краям добавляем голубоватое свечение:

—

Стекло внутреннее: На стекле должны быть сполохи в тех местах, где его касаются молнии. Маску для их наложения создадим с помощью Dynamic paint. Объекты-молнии делаем кистями (см. рисунок «кисть»), назначаем кисть одному (через панель Physics), на остальные копируем через Ctrl-L (Dynamic paint является модификатором). Как видно из настроек, будет определяться близость к стеклу в пределах 0.075 единиц и пересечение со стеклом. Внутреннюю поверхность стекла делаем холстом (панель Physics → Dynamic Paint → Canvas → Add canvas) с примерно такими настройками (см. рисунок «холст»). Frames — длина нашей анимации, Sub-steps — расчёт промежуточных значений между кадрами, некий аналог Motion blur. Так как некоторые молнии движутся достаточно быстро, лучше выставить этот параметр побольше, хоть он и очень сильно увеличивает время расчёта. Dry — время остаточного свечения стекла (в кадрах), когда молния переместится в другое положение. hull_wetmap — шаблон имени файлов. Жмём кнопку Bake image sequence (слой с молниями должен быть включен), ждём, текстура пересечения молний со стеклом готова. Кадр из последовательности должен выглядеть примерно так (см. рисунок «карта»).

—

Теперь сам материал:

—

Малиновый — собственно стекло с едва заметным свечением по всей поверхности.
Жёлтый — материал сполохов.
Красный — анимированная маска hull_wetmap, которую мы создали предыдущим действием, определяющая, где молнии подходят к стеклу, чтобы визуализировать сполохи.
Синий — всякие украшательства, чтобы сполохи выглядели естественнее, они смешиваются с шумом, также накладывается более размытая копия этих пятен, с очень малой, на грани видимости, прозрачностью и тоже шумится. Ключи на ноде Mapping анимированы аналогично пустышке displace_coords (описание дано выше по тексту). В общем, здесь можно ставить всё, что угодно, лишь бы было красиво.
Зелёный — сполохи ярко видны на боковых поверхностях корпуса, но приглушаются на передней и задней (параллельных камере).

Ядро. Как и для внутреннего стекла, нам нужно обозначить области на ядре из которых выходят наши молнии. Dynamic paint / Brush (кисть) на молниях уже есть. Выделяем ядро, назначаем (через панель Physics) ему холст (Dynamic paint → Canvas → Add canvas). Параметры выставляем не такие ресурсоёмкие, как для корпуса, т.к. поверхность ядра достаточно маленькая, и здесь можно сэкономить. Параметры и примерный вид карты на рисунке слева.
—

Теперь создаём материал (рисунок внизу): Красный — анимированная маска core_wetmap, используется, для визуализации свечения ядра в тех областях, где из него выходят молнии. Зелёный — украшательства. Шум, и размытая копия основного пятна, снова маскируем искусственность. Синий — усиливаем свечение по контуру ядра.

—

Всё готово. Можно добавить исчезающе-прозрачный объект для плавного появления сцены из темноты, анимировать параметр Render/Sampling/Seed и рендерить анимацию.

—

Спасибо вам за внимание и ssv_170379 за урок.

Комментарии