以前の記事ではscaleX版を解説しましたが、今回はStretchIKのtranslateX版です。ScaleX版とは手法が違うのでscaleX版をまだ読んでいない人はそちらも御覧ください。
また、ジンバルロックとRotate Orderやjoint orientについての記事もありますのでそちらに馴染みがない方は重要なことなのでまずはそちらから御覧ください。これらの演習は必ずjointのX軸が子の方向を向いている必要があります。この意味がわからない方はかならずjoint orientについての記事を読んでください。
なぜscaleXではなくtranslateXなのか
ほぼ「手法の違い」です。基本的にはやりやすい方、わかりやすい方を選べばOKです。
ただ個人的な印象としてはSquash and Stretch(背骨や触手など)するリグではscaleXを、Stretch(腕や脚など)だけするリグはtranslateXを使用していることが多い気がします。
また、可能性は少ないと思いますが、scaleXを使った場合はスケール時にシアーの問題がでてきてしまう恐れがあるためにtranslateXを使ったほうが良いのではないかと個人的には思います。特にヒジやヒザがまっすぐではなく、IKハンドルを引きやすいようにすこし曲げてある場合はより注意が必要かもしれません。このあたりは本当は経験豊富な人の意見を伺いたいです。
追記
Twitterでご指摘いただいたのでスキニングをして検証してみました。
gif動画が不鮮明で申し訳ないです。
scaleX版はメッシュが綺麗に伸びているのがわかります。それに比べてtranslateX版はメッシュが不均一であるだけでなく手首にあたる部分にweightが乗っていません。
実用するためにはもう一本jointをコピーしてscaleX版でstretchするように制御する必要があります。またはスキニングで工夫する必要がありそうです。
単純にstretchIKを作りたい場合はscaleX版のほうがベターです。
ではなぜtranslateX版を解説するかと言うと、
次回の記事で扱いますが、ヒジ(ヒザ)固定(スナップ)IKというものを作る場合にはこのtranslateX版で作る必要があります。実はこれを解説するためにtransalteX版のStretchIKをとりあげました。
というわけで今回はtranslateXを使用した方法を解説します。
Set Driven Keyを使う
作成するシーンはscaleX版のものと途中までは一緒です。まずはscaleX版の記事を参考に以下のようなシーンを作成します。
「手法の違い」ということで今回のtranslateX版StretchIKは「Set Driven Key」を使用します。
IKハンドルの長さがデフォルトの場合はjoint2とjoint3のtranslateXの値は初期値のままで、IKハンドルの長さがデフォルトの2倍の場合はjoint2とjoint3のtranslateXの値は初期値の2倍になる。
このような設定をSet Driven Keyで設定します。
Windowで設定できないのでMELを使う
ところが、困ったことにSet Driven Keyのインターフェイスでは設定できる項目が限られています。
よって、隠された項目にアクセスするためにはMELスクリプトを使用しなければなりません。
string $driver = "armDimensionShape.distance";
float $upperArmLen = `getAttr joint2.translateX`;
float $lowerArmLen = `getAttr joint3.translateX`;
float $armLength = $upperArmLen + $lowerArmLen;
setDrivenKeyframe -currentDriver $driver -driverValue $armLength -attribute "translateX" -value $upperArmLen joint2;
setDrivenKeyframe -currentDriver $driver -driverValue $armLength -attribute "translateX" -value $lowerArmLen joint3;
setDrivenKeyframe -currentDriver $driver -driverValue ($armLength * 2)-attribute "translateX" -value ($upperArmLen * 2) joint2;
setDrivenKeyframe -currentDriver $driver -driverValue ($armLength * 2)-attribute "translateX" -value ($lowerArmLen * 2) joint3;
MELを使用するとこのようになります。
scaleX版のStretchIKとの違いで注意しなければならないところがあります。
scaleX版の場合はjoint1(upperArm)のscaleXの値を変更するとupperArmが伸びました。しかし、このtraslateX版の場合はjoint2(lowerArm)のtranslateXに入っている数値を変更することによってjoint1(upperArm)の長さが変わります。当たり前といえば当たり前なのですが、scaleX版との違いで注意が必要です。
これでドリブンキーの設定はできました。しかし、実際に動かしてみればわかりますが、この設定では2倍までの値までしか対応していません。3倍以上の長さにも対応させる必要があります。
ドリブンキーが設定されたjointをGraph Editorで見てみるとこのように自動でイーズインイーズアウトが自動で入っているのでこれを「Linier」に直して適切な挙動にします。
Graph EditorのメニューのView > Infinityでキーが打たれている範囲の前後のグラフも表示させます。デフォルトではPre InfinityとPost Infinityの両方が「Constant」になっていて同じ値がずっと続くようになっています。
カーブの終点を選択してCurves > Post Infinity > Cycle with Offsetを選択します。するとキーが打たれていない部分でもカーブの傾きが維持されるようになりました。
どういうわけかGraph EditorはclassicでないとドリブンキーのPost InfinityのCycle with Offsetが表示されませんでした。modernのGraph Editorでも表示されないだけで設定はできます。ここではスクリーンショットをとるためにclassicにしただけです。
これをドリブンキーが設定された両方のjointに対しておこないます。
ちなみにPre InfinityをCycle with Offsetにするとどうなるでしょうか。
StretchIKのScaleX版part1でも解説したように腕が縮みます。
また、今回は全体スケール対応はしていません。全体スケール対応については以前の記事を参考にご自分で考えてみてください。
また、FKとIKの切り替えやFKとIKのマッチングについて興味がある方は過去の記事を御覧ください。
次回
次回は前にも少し書きましたが、ヒジやヒザを固定できるIKです。
若杉さんによると「肘固定ができたら神」とのことでしたので次回は神の領域(笑)に挑戦します。
追記
フリーリグで肘(膝)固定がないのは手間がかかるわりにあまり使われないことと、複雑さが増して重くなってしまうからでしょう。
今回の記事が気に入っていただけた場合、ぜひとも他の記事もチェックしてみてください。Mayaのリギングに関する記事をまとめたページです。
コメント