Render.ru

Кошмары с локальными осями.

Рейтинг
21
#1
Я новичок. Читаю книгу Сергея Цыпцына "Понимая Maya", построил риг по книге Алексей Сафонова. "Создание 3D-персонажей в Maya.", смотрел уроки по "Digital Tutors", но так и не понял для себя главный принцип ориентировки локалей костей, "хоть убей"!
Кто-нибудь, помогите чайнику понять истину!
(пожалуйста, не посылайте меня читать книги-я ими просто обложен))
 

Покатигорошек

Активный участник
Рейтинг
15
#2
Может эта книга и не попала в залежи, но в "Maya Complete. Уроки мастерства" черным по белому - "вращение по Z, X - вдоль кости" ;)
 

Skif

Администратор 3D галереи
Команда форума
Рейтинг
584
#4
ба блин все проще гораздо. ориентация вообще вообще может быть любая, вдоль кости любая ось, как в производстве принято. дальше.
например коссика Х - вдоль кости. остальные оси должны быть просто сонаправлены. то есть как пример кость левой голени. ось Х вдоль кости. Y - вперед, Z - соответсвенно вбок. и все остальные кости ноги должны выглядеть так же.
и так для спины, руки. но есть еще нюанс. когда делаешь зеркальную копию миррор джоинт, то Х будет направлена не вроль кости а по тому же вектору на не вниз а вверх - это нормально. например когда делаешь руку FK то при вращении плечевого сустава руки должны работать синхронно, тоесть зеркально.
 

Skif

Администратор 3D галереи
Команда форума
Рейтинг
584
#6
нет. у голеностопного сустава ось Y не идет вдоль ноги и на колене. далее у левой ноги и правой одинаково направлены оси Y. да тут вообще черт поймет что.. Y вообще смотрит не на дочерний объект.
 

fruit_cake

Мастер
Рейтинг
127
#7
когда делаешь зеркальную копию миррор джоинт, то Х будет направлена не вроль кости а по тому же вектору на не вниз а вверх - это нормально.
а если нужно пальцы ног сделать, ориентация обеих ног должна быть одинаковая?
 

Skif

Администратор 3D галереи
Команда форума
Рейтинг
584
#9
поступи проще. начни создавать скелет, например сделал ногу, выложи ориенты, мы подскажем. думаю разберешься.
 
Рейтинг
21
#10
да тут вообще черт поймет что.. Y вообще смотрит не на дочерний объект.
Странно, этот скрин я сделал с готовой сцены урока, учишься по таким урокам и путаешься(
.
Вот ссылка на это урок:
http://forum.mayaportal.ru/index.php/topic,1188.0.html

выложи ориенты, мы подскажем. думаю разберешься.
Спасибо! Вот сделал ноги по этому самому уроку!
 

Вложения

iNOD

Активный участник
Рейтинг
18
#12
Вот тебе мой скрипт на реориентацыю джоинтов. Выделяешь например начало ноги, потом выбираешь направление и жмешь несколько раз на кнопку, и все готово)

Код:
if (`window -exists jntReorient`) deleteUI -window jntReorient;
window -t "Retarget Joints" -w 300 -h 20 -s off jntReorient;
frameLayout -label "up vector" -borderStyle "etchedIn";
columnLayout;
separator -style "none";
formLayout -numberOfDivisions 100 upaxis;

    radioCollection;
    		radioButton -label "x" px;
    		radioButton -label "y" -select py;
    		radioButton -label "z" pz;
    
    formLayout -edit
          -attachForm px "top" 0
          -attachForm px "left" 20
          
          -attachForm py "top" 0
          -attachForm py "left" 60
          
          -attachForm pz "top" 0
          -attachForm pz "left" 100
                   
          upaxis;
setParent..;

frameLayout -label "set the direction" -borderStyle "etchedIn";
columnLayout;
separator -style "none";
formLayout -numberOfDivisions 1 stthedrct;
            button -l "Retarget" -c rtrgtJnts btrrnt;
    radioCollection;
    		radioButton -label "x" lpx;
    		radioButton -label "-x" -select lpxm;
    		radioButton -label "y" lpy;
    		radioButton -label "-y" lpym;
    		radioButton -label "z" lpz;
    		radioButton -label "-z" lpzm;
    		radioButton -label "your choice" lpych;
    
    formLayout -edit
          
          -attachForm lpx "top" 10
          -attachForm lpx "left" 20
          
          -attachForm lpxm "top" 30
          -attachForm lpxm "left" 20
          
          -attachForm lpy "top" 10
          -attachForm lpy "left" 60
          
          -attachForm lpym "top" 30
          -attachForm lpym "left" 60
          
          -attachForm lpz "top" 10
          -attachForm lpz "left" 100
          
          -attachForm lpzm "top" 30
          -attachForm lpzm "left" 100
          
          -attachForm lpych "top" 10
          -attachForm lpych "left" 140
          
          -attachForm btrrnt "top" 30
          -attachForm btrrnt "left" 140
          
          stthedrct;
