Бывает задача сделать анимацию счетчика, типа цифровых часов, таймера, секундомера, и т. д. Раньше я решал задачу на Python, но теперь это гораздо проще сделать с помощью Animation Nodes.

Установка Animation Nodes

Если вы еще знакомы с Animation Nodes — это обычный аддон, который можно поставить в любую версию блендера 2.7x. Скачивайте AN отсюда:

нажмите

Затем устанавливаете как обычный аддон: File → User Preferenses → Add-ons. Внизу кнопка Install from file, там ищем скачаный зип. Потом активируем аддон, поставив галку напротив Node: Animation Nodes.

Кнопка

Разбейте 3д-вид на 2 окна и одну часть переключите на редактор нодов. И мы готовы.

Создаем ноды, управляющие текстом

Итак, создаем объект типа Text и создаем нодовое дерево в AN:

25 KB
out.gifout.gif

Чтобы из AN влиять на текстовый объект, создадим нод Shift + A → Text → Object Output.

57 KB
out_0.gifout_0.gif

Кнопка с точкой активирует возможность правки объекта. Далее создадим число Shift + A → Number → Integer. И соединим выход Integer Input со входом Text.

155 KB
out_2.gifout_2.gif

Заметьте, AN автоматически конвертирует число в текст.

Скорее всего, кроме счетчика должны быть еще символы. Чтобы добавить их вначале и вконце используем нод Shift + A → Text → Join. При попытке вставить этот нод, AN опять добавляет нужные ноды, удобно:

300 KB
out_3.gifout_3.gif

В принципе уже неплохо, цифра добавляется в текст:

Снимок

Но вот незадача, если число меньше нуля, не добавляется ноль:

Снимок

Нужно похимичить. Добавим Boolean → Compare и Boolean → Switch. Если соединим ноды так, то если число будет больше нуля, используется значение If True, если нет — If False (Compare выдает результат сравнения, Switch выбирает значение согласно полученному результату):

Снимок

Продублируем нод Create String List и добавим в него пункт с нулем. Затем пропустим через нод Switch, который выберет нужный вариант.

160 KB
out_4.gifout_4.gif

Объединяем все в группу

Теперь мы потратим еще немного сил, и сделаем группу, которую можно использовать несколько раз или перенести в другую сцену. Для начала, назовем нашу нодовую группу:

Снимок

Теперь мы сможем переместить ноды в другую сцену, используя File → Append. Раскладка нодов с этим названием будет лежать внутри NodeTree

72 KB
out_5.gifout_5.gif

Так мы можем переносить нодовые раскладки AN. Теперь сделаем группу AN, они отличаются от обычных групп нодов в композе и материалах. Чтобы сделать ее, нужно добавить новый нод. Shift + A → Subprograms → Group. Возникнет нод Group input, к нему нужно подключить данные, которые будут меняться от сцены к сцене. Надо подключить анимируемое число, подопытный текст, а так-же текст перед и после числа:

256 KB
out_6.gifout_6.gif

Затем дадим всему этому осмысленные названия (и обзовем группу вцелом):

Снимок

Затем создадим новый датаблок:

18 KB
out_7.gifout_7.gif

Это нужно, чтобы при File → Append не импортировалось ничего лишнего.

В Subprograms появилась наша группа:

Снимок

Сразу потестим анимацию. Мы можем создавать ключи, наведя на число и нажав I

Снимок

К сожалению, мы не можем редактировать ключи, сделанные в AN с помощью Dope Sheet или редактора анимационных кривых. Поэтому воспользуемся другими методами.

Способы анимировать число

Самый простой — использовать специальный нод, предназначенный для анимации. Добавим Animation → Time Info и Animation → Animate number. Time Info содержит номер текущего кадра, его надо передать в нод Animate Float (Number).

95 KB
out_8.gifout_8.gif

Start указывает какое было число вначале анимации, End — в конце. Duration указывает сколько по времени занимает анимация в кадрах. Анимация начинается в в нулевом кадре, чтобы изменить это, нужно изменить time. Например, чтобы анимация началась в 5-м кадре нужно отнять 5. Отнимать можно с помощью нода Number → Math, его нужно переключить в режим Substract:

233 KB
out_9.gifout_9.gif

Способ довольно быстрый, но он не использует ключевые кадры. Попробуем сделать по-другому.

Сначала зайдем в свойства объекта и создадим новую переменную:

100 KB
out_11.gifout_11.gif

Заметьте, я убираю десятичные нули в графе Property Value. Так я указываю, что мне нужно целое число.

Из контекстного меню выберем Copy Data Path. Его нужно вставить в нод Object → Attribute Input:

381 KB
out_12.gifout_12.gif

Осталось соединить ноды и мы получим переменную, которую можно анимировать и редактировать анимацию через Dope Sheet и анимационные кривые.

Секунды и минуты

Если нужно, можно сделать счетчик так, чтобы при достижении 100 миллисекунд (или 60 сек) счетчик сбрасывался на ноль, и добавлялась секунда. Поскольку это немного другой функционал, я начал с нуля.

Снимок

Если разделить число в нашем счетчике на 100, то мы получим в результате секунды, а в остатке будут миллисекунды. Нод Math имеет режимы деления (Divide) и остаток от деления (Modulo). Отправив счетчик в эти ноды, мы получим секунды и миллисекунды. Результат выходит в числах с точкой, их нужно перевести обратно в целое:

Снимок

Если вы запутались, и не понимаете почему у вас что-то не работает, проверьте выходы нодом Debug.

С каждым значением нужно провести операцию добавления нуля, если число меньше 10. Это мы уже делали, повторим:

Снимок

Затем остается все объединить c помощью Texts → Join и запаковать в группу. Проверим:

107 KB
out_14.gifout_14.gif

Финальный результат

Снимок