2021年3月29日月曜日

spineIkを設定する

 splineIkを操作するためには、普通のIKのようにIKハンドルを移動させたりするのではなく、splineIk のNURBSカーブの Control Vertex を移動させて操作します。

黄色いのがCV(Control Vertex)

 ただ、Control Vertex を選択したりするのは難があるため、クラスターで拘束してコントローラー代わりにします。

 こちらの方が操作しやすいですね。
 最近 splineIkをいくつも作っていて、このクラスターを作るのがとても面倒くさく感じました。

 なので、splineIkの作成からクラスターを接続するまでをスクリプト化。

rigSetSplineIk.mel

 使い方は、MAYA_SCRIPT_PATH へ配置するか sourceしてからコマンドラインかスクリプトエディタで呼び出します。
 引数が多いのでスクリプトエディタで使用することを推奨。スクリプトエディタへは、こんな風に記述します。

/* splineIk test */
{
    string $parent = "";
    string $name = "test";
    string $sttJnt = "joint1";
    string $endJnt = "joint4";
       int $span = 1;
    
    
    string $clusters[];
    string $spIk[] = rigSetSplineIk($clusters, $parent, $name, $sttJnt, $endJnt, $span);
    
}

 経験上、スプラインIKでは twistとかたまにAdvanced Twist Controlを使ったりするので、ikHandleの名前と、ストレッチ設定をしたりするのでスプラインIKで作成したNURBSカーブの名前が必要になるので、そのふたつが戻り値となっています。

 そして、ぱっとみた感じ $clusters という配列の役割が不明だと思いますが、クラスタハンドル名のリストになって戻ってきます。参照渡しというのを使っています。※過去記事:「配列は参照渡し」について

 このクラスタハンドル、座標の取り方がちょっと特殊です。
 ワールド座標系っぽくふるまっているので、普通に
xform -q -ws -t

で、座標を取得しようと試みるかもしれませんが、0 0 0 が返ってきます。ちょっと訳が分からない感じですが、座標を取得するためには

xform -q -ws -piv

と、ピボットを調べるとクラスタハンドルの座標が分かります。


 このスクリプトでは、$span を1~4の間で変更することで CVの数を変更できます。span=1のときcv=4、span=2のときcv=5と IK Spline Handle Tool と同じようになります。

 ジョイントの数が5本を超えてくるとspan=4のcv=7個とかを使う場面が出てきます。作られるクラスタの数も7個とかになるのでスプラインIK用のノードはまとめておきたくなると思います。なので、$parentへgroupコマンドを指定して、こんな風に実行するとアウトライナがスッキリします。

/* splineIk test */
{
    string $parent =`group -em`;
    string $name = "test";
    string $sttJnt = "joint1";
    string $endJnt = "joint6";
       int $span = 1;
    
    
    string $clusters[];
    string $spIk[] = rigSetSplineIk($clusters, $parent, $name, $sttJnt, $endJnt, $span);
    
}

 このスクリプトでは対応してあるので忘れがちになりますが、手動でスプラインIKを作った場合には NURBSカーブのダブルトランスフォームをさせないように Inherits Transformをオフにするのを忘れないようにしないといけません。




0 件のコメント:

コメントを投稿