setParent..;
showWindow;
global int $jmpRtrgt = 0;

global proc rtrgtJnts()
{
global int $jmpRtrgt;
string $bnRtrgt[0] = `ls -sl`;
pickWalk -d down; select -add $bnRtrgt[0];
string $bnRtrgt[] = `ls -sl`;
if (`radioButton -q -select lpych` == 1 && $jmpRtrgt == 0)
{
curve -d 1 -p -1 0 1 -p 0 0 2 -p 1 0 1 -k 0 -k 1 -k 2 -n "chOrient";
select -r $bnRtrgt[1] chOrient;
pointConstraint -offset 0 0 0 -weight 1;
orientConstraint -offset 0 0 0 -weight 1;
select -r chOrient_pointConstraint1 chOrient_orientConstraint1; doDelete;
$jmpRtrgt++;
}
else
{
//------------------------------------------------------------------------
if (`radioButton -q -select lpych` == 1 && $jmpRtrgt == 1)
{
if($bnRtrgt[1] == "")
{
joint -e -oj none -secondaryAxisOrient yup -ch -zso;
select -r chOrient; doDelete;
$jmpRtrgt = 0;
}
else
{
select -r $bnRtrgt[0]; parent -w;
//-------------------------------------------
setAttr ($bnRtrgt[1] + ".jointOrientX") 0;
setAttr ($bnRtrgt[1] + ".jointOrientY") 0;
setAttr ($bnRtrgt[1] + ".jointOrientZ") 0;
setAttr ($bnRtrgt[1] + ".rotateX") 0;
setAttr ($bnRtrgt[1] + ".rotateY") 0;
setAttr ($bnRtrgt[1] + ".rotateZ") 0;
//-------------------------------------------
spaceLocator -n loc;
select -r $bnRtrgt[1] loc;
pointConstraint -offset 0 0 0 -weight 1;
select -r loc_pointConstraint1; doDelete;

select -r loc chOrient; parent;
move -r -os -wd 0 0 10 chOrient;

select -r $bnRtrgt[0] $bnRtrgt[1];

if (`radioButton -q -select px` == 1)
{
aimConstraint -offset 0 0 0 -weight 1 -aimVector 1 0 0 -upVector 1 0 0 -worldUpType "object" -worldUpObject loc;
}
if (`radioButton -q -select py` == 1)
{
aimConstraint -offset 0 0 0 -weight 1 -aimVector 1 0 0 -upVector 0 1 0 -worldUpType "object" -worldUpObject loc;
}
if (`radioButton -q -select pz` == 1)
{
aimConstraint -offset 0 0 0 -weight 1 -aimVector 1 0 0 -upVector 0 0 1 -worldUpType "object" -worldUpObject loc;
}
select -r $bnRtrgt[1]; pickWalk -d down; doDelete;
select -r loc; doDelete;
//-------------------------------------------
float $x= getAttr($bnRtrgt[1] + ".rotateX");
float $y= getAttr($bnRtrgt[1] + ".rotateY");
float $z= getAttr($bnRtrgt[1] + ".rotateZ");
float $ox= getAttr($bnRtrgt[1] + ".jointOrientX");
float $oy= getAttr($bnRtrgt[1] + ".jointOrientY");
float $oz= getAttr($bnRtrgt[1] + ".jointOrientZ");
$x = $x + $ox;
$y = $y + $oy;
$z = $z + $oz;
setAttr ($bnRtrgt[1] + ".jointOrientX") $x;
setAttr ($bnRtrgt[1] + ".jointOrientY") $y;
setAttr ($bnRtrgt[1] + ".jointOrientZ") $z;
setAttr ($bnRtrgt[1] + ".rotateX") 0;
setAttr ($bnRtrgt[1] + ".rotateY") 0;
setAttr ($bnRtrgt[1] + ".rotateZ") 0;
//-------------------------------------------
select -r $bnRtrgt[0] $bnRtrgt[1]; parent;
}
}
//------------------------------------------------------------------------
if($bnRtrgt[1] == "")
{
joint -e -oj none -secondaryAxisOrient yup -ch -zso;
}
else
{
if (`radioButton -q -select lpych` != 1)
{
select -r $bnRtrgt[0]; parent -w;
//-------------------------------------------
setAttr ($bnRtrgt[1] + ".jointOrientX") 0;
setAttr ($bnRtrgt[1] + ".jointOrientY") 0;
setAttr ($bnRtrgt[1] + ".jointOrientZ") 0;
setAttr ($bnRtrgt[1] + ".rotateX") 0;
setAttr ($bnRtrgt[1] + ".rotateY") 0;
setAttr ($bnRtrgt[1] + ".rotateZ") 0;
//-------------------------------------------
spaceLocator -n loc;
select -r $bnRtrgt[1] loc;
pointConstraint -offset 0 0 0 -weight 1;
select -r loc_pointConstraint1; doDelete;

if (`radioButton -q -select lpx` == 1)
move -r 3 0 0 loc;

if (`radioButton -q -select lpxm` == 1)
move -r -3 0 0 loc;

if (`radioButton -q -select lpy` == 1)
move -r 0 3 0 loc;

if (`radioButton -q -select lpym` == 1)
move -r 0 -3 0 loc;

if (`radioButton -q -select lpz` == 1)
move -r 0 0 3 loc;

if (`radioButton -q -select lpzm` == 1)
move -r 0 0 -3 loc;

select -r $bnRtrgt[0] $bnRtrgt[1];

if (`radioButton -q -select px` == 1)
{
aimConstraint -offset 0 0 0 -weight 1 -aimVector 1 0 0 -upVector 1 0 0 -worldUpType "object" -worldUpObject loc;
}
if (`radioButton -q -select py` == 1)
{
aimConstraint -offset 0 0 0 -weight 1 -aimVector 1 0 0 -upVector 0 1 0 -worldUpType "object" -worldUpObject loc;
}
if (`radioButton -q -select pz` == 1)
{
aimConstraint -offset 0 0 0 -weight 1 -aimVector 1 0 0 -upVector 0 0 1 -worldUpType "object" -worldUpObject loc;
}
select -r $bnRtrgt[1]; pickWalk -d down; doDelete;
select -r loc; doDelete;
//-------------------------------------------
float $x= getAttr($bnRtrgt[1] + ".rotateX");
float $y= getAttr($bnRtrgt[1] + ".rotateY");
float $z= getAttr($bnRtrgt[1] + ".rotateZ");
float $ox= getAttr($bnRtrgt[1] + ".jointOrientX");
float $oy= getAttr($bnRtrgt[1] + ".jointOrientY");
float $oz= getAttr($bnRtrgt[1] + ".jointOrientZ");
$x = $x + $ox;
$y = $y + $oy;
$z = $z + $oz;
setAttr ($bnRtrgt[1] + ".jointOrientX") $x;
setAttr ($bnRtrgt[1] + ".jointOrientY") $y;
setAttr ($bnRtrgt[1] + ".jointOrientZ") $z;
setAttr ($bnRtrgt[1] + ".rotateX") 0;
setAttr ($bnRtrgt[1] + ".rotateY") 0;
setAttr ($bnRtrgt[1] + ".rotateZ") 0;
//-------------------------------------------
select -r $bnRtrgt[0] $bnRtrgt[1]; parent;
}
}
} 
}
 
