Render.ru

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

moris

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

DEL

Активный участник
Рейтинг
15
#2
Вы не указали аргумент флага -attributeChange

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

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

moris

Активный участник
Рейтинг
10
#3
сори. Не оттуда скопировал. В исходнике у меня выглядит все вот так, как вы написали, DEL. Таким образом у меня получается все сделать и этот скриптджоб срабатывает должным образом. У меня не получается сделать так, чтобы при проигровании анимации срабатывал мой скприпт. Меня интересует как записывать много команд для скриптДжоб, чтобы выполнялось много условий: при переключении атрибута, при проигровании анимации и при перемещении таймслайдера вручную. Например:

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

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

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

DEL

Активный участник
Рейтинг
15
#4
Думаю, в вашей ситуации более целесообразным было бы написать выражение.
Можете написать по конкретнее что именно делает ваша процедура?
 

moris

Активный участник
Рейтинг
10
#5
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;
}
}
 

DEL

Активный участник
Рейтинг
15
#7
Если я правильно понял вам нужно, что бы когда мимо шарика пролетит кубик шарик прицепился к кубику и он улетел вместе с ним. И все это управляйлось анимированым атрибутом. Если это так то выражение будет выглядеть так :

Код:
int $cubSnap = pCube.snap_to;

 if($cubSnap == 0)
              
   {
 pSphere1_pointConstraint1.pCubeW0 = 0;

   }

 if($cubSnap == 0)

  {
 pSphere1_pointConstraint1.pCubeW0 = 1;
 
  }

сцена
 

DEL

Активный участник
Рейтинг
15
#8
Правильный код

Код:
int $cubSnap = pCube.snap_to;

if($cubSnap == 0)

{
pSphere1_pointConstraint1.pCubeW0 = 0;

}

if($cubSnap == 1)

{
pSphere1_pointConstraint1.pCubeW0 = 1;

}
 

Denzil

Мастер
Рейтинг
353
#9
Правильный код
int $cubSnap = pCube.snap_to; if($cubSnap == 0) { pSphere1_pointConstraint1.pCubeW0 = 0; } if($cubSnap == 1) { pSphere1_pointConstraint1.pCubeW0 = 1; }

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

moris

Активный участник
Рейтинг
10
#10
с вычислениями я парился и пришел к одному выводу - если оперировать числами с запятой, то выходит большая погрешность.
 

DEL

Активный участник
Рейтинг
15
#11
Не то?

Код:
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;

}
 

moris

Активный участник
Рейтинг
10
#12
странно, но переделав это в экспр., майа выдает ошибку:
// Error: The attribute 'CubeGroup_pointConstraint1.WorldW0' is locked or connected and cannot be modified. //
Почему атрибут заблокированым вдруг стал? Експрешн сам занимает этот канал и говорит о его недоступности...
 

DEL

Активный участник
Рейтинг
15
#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;
                
                }
 

moris

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

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

moris

Активный участник
Рейтинг
10
#17
вот написал экспрешном такой код. Будет ли он выполняться правильно? Нужно ли что-то добавить, чтобы небыло лишних срабатываний или недорабатываний?

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 и посмотрите, кажеться все отлично работает!
 

DEL

Активный участник
Рейтинг
15
#18
Ну если все работает , тогда все отлично ;) Моя сцена сделана в MAYA 2009 х64
 
Сверху