Мигание лампочек: автоматизация процесса

Урок этот для тех, кто работает во внешней рекламе, особенно для тех, кто занимается входными группами для игрового бизнеса и других развлекательных индустрий.

Лично мне, к примеру, надоело ручками на линейке проставлять ключики при мигании неона и лампочек.

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

Для начала разберем такую задачу:
Нам необходимо, чтобы в течении одной секунды сначала зажигалась первая лампочка (назовем ее Lamp1), потом она гасла и сразу зажигалась вторая лампочка (Lamp2), после чего к исходу текущей секунды эта лампочка гасла. Обратите внимание, что время, когда лампочка горит равно времени, когда лампочка не горит. Ну и конечно сделать этот процесс цикличным на любой отрезок времени.

Для этого нам нужно параметр Self-Illumination материала нашей лампочки прописать функцией, которая циклично менялась от 0% к 100%, причем не постепенно, а прыжками.

МИГАНИЕ ДВУХ ЛАМПОЧЕК.

2lamp2lamp

В конце этой части мы увидим, как решать более универсальную задачу (произвольное изменение периода колебаний)

Разберем для начала одну лампочку, вторую пропишем по аналогии.
Итак, в Material Editor создаем материал (назовем его L1).
Вот настройки L1:

BasicParam

В Diffuse я забросил карту Falloff. Это не обязательно делать, но желательно. Для чего – увидите, когда будем рендерить «горящую» лампочку

falloff

В сцене нарисуем сферу и присвоим ей наш материал.
Зададим сфере имя Lamp1

В этом материале (L1) нас интересует параметр Self-Illumination.
Значение 0 соответствует не горящей лампочке, значение 100 – зажженной лампочке.

SI

Для управления этим параметром воспользуемся такой замечательной вещью, как Curve Editor.
Сделаем это либо через пункт меню: Graph Editor/ Track View-Curve Editor
Либо гораздо проще: кликаем правой кнопкой в любом видовом окне и в контекстном меню выбираем Curve Editor.

CE-1

Ну что же:) тут все как на ладони:)
В левой части окна все возможные параметры нашей сцены. Так что же нам мешает найти параметр Self-Illumination? Да ничего.

В левой части окна находим: Medit Material/ Имя нашего материала (в данном случае L1)/ Shader Basic Parameters/ Self-Illumination
Теперь, для того, чтобы мы могли задать какую-либо функцию параметру Self-Illumination, нам нужно проассоциировать этот параметр с контроллером Float Expression. Именно в этом контроллере мы сможем прописывать наши функции.
Для этого кликаем правой кнопкой мыши на параметре Self-Illumination в левой части Curve Editor, в контекстном меню выбираем команду Assign Controller, в появившемся окошке выбираем Float Expression, жмем ОК.
Перед Вами должно появится окно контроллера:

EC_0

Для тех, кто впервые видит это окошко – не бойтесь, все будет просто:)

Настройте правую часть Curve Editor-а с помощью инструментов зума, так что бы по вертикали были видны значения 100 и -100.

CE-2

Возвращаемся к окну Expression Controller.
Наши функции мы будем прописывать в области Expression.
По умолчанию там стоит значение 0. Давайте поменяем его на 1 и нажмем кнопку Evaluate (аналог кнопки «Применить» в стандартных виндовых окнах). Значение самосвечения подпрыгивает до 100%.

Для наглядности можете вызвать окно Material Editor и любоваться изменениями в нашем материале.
Вообще любое значение в области Expression меньшее либо равное нулю соответствует отсутствию самосвечения, а любое значение равное либо большее 1, будет соответствовать 100% самосвечения.

Давайте представим себе, как должны выглядеть графики этих двух лампочек в Curve Editor.


gr-01

Т.е. в периоде между каждой N-ой и N+1-ой секундой в Curve Editor должны происходить вот такие колебания.

Осталось только написать функции, которые описывали бы эти графики.
«полуматематическим» языком график первой лампочки можно описать так:

Если текущее время в отрезке между N-ой и N+1-ой секундой меньше, чем половина этого периода (т.е. меньше чем 0,5), то значение функции = 1, иначе =0

