Render.ru

Зажигание Источника Света (или смена обычного материала на светащийся)

-=KoRn_Sir=-

Активный участник
Рейтинг
7
#1
Доброго дня знатоки. У меня следующая задача - есть обьект в форме ЗВЕЗДА. По краям у него расположены модели лампочек. Хочу сделать что бы в определенный момент они начали включаться в стиле "Лас Вегас", тоесть линейно)). В ручную такое заанимировать нереально, так как лампочек очень много. Как я понимаю тут нужен какой то скрипт, который срабатывал бы (к примеру менял в BLEND материале с обычного на светящийся) при контакте каким то ГИЗМО, который в свою очередь двигался по краю формы этой самой звезды. Ну или вроде того. Может подскажете где почитать?
 

JBond

Знаток
Рейтинг
33
#2
Если лампочек много то прийдется для кждой делать свой материал чтобы через бленд анимировать.
Лучше через модификатор Material ID
 

JBond

Знаток
Рейтинг
33
#3


animate on

for t in 0 to 100 by 2 do

at time t
(

for obj in selection do
(
qwer = Intersects $triggerBox obj

if (qwer) then obj.modifiers[#Material].materialID =2
else obj.modifiers[#Material].materialID =1
)
)
 

JBond

Знаток
Рейтинг
33
#4
triggerBox - это имя того что будет тригером

на всех сферах Material modifier с id =1

Материал мультисаб с двумя слотами - в первом обычный матриал во втором с illum 100


for t in 0 to 100 руками нужно установить начало и конец анимации. Триггер вручную анимируешь чтобы пересекал обьекты ,потом выделяешь все обьекты которые пересекает тригер и запускаешь скрипт.
 

-=KoRn_Sir=-

Активный участник
Рейтинг
7
#5
triggerBox - это имя того что будет тригером

на всех сферах Material modifier с id =1

Материал мультисаб с двумя слотами - в первом обычный матриал во втором с illum 100


for t in 0 to 100 руками нужно установить начало и конец анимации. Триггер вручную анимируешь чтобы пересекал обьекты ,потом выделяешь все обьекты которые пересекает тригер и запускаешь скрипт.
Спасибо огромное за ответ. Сегодня обязательно опробую.
 

-=KoRn_Sir=-

Активный участник
Рейтинг
7
#6
Проверил - все работает! Огромное спасибо!
ПС.
Подскажите, а есть возможность сделать что бы лампа тухла несколько кадров после соприкосновения с триггер обьектом?
 

JBond

Знаток
Рейтинг
33
#7
Проще всего увеличть размерытриггера в длину, чтобы дольше соприкосался с обьектом.
 

igorznag

Мастер
Рейтинг
103
#8
Подскажите, а есть возможность сделать что бы лампа тухла несколько кадров после соприкосновения с триггер обьектом?
Попробуй так:
1. Создай 3 сферы и один Box с названием "triggerBox".
2. Создай еще одну сферу с названием "main_light".
3. Создай материал Blend и примени его к объекту "main_light".
4. Сделай анимацию для дорожки Mix Amount для материала объекта "main_light". Анимация должна начинаться с кадра 0 (ноль). Сделай например, сначала лампочка выключена (Mix Amount=0), потом в следующем кадре лампочка включается (Mix Amount=100), потом в следующих кадрах лампочка медленно тухнет.
5. Сделай анимацию перемещения для объекта "triggerBox".
6. Выдели 3 сферы и запусти скрипт.
Код:
selected_objects_properties=#(); --#(animation_state,animation_current_frame,animation_total_frames)
selected_objects=selection as array 
for i=1 to selected_objects.count do  
( if(classof $main_light.material==Blend)then 
( 
new_blend_material=Blend(); new_blend_material.mixAmount=0;
new_blend_material.map1=$main_light.material.map1 
new_blend_material.map2=$main_light.material.map2  
selected_objects[i].material=new_blend_material; 
main_light_frames_count=0; 
if(classof $main_light.material.mixAmount.controller==bezier_float)then 
( 
main_light_keys_count=$main_light.material.mixAmount.controller.keys.count 
if(main_light_keys_count>0)then 
main_light_frames_count=int($main_light.material.mixAmount.controller.keys[main_light_keys_count].time.frame) 
selected_objects_properties[i]=#(0,0,main_light_frames_count); 
)))

if(selected_objects_properties.count!=0)then 
(animate on   
for t=0 to 100 do ( at time t  
( 
for i=1 to selected_objects.count do  
(
qwer = Intersects $triggerBox selected_objects[i] 
if (qwer==true and selected_objects_properties[i][1]==0)then selected_objects_properties[i][1]=1;--start playing 
selected_objects[i].material.mixAmount=selected_objects[i].material.mixAmount+0--create keys in every frame

if(selected_objects_properties[i][1]==1)then --playing  
(
main_light_mix_amount=0; 
at time selected_objects_properties[i][2] (main_light_mix_amount=$main_light.material.mixAmount;) 
selected_objects[i].material.mixAmount=main_light_mix_amount 
selected_objects_properties[i][2]=selected_objects_properties[i][2]+1--next frame 
if(selected_objects_properties[i][2]>selected_objects_properties[i][3])then selected_objects_properties[i][1]=2;--stop playing 
)))))
 

-=KoRn_Sir=-

Активный участник
Рейтинг
7
#9
igorznag - спасибо. Жаль, но не работает почему то(( Main_Light сама по себе один раз проиграла анимацию (по своим же ключам), а остальные сферы, после запуска скрипта, обретают материал Main_Light в стартовом состоянии - тоесть свет ВЫКЛ. И дальше никакой анимации. Триггер естевственно заанимировал))
((

Подскажите мне болвану как правильно написать если я хочу 2 "if". Я просто подумал сделать 2-3 этих триггер боксов и на каждый разный уровень illumination. Но скриптовой грамматики не знаю, получается только одно условие((

Пытался сделать так

Код:
animate on

for t in 0 to 100 by 1 do

at time t
(

for obj in selection do
(
qwer1 = Intersects $triggerBox1 obj
qwer2 = Intersects $triggerBox2 obj

if (qwer1) then obj.modifiers[#Material].materialID =2
if (qwer2) then obj.modifiers[#Material].materialID =3

    else obj.modifiers[#Material].materialID =1
)
)
 

-=KoRn_Sir=-

Активный участник
Рейтинг
7
#12
Добавил перед qwer - obj.modifiers[#Material].materialID =1, вроде получилось
Код:
animate on

for t in 0 to 100 by 1 do

at time t
(

for obj in selection do
(
obj.modifiers[#Material].materialID =1
qwer1 = Intersects $triggerBox1 obj
qwer2 = Intersects $triggerBox2 obj

if (qwer1) then obj.modifiers[#Material].materialID =2
if (qwer2) then obj.modifiers[#Material].materialID =3

)
)
 

JBond

Знаток
Рейтинг
33
#13
поставь третий тригер
иначе получается, что если у тебя со вторым тригером не будет контакта,будет выполнятсся else .Т.е. затирать действие первого тригера.


animate on

for t in 0 to 100 by 1 do

at time t
(

for obj in selection do
(
qwer1 = Intersects $triggerBox1 obj
qwer2 = Intersects $triggerBox2 obj
qwer3 = Intersects $triggerBox3 obj

if (qwer1) then obj.modifiers[#Material].materialID =2
if (qwer2) then obj.modifiers[#Material].materialID =3
if (qwer3) then obj.modifiers[#Material].materialID =1

)
 

JBond

Знаток
Рейтинг
33
#14
Можно и так или else поставить в первый if .Смотря когда нужно вырубать лампочки
 

igorznag

Мастер
Рейтинг
103
#17
Попробуй выполнить этот пример в новой сцене .
Код:
--Manual
sphere1=Sphere pos:[50,0,0] radius:10
sphere2=Sphere pos:[100,0,0] radius:10
sphere3=Sphere pos:[150,0,0] radius:10
main_light=Sphere pos:[50,100,0] radius:10
main_light.name="main_light"
trigger_box=Box  pos:[0,0,0] width:10 height:10 length:10
trigger_box.name="triggerBox"
animate on
(
at time 100 (trigger_box.pos=[200,0,0])
)

map1=standardMaterial(); map1.diffuse=color 0 144 0;map1.selfIllumAmount =0;map1.specularLevel=0;
map2=standardMaterial(); map2.diffuse=color 0 144 0;map2.selfIllumAmount =100;map2.specularLevel=100;
new_blend_material=Blend(); 
new_blend_material.map1=map1
new_blend_material.map2=map2
new_blend_material.mixAmount=0;
animate on
(
at time 1 (new_blend_material.mixAmount=100;)
at time 10 (new_blend_material.mixAmount=0;)
)
main_light.material=new_blend_material;

select #(sphere1,sphere2,sphere3)
--End Manual

--Auto 
selected_objects_properties=#(); --#(animation_state,animation_current_frame,animation_total_frames)
selected_objects=selection as array 
for i=1 to selected_objects.count do  
( if(classof $main_light.material==Blend)then 
( 
new_blend_material=Blend(); new_blend_material.mixAmount=0;
new_blend_material.map1=$main_light.material.map1 
new_blend_material.map2=$main_light.material.map2  
selected_objects[i].material=new_blend_material; 
main_light_frames_count=0; 
if(classof $main_light.material.mixAmount.controller==bezier_float)then 
( 
main_light_keys_count=$main_light.material.mixAmount.controller.keys.count 
if(main_light_keys_count>0)then 
main_light_frames_count=int($main_light.material.mixAmount.controller.keys[main_light_keys_count].time.frame) 
selected_objects_properties[i]=#(0,0,main_light_frames_count); 
)))

if(selected_objects_properties.count!=0)then 
(animate on   
for t=0 to 100 do ( at time t  
( 
for i=1 to selected_objects.count do  
(
qwer = Intersects $triggerBox selected_objects[i] 
if (qwer==true and selected_objects_properties[i][1]==0)then selected_objects_properties[i][1]=1;--start playing 
selected_objects[i].material.mixAmount=selected_objects[i].material.mixAmount+0--create keys in every frame

if(selected_objects_properties[i][1]==1)then --playing  
(
main_light_mix_amount=0; 
at time selected_objects_properties[i][2] (main_light_mix_amount=$main_light.material.mixAmount;) 
selected_objects[i].material.mixAmount=main_light_mix_amount 
selected_objects_properties[i][2]=selected_objects_properties[i][2]+1--next frame 
if(selected_objects_properties[i][2]>selected_objects_properties[i][3])then selected_objects_properties[i][1]=2;--stop playing 
)))))
--End Auto
 
Сверху