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

вопрос по scriptJob - я не понимаю как им пользоваться

Тема в разделе "Maya", создана пользователем moris 25600, 7 июн 2009.

Модераторы: Dark™, Skif
  1. moris 25600

    moris 25600 Активный участник

    С нами с:
    13.10.2006
    Сообщения:
    93
    Симпатии:
    0
    Баллы:
    7
    обьясните, пожалуйста, как пользоваться этой адской штукой. Я голову себе сломал уже, пытаясь разобраться, как сделать так: на сфере атрибут snap_to управляет привязкой к кубику. При переключении этого атрибута с World на Cube, срабатывает скриптДжоб: int $sw = `scriptJob -kws -cu 1 -ас "SwitchOffset"`. SwitchOffset - это процедура, которая делает офсет сфере. На сферу ставлю ключи - в определенный момент времени ей надо прикрепится к проносящемуся мимо кубику и улететь вместе с ним. Пытался разобраться с кондишином и эвентом, не срабатывает. Можно ли в одной строке задавать и кондишины и эвенты? Можно ли задавать много условий? Необходимо сделать срабатывание переключения при проигрывании анимации, при ручном перемещении таймслайдера по врменной линейке и, конечно же, при ручном изменении атрибута сферы (с ворлд на кубик и назад). И не ссылайте меня в справку, я ее начитался уже.
     
  2. DEL

    DEL Активный участник

    С нами с:
    20.04.2005
    Сообщения:
    380
    Симпатии:
    0
    Баллы:
    13
    Вы не указали аргумент флага -attributeChange

    Если выхотите что бы при изменении атрибута snap_to исполнялась процедура SwitchOffset то нужно написать так :

    Код:
    scriptJob -kws -cu 1 -runOnce  false -аttributeChange  pSphere1.snap_to  SwitchOffset;
     
  3. moris 25600

    moris 25600 Активный участник

    С нами с:
    13.10.2006
    Сообщения:
    93
    Симпатии:
    0
    Баллы:
    7
    сори. Не оттуда скопировал. В исходнике у меня выглядит все вот так, как вы написали, DEL. Таким образом у меня получается все сделать и этот скриптджоб срабатывает должным образом. У меня не получается сделать так, чтобы при проигровании анимации срабатывал мой скприпт. Меня интересует как записывать много команд для скриптДжоб, чтобы выполнялось много условий: при переключении атрибута, при проигровании анимации и при перемещении таймслайдера вручную. Например:

    // это я вручную переключил атрибут
    scriptJob -kws -cu 1 -runOnce false -аttributeChange pSphere1.snap_to SwitchOffset;

    //теперь хочу задать событие, при котором будет срабатывать мой офсет:
    scriptJob -kws -cu 1 -runOnce false -е "playingBack" SwitchOffset;

    ...но не получается
     
  4. DEL

    DEL Активный участник

    С нами с:
    20.04.2005
    Сообщения:
    380
    Симпатии:
    0
    Баллы:
    13
    Думаю, в вашей ситуации более целесообразным было бы написать выражение.
    Можете написать по конкретнее что именно делает ваша процедура?
     
  5. moris 25600

    moris 25600 Активный участник

    С нами с:
    13.10.2006
    Сообщения:
    93
    Симпатии:
    0
    Баллы:
    7
    int $sw = `scriptJob -kws -cu 1 -ac Cube.snap_to SwitchOffset`;
    //int $pw = `scriptJob -kws -cu 1 -ac Cube.snap_to SwitchOffset`;


    global proc SwitchOffset()
    {
    int $chBox = `getAttr "Cube.snap_to"`;
    if ($chBox==0)
    {
    if (objExists("Cube_pointConstraint"))
    {
    delete Cube_pointConstraint;
    }
    if( objExists("Cube_orientConstraint"))
    {
    delete Cube_orientConstraint;
    }

    setAttr CubeGroup_pointConstraint1.WorldW0 1;
    setAttr CubeGroup_pointConstraint1.CW1 0;
    setAttr CubeGroup_pointConstraint1.SW2 0;

    setAttr CubeGroup_orientConstraint1.WorldW0 1;
    setAttr CubeGroup_orientConstraint1.CW1 0;
    setAttr CubeGroup_orientConstraint1.SW2 0;

    pointConstraint -n N_obj_pointConstraint N_obj CubeGroupSub;
    orientConstraint -n N_obj_orientConstraint N_obj CubeGroupSub;

    delete N_obj_pointConstraint;
    delete N_obj_orientConstraint;

    pointConstraint -n Cube_pointConstraint CubeGroupSub N_obj;
    orientConstraint -n Cube_orientConstraint CubeGroupSub N_obj;
    return;
    }
    if ($chBox==1)
    {
    if (objExists("Cube_pointConstraint"))
    {
    delete Cube_pointConstraint;
    }
    if( objExists("Cube_orientConstraint"))
    {
    delete Cube_orientConstraint;
    }

    setAttr CubeGroup_pointConstraint1.WorldW0 0;
    setAttr CubeGroup_pointConstraint1.CW1 1;
    setAttr CubeGroup_pointConstraint1.SW2 0;

    setAttr CubeGroup_orientConstraint1.WorldW0 0;
    setAttr CubeGroup_orientConstraint1.CW1 1;
    setAttr CubeGroup_orientConstraint1.SW2 0;

    pointConstraint -n N_obj_pointConstraint N_obj CubeGroupSub;
    orientConstraint -n N_obj_orientConstraint N_obj CubeGroupSub;

    delete N_obj_pointConstraint;
    delete N_obj_orientConstraint;

    pointConstraint -n Cube_pointConstraint CubeGroupSub N_obj;
    orientConstraint -n Cube_orientConstraint CubeGroupSub N_obj;
    return;
    }

    if ($chBox==2)
    {
    if (objExists("Cube_pointConstraint"))
    {
    delete Cube_pointConstraint;
    }
    if( objExists("Cube_orientConstraint"))
    {
    delete Cube_orientConstraint;
    }

    setAttr CubeGroup_pointConstraint1.WorldW0 0;
    setAttr CubeGroup_pointConstraint1.CW1 0;
    setAttr CubeGroup_pointConstraint1.SW2 1;

    setAttr CubeGroup_orientConstraint1.WorldW0 0;
    setAttr CubeGroup_orientConstraint1.CW1 0;
    setAttr CubeGroup_orientConstraint1.SW2 1;

    pointConstraint -n N_obj_pointConstraint N_obj CubeGroupSub;
    orientConstraint -n N_obj_orientConstraint N_obj CubeGroupSub;

    delete N_obj_pointConstraint;
    delete N_obj_orientConstraint;

    pointConstraint -n Cube_pointConstraint CubeGroupSub N_obj;
    orientConstraint -n Cube_orientConstraint CubeGroupSub N_obj;
    return;
    }
    }
     
  6. moris 25600

    moris 25600 Активный участник

    С нами с:
    13.10.2006
    Сообщения:
    93
    Симпатии:
    0
    Баллы:
    7
    хм, может и выражением....
     
  7. DEL

    DEL Активный участник

    С нами с:
    20.04.2005
    Сообщения:
    380
    Симпатии:
    0
    Баллы:
    13
    Если я правильно понял вам нужно, что бы когда мимо шарика пролетит кубик шарик прицепился к кубику и он улетел вместе с ним. И все это управляйлось анимированым атрибутом. Если это так то выражение будет выглядеть так :

    Код:
    int $cubSnap = pCube.snap_to;
    
     if($cubSnap == 0)
                  
       {
     pSphere1_pointConstraint1.pCubeW0 = 0;
    
       }
    
     if($cubSnap == 0)
    
      {
     pSphere1_pointConstraint1.pCubeW0 = 1;
     
      }

    сцена
     
  8. DEL

    DEL Активный участник

    С нами с:
    20.04.2005
    Сообщения:
    380
    Симпатии:
    0
    Баллы:
    13
    Правильный код

    Код:
    int $cubSnap = pCube.snap_to;
    
    if($cubSnap == 0)
    
    {
    pSphere1_pointConstraint1.pCubeW0 = 0;
    
    }
    
    if($cubSnap == 1)
    
    {
    pSphere1_pointConstraint1.pCubeW0 = 1;
    
    }
     
  9. Denzil

    Denzil Мастер

    С нами с:
    29.08.2000
    Сообщения:
    314
    Симпатии:
    0
    Баллы:
    360

    Не учитывается оффсет. Место прицеления только одно.
    Нужно вычислить расстояние между ними и забить его в оффсет.
     
  10. moris 25600

    moris 25600 Активный участник

    С нами с:
    13.10.2006
    Сообщения:
    93
    Симпатии:
    0
    Баллы:
    7
    с вычислениями я парился и пришел к одному выводу - если оперировать числами с запятой, то выходит большая погрешность.
     
  11. DEL

    DEL Активный участник

    С нами с:
    20.04.2005
    Сообщения:
    380
    Симпатии:
    0
    Баллы:
    13
    Не то?

    Код:
    int $cubSnap = pCube.snap_to;
    
    if($cubSnap == 0)
    
    {
    
    pSphere1_pointConstraint1.offsetX = pCube.translateX*(-1);
    pSphere1_pointConstraint1.offsetY = pCube.translateY*(-1);
    pSphere1_pointConstraint1.offsetZ = pCube.translateZ*(-1);
    
    
    pSphere1_pointConstraint1.pCubeW0 = 0;
    
    }
    
    if($cubSnap == 1)
    
    {
    pSphere1_pointConstraint1.pCubeW0 = 1;
    
    }
     
  12. moris 25600

    moris 25600 Активный участник

    С нами с:
    13.10.2006
    Сообщения:
    93
    Симпатии:
    0
    Баллы:
    7
    странно, но переделав это в экспр., майа выдает ошибку:
    // Error: The attribute 'CubeGroup_pointConstraint1.WorldW0' is locked or connected and cannot be modified. //
    Почему атрибут заблокированым вдруг стал? Експрешн сам занимает этот канал и говорит о его недоступности...
     
  13. DEL

    DEL Активный участник

    С нами с:
    20.04.2005
    Сообщения:
    380
    Симпатии:
    0
    Баллы:
    13
    Извините, очень много работы и потому опоздал с ответом ;)
    Вот думаю это выражение будет работать даже если у сферы есть родитель в с другими значениями.
    Посмотрите и если вопросы будут пишите.
    Код:
    // snap expression with offset - requiers vile sharik_kubik
    
    int $cubSnap = pCube.snap_to;
        if($cubSnap == 0){
    
                    pSphere1_pointConstraint1.offsetX = pCube.translateX*(-1);
                    pSphere1_pointConstraint1.offsetY = pCube.translateY*(-1);
                    pSphere1_pointConstraint1.offsetZ = pCube.translateZ*(-1);
                    
                    
                    float $pSphpX = pSpher1Parent.translateX;
                    float $pSphpY = pSpher1Parent.translateY;
                    float $pSphpZ = pSpher1Parent.translateZ;
    
    // X 
         if($pSphpX<0)
    
            {
           pSphere1_pointConstraint1.offsetX = (pCube.translateX - $pSphpX)*(-1);
            }
    
        else if($pSphpX>0)
            {
            float $pSphPosX = pCube.translateX;
       if($pSphPosX <0)
            {
            $pSphPosX = $pSphPosX*-1;
            }
            
            pSphere1_pointConstraint1.offsetX = ($pSphPosX + $pSphpX);
            
            }
    
    
    
    // Y 
    
            if($pSphpY<0)
    
             {
             pSphere1_pointConstraint1.offsetY = (pCube.translateY + $pSphpY);
              }
    
          else if($pSphpY>0)
            
            {
             
            float $pSphPosY = pCube.translateY;
            if($pSphPosY <0)
            {
            $pSphPosY = $pSphPosY*-1;
            }
    
    
           pSphere1_pointConstraint1.offsetY = ($pSphPosY + $pSphpY);
            }
    
    
    
         
     // Z       
            if($pSphpZ<0)
                    
                    {
                     pSphere1_pointConstraint1.offsetZ = (pCube.translateZ + $pSphpZ);
                    }
    
             else if($pSphpZ>0)
    
                     {
    
                    float $pSphPosZ = pCube.translateZ;
             if($pSphPosZ <0)
                    {
                    $pSphPosZ = $pSphPosZ*-1;
                    }
    
    
    
              pSphere1_pointConstraint1.offsetZ = ( $pSphPosZ + $pSphpZ);
            
                     }
    
    
             pSphere1_pointConstraint1.pCubeW0 = 0;
    
           }
    
    
    ////
    
                if($cubSnap == 1)
                    
                    {
                    
                    pSphere1_pointConstraint1.pCubeW0 = 1;
                    
                    }
    
    
     
  14. DEL

    DEL Активный участник

    С нами с:
    20.04.2005
    Сообщения:
    380
    Симпатии:
    0
    Баллы:
    13
    Забыл прикрепить сцену ;)
    сцена
     
  15. moris 25600

    moris 25600 Активный участник

    С нами с:
    13.10.2006
    Сообщения:
    93
    Симпатии:
    0
    Баллы:
    7
    а какая версия майи? У меня этот файл не хочет открываться
     
  16. moris 25600

    moris 25600 Активный участник

    С нами с:
    13.10.2006
    Сообщения:
    93
    Симпатии:
    0
    Баллы:
    7
    Извините, DEL, пока нет возможности очень подробно рассмотреть вашу сцену. Но у вас експр. работает с одним обьектом, а у меня их целых три, поэтому я решил делать переключение с помощью констрейнтов. Если мой скпипт запихнуть в експр, то он отлично срабатывает, единственный минус и весьма увесистый, так это тормоза системы, уж слишком он тяжелый для выражения. У меня родилась идея обьеденить експр. и МЕЛ. Создаем процедуру как в посте #5, а в экспр пишем: int $trg=0; если происходит изменение атрибута snap_to, то выполняем процедуру SwitchOffset и записываем некой переменной $trg=1, дальше по следующим кадрам експр начинает перебор кода и если $trg==1, то процедуру не выполняем, т.к. она выполнена.

    З.Ы. Надеюсь я понятно изъяснился, потому что выглядит не очень ясно.
     
  17. moris 25600

    moris 25600 Активный участник

    С нами с:
    13.10.2006
    Сообщения:
    93
    Симпатии:
    0
    Баллы:
    7
    вот написал экспрешном такой код. Будет ли он выполняться правильно? Нужно ли что-то добавить, чтобы небыло лишних срабатываний или недорабатываний?

    int $chBox=Cube.snap_to;

    //Это я создаю переменные-тригеры, которые будут проверять, выполнилось ли переключение, и если выполнилось, то его больше не надо выполнять в следующих кадрах до следующего переключения

    int $trgW;
    int $trgC;
    int $trgS;
    if($chBox==0)
    {
    if($trgW==0)
    {
    SwitchOffset;
    $trgW=1;
    $trgC=0;
    $trgS=0;
    }
    }

    if($chBox==1)
    {
    if($trgC==0)
    {
    SwitchOffset;
    $trgW=0;
    $trgC=1;
    $trgS=0;
    }
    }

    if($chBox==2)
    {
    if($trgS==0)
    {
    SwitchOffset;
    $trgW=0;
    $trgC=0;
    $trgS=1;
    }
    }

    А вообще вот сцена http://rapidshare.com/files/242901940/MySwitch.rar.html и посмотрите, кажеться все отлично работает!
     
  18. DEL

    DEL Активный участник

    С нами с:
    20.04.2005
    Сообщения:
    380
    Симпатии:
    0
    Баллы:
    13
    Ну если все работает , тогда все отлично ;) Моя сцена сделана в MAYA 2009 х64
     
Модераторы: Dark™, Skif

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