Кое-кто уже догадался, к чему я веду:)
А веду я к употреблению условного оператора «Если».
В окне Expression Controller нажимаем на кнопочку Function List. Перед нами появляется список функций. Первая функция, которая нас интересует это if(c,t,f). По человечески это означает следующее: если выполняется условие C, тогда функция принимает значение T, иначе (если условие С не выполняется), функция принимает значение F.
Получаем следующее:
if(С,1,0),
где С - «текущее время в отрезке между N-ой и N+1-ой секундой меньше чем половина этого периода».
Теперь наше условие С нужно перевести на язык, который понимала бы машина.
По идее, нас интересует не сама N-я секунда, а значение времени между N-ой и N+1-ой секундой.
Для этого мы воспользуемся еще одной функцией из Function List: Floor(x).
Эта функция отсекает у Х значение после запятой. К примеру:
Floor(2,3)=2; Floor(5,7)=5; 12,6-Floor(12,6)=0,6

Используя Floor мы можем нашу функцию для первой лампочки привести к виду:
If (S-floor(S)<0.5,1,0)

Для второй соответственно:
If (S-floor(<0.5,0,1)

S – это «вшитое» в 3DMAXе значение, соответствующее текущей секунде.

С такими функциями наши лампочки будут совершат по одному поочередному колебанию в секунду.<

Изменение частоты колебаний

Допустим, нам необходимо сделать эти прыжки «горим-не_горим» в два раза чаще. Для этого просто достаточно S умножить на 2.

Для первой лампочки получаем:
If (S*2-floor(S*2)<0.5,1,0)

Для второй, соответственно:
If (S*2-floor(S*2)<0.5,0,1)

Для универсальности формулы в окне Expression Controller введем скалярную переменную, которая будет соответствовать частоте миганий в секунду. Назовем ее «А».

Теперь пошагово:
В окне Expression Controller в области Create Variables пишем название переменной, в нашем случае вписываем букву «А».
Проследите, чтобы справа был выбран вариант Scalar. Нажимаем кнопку Create. В области Scalars появится наша переменная.
Выделите ее, кликнув на ней левой кнопкой мыши, и задайте число колебаний в секунду, нажав на кнопку Assign to Constant и вписав необходимое число в появившемся окне (к примеру 2). Нажимаем ОК.



Нашу функцию заменяем на
If (S*А-floor(S*А)<0.5,1,0) для первой лампочки и
If (S*А-floor(S*А)<0.5,0,1) для второй.



Теперь с помощью Assign to Constant мы можем изменить переменную «А» на произвольное число.

Не забудьте «Эволюционировать», т.е. нажимать Evaluate. Ну и, конечно же, наслаждаться:)

Вот собственно и все, что касается мигания двух лампочек. Помните, что вы можете добавить к лампочкам Lens Effect/ Glow и добавить аналогичные функции в параметр Intensity. Да и вообще куда угодно.

Теперь давайте рассмотрим немного более сложный вариант.

ВОЛНА ИЗ ПЯТИ ЛАМПОЧЕК


Вот так выглядят графики для наших лампочек, функции на которые нам нужно написать.





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

Так для первой лампочки момент включения происходит в 1/6-ой части от периода, для второй в 1/3-й и т.д.



Вывод прост:

Создаем 5 материалов. Проделываем все те же процессы, что и в предыдущем примере, только формула для первой лампочки будет:

If (S*А-floor(S*А)<1/6,0,1)

Для второй:

If (S*А-floor(S*А)<1/3,0,1)


Для пятой:

If (S*А-floor(S*А)<5/6,0,1)



Где (напоминаю):

S – это «вшитое» в 3DMAXе значение, соответствующее текущей секунде.

А – частота повторов периодов в секунду.

Если А=2, то за одну секунду пройдет две волны, если А=1/2, то одна волна пройдет за две секунды.



Теперь сделаем формулу более универсальной для N-ого количества лампочек.



Введем еще две скалярные переменные:

В – будет соответствовать числу, равному номеру зажигающейся лампочке (т.е. порядковому номеру лампочки, если лампочка должна зажечься третей, тогда В=3).

С - будет соответствовать общему количеству лампочек, т.е. С=N.

Получаем формулу:



If (S*А-floor(S*А)<В/(С+1),0,1)



Для М-ной лампочки из общего количества N лампочек переменные

В=М

С=N





И последний случай

ПООЧЕРЕДНОЕ ЗАЖИГАНИЕ ПЯТИ ЛАМПОЧЕК


Этот пример интересен тем, что период лампочки состоит из трех этапов: не горит, горит, не горит.
Итак, разберем, к примеру, вторую из пяти. В виде функции нам надо описать следующее:



