При создании анимации иногда бывает необходимо выполнить какие-то действия в зависимости от времени или, что в сущности одно и то же, номера текущего кадра. Осуществить привязку анимации к кадрам в Blender возможно с использованием встроенного Python API.
В качестве примера создадим несложную анимацию, последовательно превращающую одну из букв произвольного текста из строчной в заглавную.
- Для начала добавим в сцену текст:
- shift+a – Text
- переименовать его в “toLower”
- заменить базовое “Text” на что-нибудь более интересное, например “cartoon” (мультфильм).
- придать немного объемности
- в окне Properties во вкладке Object data в панели Geometry:
- Extrude = 5
- Depth = 1
- Resolution = 2
- в окне Properties во вкладке Object data в панели Geometry:
- shift+a – Text
Для того, чтобы связать изменения текста с номером текущего кадра, необходимо отслеживать событие переключения кадров. Blender API предоставляет для этого возможность прослушивания следующих событий:
- frame_change_pre – возникающего перед сменой очередного кадра
- frame_change_post – возникающее после смены очередного кадра
Подключив для работы с API Blender внешнюю IDE PyCharm или же просто воспользовавшись встроенным текстовым редактором, определим функцию, которая будет выполнять необходимые действия при смене кадра:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
import bpy import math def textChanger(scene): startFrame = bpy.data.scenes['Scene'].frame_start endFrame = bpy.data.scenes['Scene'].frame_end currentFrame = bpy.data.scenes['Scene'].frame_current textObject = bpy.data.objects['toLower'] text = list((textObject.data.body).lower()) upperLetterIndex = math.floor(currentFrame / ((endFrame - startFrame) / len(text))) text[upperLetterIndex] = text[upperLetterIndex].upper() textObject.data.body = ''.join(text) |
В первых четырех строчках функция определяет переменные startFrame – номер первого кадра, endFrame – номер последнего кадра и currentFrame – номер текущего кадра, а так же ссылку на созданный ранее объект с текстом “toLower”.
В последних четырех строчках функция разбивает текст из текстового объекта “toLower” побуквенно, вычисляет порядковый номер буквы, которая должна быть заглавной на текущем кадре анимации исходя из общего количества букв в тексте и общего числа кадров, заменяет ее на заглавную и обновляет текст в объекте “toLower”.
Осталось главное – подключить созданную функцию в качестве обработчика события смены кадров анимации.
Для этого необходимо добавить ее в список обработчиков события frame_change_pre:
1 2 |
if textChanger not in bpy.app.handlers.frame_change_pre: bpy.app.handlers.frame_change_pre.append(textChanger) |
Данный код сначала проверяет, не была ли зарегистрирована данная функция как обработчик этого события ранее, и если нет – добавляет ее в список обработчиков события frame_change_pre.
Полный код скрипта выглядит следующим образом:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
import bpy import math def textChanger(scene): startFrame = bpy.data.scenes['Scene'].frame_start endFrame = bpy.data.scenes['Scene'].frame_end currentFrame = bpy.data.scenes['Scene'].frame_current textObject = bpy.data.objects['toLower'] text = list((textObject.data.body).lower()) upperLetterIndex = math.floor(currentFrame / ((endFrame - startFrame) / len(text))) text[upperLetterIndex] = text[upperLetterIndex].upper() textObject.data.body = ''.join(text) if textChanger not in bpy.app.handlers.frame_change_pre: bpy.app.handlers.frame_change_pre.append(textChanger) |
После выполнения скрипта, запустив анимацию или вручную перемещая курсор в окне Timeline, можно видеть как одна из букв текста меняется на заглавную в соответствии с положением текущего кадра.
Можно подобрать шрифт повеселее, настроить фон и материалы и отправлять анимацию на рендер.