会社の人に教えていただいた、手とか脚とか、ボディコントローラと手足のコントローラで移動の仕方が違ったりして、骨がピーンてなっちゃう現象の調整方法。
わりと使うことが多そうなのでざっくりmelで自動化してみた。
名前とかロケータ作る動作をforで書いてないとかソース的にきちゃないとこはあるけどもとりあずこれで動くからいいや!
↓↓↓
string $jtSel[] = `ls -sl`; //IK骨の根本とIK作用地点の骨、最後にIKコントローラを選択
CreateLocator; //ロケータ作る1個目
string $LocSelA[] = `ls -sl`; //ロケータAの名前格納
string $LocSel1 = `rename $LocSelA[0] ( "Loc_" + $jtSel[0])`; //ロケータの名前を変更
CreateLocator; //ロケータ作る2個目
string $LocSelB[] = `ls -sl`; //ロケータBの名前格納
string $LocSel2 = `rename $LocSelB[0] ( "Loc_" + $jtSel[1])`; //ロケータの名前を変更
select -r $LocSel2 $LocSel1; //ロケータBをロケータAの子供に
parent;
select -r $jtSel[0] $LocSel1; //IK根本の骨に、ロケータAをポイントコンスト。
pointConstraint -offset 0 0 0 -weight 1; //オフセットなしで揃うように
select -r $jtSel[1] $LocSel1; //IK作用地点の骨に向くようにロケータAをエイムコンスト(X軸が向く)
aimConstraint -offset 0 0 0 -weight 1 -aimVector 1 0 0 -upVector 0 1 0 -worldUpType "vector" -worldUpVector 0 1 0;
select -r $jtSel[1] $LocSel2; //IK作用地点の骨に、ロケータBをポイントコンスト
doCreatePointConstraintArgList 1 { "0","0","0","0","0","0","0","1","","1" };
pointConstraint -offset 0 0 0 -weight 1; //オフセットなしで揃うように
//ロケータAがエイムコンストで、IK作用地点の骨に対してX軸で常に向いているため、ロケータAの子供になっていて、IK作用地点の骨にポイントコンストで常にくっついているロケータBは、親ロケータAのX軸上のみを移動していることになり、これでIK根本の骨とIK作用地点の骨との間の距離が、ロケータBのXの値として取れるようになる。
/////////ここまででロケータ仕込み///////////////////
//作ったロケータに値は取り出せたけども、まだロケータだけで完結している値でしたかない。
//ロケータにかかっている値を焼きこむことで、コンストレインを外し、ロケータ自身が自分の足で、他人の手を借りず、自立して生きていけるよう背中を押してやる
select -r $LocSel1; //ロケータAを選択
doBakeSimulationArgList 5 { "1","0","10","1","1","0","1","1","0","1","animationList","0","0","0","0","0" };
//ロケータAをベイク(子供のロケータBも合わせてベイクされる)
delete ( $LocSel1 + "_pointConstraint1");
delete ( $LocSel1 + "_aimConstraint1");
delete ( $LocSel2 + "_pointConstraint1");
//もはや用済みのコンストレインノードをついでに削除しておく
/////////ベイク・コンストノード削除まで/////////////
//これで、今のところIKコントローラで制御された骨と、まったく同じ動きをするロケータA,Bが作られたことになる。ここから、実際に動かしているIKコントローラに対して、今まで動かされているだけだったロケータBの反撃が始まる。
select -r $LocSel2 $jtSel[2]; //ロケータB、IKコントローラの順で選択
pointConstraint -mo -weight 1; //IKコントローラをIK骨の作用地点にいるロケータBにコンストさせる
select -r $LocSel2; //ロケータBを選択してる状態にしとく
//スクリプト完了したらそのまま調整に入れるようにってだけ
/////////コントローラをポイントコンストまで///////////
//ロケータBのXの値を見ると、骨が伸びきったことでそれ以上距離が取れないので横ばいのキーが打たれた状態になっている。その横ばいの部分が骨がピーンてなるリミットなので、その横ばいのところのキーを下げて上げれば骨が伸び切らないようにすることができる
PR