Если текущее время в отрезке между N-ой и N+1-ой секундой больше чем 1/6, но меньше чем 1/3, то значение функции = 1, иначе =0

Исходя из всех примеров, которые были, хочется написать:
If(1/6<S*А-floor(S*А)<1/3,0,1)
Но, как я не пробовал, почему-то макс не хочет нормально воспринимать в качестве условия отрезок времени ограниченный с двух сторон.
Соответственно пришлось сделать двойной оператор «Если»:

if(1/6<A*S-floor(A*S),
if(A*S-floor(A*S)<1/3,1,0)
,0)

В переводе на русский это звучит примерно так:
Если текущее время в отрезке между N-ой и N+1-ой секундой больше чем 1/6, тогда:
Если текущее время в отрезке между N-ой и N+1-ой секундой меньше чем 1/3,тогда
значение функции = 1, иначе =0
, иначе =0

Я просто плачу, когда представляю, как вы это читаете:)
На самом деле ничего сложного, просто не спешите и внимательно читайте.
Попытайтесь понять то, что тут написано, а не проскочить побыстрее. Это не высшая математика, а элементарная логика:)

Ну, что ж… осталось только эту формулу сделать универсальной, для N-ого количества лампочек.

if((B-1)/C<A*S-floor(A*S),
if(A*S-floor(A*S)<B/C,1,0)
,0)

Где:
В –будет соответствовать числу равному номеру зажигающейся лампочке (т.е. порядковому номеру лампочки, если лампочка должна зажечься третей, тогда В=3).
С - будет соответствовать общему количеству лампочек, т.е. С=N.

Будьте внимательны, когда будете переписывать формулу – следите за знаками!
Кстати говоря, эта формула подходит и для первой, и для последней лампочки тоже.