Рейтинг
21
#13
Спасибо за скрипт, как-нибудь в будущем обязательно поюзаю.
Но здесь ситуация такова, что хочется разобраться сначала самостоятельно, т.е. без внедрения скриптов и авторигов, чтобы понимать как и что работает..
Но за щедрость спасибо, пригодиться в хозяйстве)
 

Покатигорошек

Активный участник
Рейтинг
15
#14
Это как понимать, продольное вращение что ли?
Собственно, да. Ось направлена точно от родительского джоинта к дочернему ("положительное" направление). Или, как правильно подметил Skif в случае зеркального отображения джоинта, в частных случаях - наоборот ("отрицательное" направление).
 
Рейтинг
21
#15
Цитата Куприн #3:Это как понимать, продольное вращение что ли?
Собственно, да. Ось направлена точно от родительского джоинта к дочернему ("положительное" направление). Или, как правильно подметил Skif в случае зеркального отображения джоинта, в частных случаях - наоборот ("отрицательное" направление).
я так понимаю, это уже правильнее?
 

Вложения

Рейтинг
21
#16
Skif, помоги!
Вот делаю ногу, Х у меня продольно в костях по направлению к парент....Y Z-правильно?
 

Вложения

Skif

Администратор 3D галереи
Команда форума
Рейтинг
584
#17
Skif, помоги!
Вот делаю ногу, Х у меня продольно в костях по направлению к парент....Y Z-правильно?
да сейчас правильно. только не к парент а наоборот к дочернему... это я просто слова поправил. короч все правильно сейчас.
 
Рейтинг
21
#18
Цитата Куприн #16:Skif, помоги!
Вот делаю ногу, Х у меня продольно в костях по направлению к парент....Y Z-правильно?

да сейчас правильно. только не к парент а наоборот к дочернему... это я просто слова поправил. короч все правильно сейчас.

------------------------------
мой блог.
http://skif3d.blogspot.com/
Спасибо! Ну наконец-то! Кажется, начинаю немного понимать...
Skif, я продолжу работу, попрошу тебя, если не трудно, я потом скрин вывешу, посмотришь?
 
Рейтинг
21
#20
Начал создавать псевдостопу для левой ноги и понял, что мой мозг пока не в состоянии понять правильную ориентировку. Должны ли совпадать локали псевдостопы с локалями самой ноги?
Вот, что у меня вышло:
 

Вложения

Сверху