Render.ru

Анимация столбиков как в эквалайзере, только правильной волной

Tongue

Активный участник
Рейтинг
15
#1
Всем привет!
Есть ряд боксов (столбики,частокол или подобного вида)
нужно пустить по ним волну. То есть чтобы каждый по очереди плавно изменял свою высоту. В итоге получится одна волна, которая пройдет по всему ряду боксов.
Было бы неплохо контролировать этот процесс, например, перемещением думмика.

Кто может посоветовать, как решить этот момент?
Спасибо заранее!
 

igorznag

Мастер
Рейтинг
103
#2
Пример:
1. В новой сцене запускаем скрипт.
2. В новом окне нажимаем кнопку "Example".
3. Выделяем боксы и нажимаем кнопку "Apply".
4. Перемещаем думмик или визуализируем сцену.
Код:
try(destroyDialog igorznag_ro_wave) catch() 
rollout igorznag_ro_wave "Wave" 
(
button btn_example "Example" pos:[10,10]
button btn_apply "Apply" pos:[80,10]
on btn_example pressed do
(
for i=1 to 10 do
(
obj=box length:10 width:10 height:10
obj.pos.x=(i-1)*10
)
sp= splineShape(); sp.name="wave";
addNewSpline sp;
addKnot sp 1 #smooth #curve [0,0,0]
addKnot sp 1 #smooth #curve [-50,0,40]
addKnot sp 1 #smooth #curve [-100,0,20]
addKnot sp 1 #smooth #curve [-140,0,35]
addKnot sp 1 #smooth #curve [-160,0,23]
addKnot sp 1 #smooth #curve [-200,0,20]
addKnot sp 1 #smooth #curve [-305,0,20]
updateShape sp; sp.renderable=false
sp.render_displayRenderMesh=true
sp.render_useViewportSettings=true
sp.render_displayRenderSettings=false
sp.render_viewport_rectangular =false
sp.render_viewport_thickness =1
sp.render_viewport_sides=3
addModifier sp (Edit_Mesh())

d=dummy();d.boxsize=[10,10,10];d.pos=[0,0,0]
d.name="dummy_wave"; sp.parent=d;
with animate on at time 100 d.pos=[300,0,0]
completeRedraw();
)--on btn_example pressed do

on btn_apply pressed do
(
try
(
for obj in selection do
(
obj.height.controller=float_script()
str="";
str=str+"h=0";str=str+"\n"
str=str+"try";str=str+"\n"
str=str+"(";str=str+"\n"
str=str+"dependsOn $wave";str=str+"\n"
str=str+"refsArray = (refs.dependents this)";str=str+"\n"
str=str+"for i in refsArray where isvalidnode i do";str=str+"\n"
str=str+"(";str=str+"\n"
str=str+"r= ray i.pos i.dir";str=str+"\n"
str=str+"p=intersectRay $wave r";str=str+"\n"
str=str+"if(p!=undefined)then";str=str+"\n"
str=str+"(";str=str+"\n"
str=str+"h=length(p.pos-i.pos)";str=str+"\n"
str=str+")--if(p!=undefined)then";str=str+"\n"
str=str+")--for i in refsArray where isvalidnode i do";str=str+"\n"
str=str+")";str=str+"\n"
str=str+"catch ()";str=str+"\n"
str=str+"h";
obj.height.controller.script=str;
)--for obj in selection do
)
catch ()
)--on btn_apply pressed do
)--rollout igorznag_ro_wave "Wave" 
createDialog igorznag_ro_wave 130 40
Чтобы запустить скрипт нужно:
1. Создаем текстовый файл (NotePad) и копируем код (текст) скрипта.
2. Сохраняем текстовый файл с названием "test.ms"
3. В главное меню MaxScript выбираем пункт Run Script. Выбираем файл "test.ms"
 
Сверху