556 0 850 51
34
2006-09-21
Когда человек написал ТАКОЙ урок а ему ставят такие баллы - мне не понятно. 5\5 от меня!
2006-09-21
Нормальный урок. За одним исключением. ОН мало отличается от урока из книжки для 6 версии макса. Урок про бегущие огни в световой рекламе.
2006-09-21
Странник, уроки слизывать - не в моем характере. Я сам работаю в наружке и эта проблема просто, как-то стала Очень актуальна для меня. С математикой я дружу, поэтому все это написать ничего особо не стоило. А людей, которые, как и я периодически парятся с анимацией могут не знать способов решения такой проблеммы, а сделать заказ Надо:))
2006-09-21
Еж респект, тоже работаю в наружке, урок помог Вопрос есть только - не понял пока как параметр глоу связать с материалом, чтобы светилась геометрия, ато закопался я иллюминировать неон виреевскими настройками, или того хуже моделю в максе, а иллюминирую в майе. Подскажи ежели не влом :)
2006-09-21
работал в наружке... такие мудрёные действия делать не приходилось... Для кого урок???? для работников наружки?(нормальные сотрудники и так знают как это сделать, а новички не работают в "наружке")... Вот что получилоась, так это сделать из мухи слона...
2006-09-21
Дизбаланс по поводу прикручивания аутпутглоу, вот по этой ссылке, я общался(юсь) с Наваром, если, что не понятно - спрашивай http://www.render.ru/forum/viewtopic.php?topic_id=106102&start=20 В уроке, там где светящиеся шарики - использовал аутпутглоу, а там где голубые трубки - вреевский материал. Вреевский намного лучше. Дело в том, что если неоновую трубку подвесить в воздухе - у нее аутпутглоу нет, светятся только объекты, которые подсвечиваются неоном, это позволяет сделать врей, если хочешь, я тебе солью максовский файл с трубками - покапаешься в материале - поймешь. Если нет - пиши, подскажу:))) С.Андр Не понимаю твоей агресии:)) Это же НЕ статика, а динамика:)) А если ты раставлял ключики горим-не_горим в анимационной линейке, значит тебе не жалко своего времени:))) "а новички не работают в "наружке")... " - :)))) похоже на "трус не играет в хокей":)) еще как работают!:)) профи с неба не падают, а учатся. И мудреного тут ВООБЩЕ ничего нет:)) у меня это заняло 5 минут расчета формул на бужке и еще 5 минут прошивки в максе:))) И слонов тут нет:)) если ВНИМАТЕЛЬНО читать - то видно, что все просто. А если увидеть пару простых формул и испугаться - то конечно мудрено будет:)) Еще раз говорю: это не высшая математика, а элементарная логика:))
2006-09-21
Я сам работаю в наружке, поэтому, Еж, большое тебе человеческое спасибо! Думаю меня не раз твой урок выручит! А с меня 5/5;)
2006-09-21
Урок интересный, но все это можно было бы сделать проще применив Waveform float controller. Очень удобная штука для циклической анимации
2006-09-21
А реально назначить глобальные переменные A и C, чтобы менять их в одном месте, а не лазить по разным контроллерам?
2006-09-21
Live На сколько мне извесно - нет. Просто контроллер можно копировать и соотвертственно вставлять в другие материалы. Если это делать в окне КурвЭдитора - то параметры сохраняются, а если в ЭкспрешенКонтроллере, то значения переменных обнуляются.
2006-09-22
ШИКАРНЫЙ урок для людей которые начинают работать с анимацией неона просто НЕЗАМЕНИМЫЙ. К томуже он имеет практическую важность в отличие от большинства уроков которые показывают какой нибудь декоративный эффект в принципе не нуженый. Побольше бы таких уроков на рендере. Тогда бы людям жилось проще. Во вторых подробность и четкость изложения все понятно и просто благодаря этому за день можно разобраться с анимацией и созданием неона как такового. В форуме идет несколько обсуждений касательно неона где сидят люди попрофессиональней меня, после этого урока я сам могу им обяснить как делать неон. Так что высший бал за качество, актуальность и многое другое!!!!!!!!!!!!!!!!!!!!!!!!!!
2006-09-22
Спасибо всем за каменты:)) Dr.Stein ты совершенно прав на счет Waveform float controller. Просто как для меня, то не менее просто, но более интересно делать формулами. Я чувствую себя творцом кривой и это не заберает у меня лишних усилий, а дает большее удовлетворение. Но даже не это главное:)) Просто с помощью Float Expression можно творить все, что угодно:)) Этот контроллер более широкий в применении и дает гораздо больше возможностей. Если начать им пользоваться и это понравиться - то открываются невероятные горизонты:)) Наварон Я просто растаял от твоего камента:))) Если еще будут вопросы в наружке обращайся:)) Чем смогу - помогу:)) Да вообще, кому смогу тому тем и помогу:))
2006-09-25
Молодец. Качественный урок по экспрэшену в максе. Правда скрипт контроллер было проще использовать, да и гибче он. А экспрэшен это старый атавизм :)
2006-09-29
Отличный урок, особенно для меня, я занимаюсь наружкой для казино, 5/5 баллов . только вот с проблемой столкнулся: попытался применить в работе, а анимация работает только до 100 кадра, дальше стопорится. Самому решить проблему не получается, так что прошу о помощи. SOS
2006-09-29
Отличный урок для тех кто начал изучать ипользование функций в анимации.
2006-09-30
2 красный ээ... если ты делал по уроку, то анимация будет длиться столько, сколько кадров в анимационной линейке. есть два варианта: 1. у тебя по умолчанию стояло 100 кадров и ты использовал другой метод, потом поменял колличество кадров, а анимация застряла на 100-ом. Тогда в курвЕдиторе в пункте меню "controller" есть команда (на память я ее не помню, ближайшие 2 недели я вне макса), но смысл ее в том, что бы игнорировать временную линейку и тогда твоя кривая пойдет пунктиром по всей временной оси (причем даже в отрицательную сторону:) ) 2. ты просто не увеличил кл-во кадров я думаю у тебя скорее 1-й вариант Если не разберешся - пиши в личные сообщения, постараюсь помочь, но только я ближайшие две недели редко буду за компом.
2006-10-05
Отличное знание предмета. Уважуха автору. За такое "копание" темы я поставил 5\5. Есть один нюанс. Как человек, который тож решал такие задачи (но далеко не так солидно) обязан заметить: ОБЩЕЕ ВРЕМЯ РЕНДЕРА!!! Лично у меня была проблема - 4 канала (всего навсего) но при этом - 16 вариантов "мигания" и все поочереди друг за другом, если даже на каждый вариант придется хоть бы по 4 сек, то время всего цикла - 54 сек, что в свою очередь составит - 1620 кадров (если в сек 30 кадров). Если кто делает рендер с помощью Финала, Врея или еще какого-то рендера, то общее время будет СЛИШКОМ велико для ТАКИХ задач. А если еще клиент попадется капризный (я лично других почти не свтречал), и начнет твердить мол эту мигалку выкинь, а тут переставь местами, а тут помедленей. И каждый раз заново рендерить. Я делал иначе: делал по ОДНОМУ кадру для варианта свечения, т.е. горит данная лампа (или группа ламп-светодиодо) - это один кадр, горит другая лампа - второй кадр, горят обе лампы - третий кадр, нифига не горит - четвертый кадр. Ну а после - ручками (нудно и неудобно) раставлял все АфтереЭффекте. Согласен - это не так изящно, но быстрее. ИМХО конечно.
2006-10-07
2 BanderSnatch OnSamiy если у тебя камера не перемещается - то можно так, как ты говоришь, только "склеивать" не в автоэфекте, а просто сделать анимационый гиф в имиджреди (как я сделал для этого урока) с необходимой задержкой между кадрами.
2006-10-11
что то я прогнал:)) если камера на месте стоит, то можно просто поставить частоту кадров 1,2 или 3 в секунду (в зависимости от динамики) прямо в максе
2006-10-15
Наконец-то, и до Track View добрались!
2006-10-21
Циклическую анимацию можно делать и так: Применительно для лампы: делается три ключа 1. не горит, 2. горит, 3 снова не горит В треквиев вибираются все ключи и жмем кнопку - "Set tangens to step". Теперь лампа включается-выключается, а не постепенно загорается-затухает. А теперь жмем кнопку - "Parametr curve Out of Range Types" (тут выбираются сценарии поведения ВНЕ области действия ключей), в появимшемся окне жмем правую нижнюю картинку "relative repeat". Теперь лампа мигает на протяжении ВСЕГО временного сегмента.
2006-12-21
урок очень заинтересовал (изложен понятно) да и вообще неон и все такое попробовала - получилось НО!!! при повторном открытии файла ничего-не-увидела... а и еще любой обьект (сфера, куб и пр.) рисовались строго по координатам 0,0,0 Это только со мной или кто-то еще столкнулся с подобным? перезагрузка дело не спасла, сносила 3d max и ставила по новой :(
2007-04-03
to Еж: отличный урок, а не подскажите нет ли русскоязычного описания к остальным функциям?
2008-05-03
Пременную иф мой макс 9 не распознаёт..Пишет мол ошибка.
2008-11-09
[b]Arturro[/b], в части формул отчего-то A, B и C эквивалентны РУССКИМ буквам, поэтому копирование формулы из статьи дает ошибку. If пишется с маленькой буквы, а сигнатуру допустимых функций можно посмотреть, нажав кнопку Function List. [b]Еж[/b], спасибо за замечательный урок! Очень интересно и познавательно=)
2009-02-02
Как раз искал этот урок большое спасибо!!! Благодаря вашему уроку я выполнил заказ вовремя!!!
2009-06-04
Спасибо за урок
2010-02-19
Извините конечно...у меня вопрос еще про первое..где для двух лампочек...у меня лампочки враз загораются и гаснут, как-будто это одна лампочка...что делать?
2010-02-19
Извините конечно...у меня вопрос еще про первое..где для двух лампочек...у меня лампочки враз загораются и гаснут, как-будто это одна лампочка...что делать?
2010-02-19
спасибо!!!клевый урок!я во всем разобрацо:)
2010-12-21
супер........Молодца!!!!!!!!!!!!!!!!!!!!!!!!!
2011-05-18
Урок отличный только обьясните Создаем 5 материалов. Проделываем все те же процессы, что и в предыдущем примере, только формула для первой лампочки будет: If (S*А-floor(S*А)<1/6,0,1) Для второй: If (S*А-floor(S*А)<1/3,0,1) … Для пятой: If (S*А-floor(S*А)<5/6,0,1) вот для 3 и 4 какие значения? Скажите пожалуйсто
2011-05-18
[quote=Ярик Ермаков] Урок отличный только обьясните Создаем 5 материалов. Проделываем все те же процессы, что и в предыдущем примере, только формула для первой лампочки будет: If (S*А-floor(S*А)<1/6,0,1) Для второй: If (S*А-floor(S*А)<1/3,0,1) … Для пятой: If (S*А-floor(S*А)<5/6,0,1) вот для 3 и 4 какие значения? Скажите пожалуйсто [/quote] для третей If (S*А-floor(S*А)<1/2,0,1) т.к. 1/2=3/6 для четвертой If (S*А-floor(S*А)<2/3,0,1) т.к. 2/3=4/6
2014-03-04
извините, а для каждой лампочки новый материал нужно создавать?? у меня их мне(лампочек)
RENDER.RU