1. Пользоваться форумом на планшетах и телефонах стало удобнее благодаря Tapatalk

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

Тема в разделе "MAXScript", создана пользователем -=KoRn_Sir=-, 20 май 2011.

Модераторы: Savin Denis
  1. -=KoRn_Sir=-

    -=KoRn_Sir=- Пользователь сайта

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

    JBond Знаток

    С нами с:
    17.06.2009
    Сообщения:
    451
    Симпатии:
    5
    Баллы:
    37
    Если лампочек много то прийдется для кждой делать свой материал чтобы через бленд анимировать.
    Лучше через модификатор Material ID
     
  3. JBond

    JBond Знаток

    С нами с:
    17.06.2009
    Сообщения:
    451
    Симпатии:
    5
    Баллы:
    37



    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
    )
    )
     
  4. JBond

    JBond Знаток

    С нами с:
    17.06.2009
    Сообщения:
    451
    Симпатии:
    5
    Баллы:
    37
    triggerBox - это имя того что будет тригером

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

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


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

    -=KoRn_Sir=- Пользователь сайта

    С нами с:
    03.09.2006
    Сообщения:
    19
    Симпатии:
    1
    Баллы:
    2
    Спасибо огромное за ответ. Сегодня обязательно опробую.
     
  6. -=KoRn_Sir=-

    -=KoRn_Sir=- Пользователь сайта

    С нами с:
    03.09.2006
    Сообщения:
    19
    Симпатии:
    1
    Баллы:
    2
    Проверил - все работает! Огромное спасибо!
    ПС.
    Подскажите, а есть возможность сделать что бы лампа тухла несколько кадров после соприкосновения с триггер обьектом?
     
  7. JBond

    JBond Знаток

    С нами с:
    17.06.2009
    Сообщения:
    451
    Симпатии:
    5
    Баллы:
    37
    Проще всего увеличть размерытриггера в длину, чтобы дольше соприкосался с обьектом.
     
  8. igorznag

    igorznag Знаток

    С нами с:
    23.04.2010
    Сообщения:
    1.255
    Симпатии:
    173
    Баллы:
    65
    Попробуй так:
    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 
    )))))
     
  9. -=KoRn_Sir=-

    -=KoRn_Sir=- Пользователь сайта

    С нами с:
    03.09.2006
    Сообщения:
    19
    Симпатии:
    1
    Баллы:
    2
    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
    )
    ) 
     
  10. JBond

    JBond Знаток

    С нами с:
    17.06.2009
    Сообщения:
    451
    Симпатии:
    5
    Баллы:
    37
    строка с else лишняя
     
  11. -=KoRn_Sir=-

    -=KoRn_Sir=- Пользователь сайта

    С нами с:
    03.09.2006
    Сообщения:
    19
    Симпатии:
    1
    Баллы:
    2
    а как мне без else выводить materialID =1 ?
     
  12. -=KoRn_Sir=-

    -=KoRn_Sir=- Пользователь сайта

    С нами с:
    03.09.2006
    Сообщения:
    19
    Симпатии:
    1
    Баллы:
    2
    Добавил перед 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
    
    )
    ) 
     
  13. JBond

    JBond Знаток

    С нами с:
    17.06.2009
    Сообщения:
    451
    Симпатии:
    5
    Баллы:
    37
    поставь третий тригер
    иначе получается, что если у тебя со вторым тригером не будет контакта,будет выполнятсся 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

    )
     
  14. JBond

    JBond Знаток

    С нами с:
    17.06.2009
    Сообщения:
    451
    Симпатии:
    5
    Баллы:
    37
    Можно и так или else поставить в первый if .Смотря когда нужно вырубать лампочки
     
  15. -=KoRn_Sir=-

    -=KoRn_Sir=- Пользователь сайта

    С нами с:
    03.09.2006
    Сообщения:
    19
    Симпатии:
    1
    Баллы:
    2
    J-Bond - благодарю!!!
     
  16. JBond

    JBond Знаток

    С нами с:
    17.06.2009
    Сообщения:
    451
    Симпатии:
    5
    Баллы:
    37
    Не зачто , землякам помощь в первую очередь :)))
     
  17. igorznag

    igorznag Знаток

    С нами с:
    23.04.2010
    Сообщения:
    1.255
    Симпатии:
    173
    Баллы:
    65
    Попробуй выполнить этот пример в новой сцене .
    Код:
    --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
    
     
Модераторы: Savin Denis

Поделиться этой страницей