Render.ru
Поддержать

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

-=KoRn_Sir=-

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

JBond

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

JBond

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



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
triggerBox - это имя того что будет тригером

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

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


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

-=KoRn_Sir=-

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

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

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


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

-=KoRn_Sir=-

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

JBond

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

igorznag

Мастер
Рейтинг
103
Подскажите, а есть возможность сделать что бы лампа тухла несколько кадров после соприкосновения с триггер обьектом?
Попробуй так:
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
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
Добавил перед 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
поставь третий тригер
иначе получается, что если у тебя со вторым тригером не будет контакта,будет выполнятсся 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
Можно и так или else поставить в первый if .Смотря когда нужно вырубать лампочки

JBond

Знаток
Рейтинг
33
-=KoRn_Sir=-J-Bond - благодарю!!!
Не зачто , землякам помощь в первую очередь 🙂))

igorznag

Мастер
Рейтинг
103
Попробуй выполнить этот пример в новой сцене .
--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