2015年7月11日土曜日

【Plug-in】続 MotionBuilderでSplineIKをセットアップする方法(Plug-inのDLもあるよ)

MotionBuilderでSplineIKの記事(こちら)を書いたところ、色々な国の人から使わせてくれという連絡があり、反響がぼちぼちありました。

やはりというかMBでSplineIKの需要は高いと思いますね。というかこれまでも何故SplineIKがMBで実装されないのかが疑問に感じる位ですね。

MB2014からカーブの制御ポイントがデフォルトの機能でコントロール出来るようになり(こちらの記事を参照)、あとはカーブの全長が分かればSplineIKがMBでも設定出来るようになります。

今回はカーブの全長を出力するプラグインと既存のコンストレインを使った方法でSplineIKを設定する方法をご紹介します。まずはカーブの全長を出力するプラグインのDLパスを記載です。
【Download】
(MotionBuilder2014 64Bit)

こちらの記事を参考にカーブをアニメーション出来るように準備しておきます。


今回は5個の骨階層のものにSplineIKを設定していきます。
 

まずは、骨階層をChainIKのコンストレインを1つ1つに設定していきます。

ChainIKコンストレインのプロパティでSolverTypeをikSCsolverに変更しておきます。

1つ1つに設定するのでChainIKではなくて、Aimコンストレインでも代用できますね。


次に、ChainIKを設定したIKハンドル(Effector)をPathコンストレインしていきます。
今回は一番上の骨にもPathコンストレインを設定しています。なので、1番上の骨と4つのIKハンドルで合計5つのPathコンストを作成しています。
PathコンストレインはZeroのボタンでアクティブにしてください。



次に、PathコンストレインのWarpの値をRelationコンストレインを使って設定していきます。
そもそもWarpの値はカーブの全長を0~100に置き換えた値です。
つまり、カーブの全長が仮に120cmだとしたときにWarp値が10のときはカーブの始点から12cmのカーブ上の位置、Warp値が50のときは始点から60cmのカーブ上の位置になるものです。

このことから、常に骨の長さの位置にIKハンドルがあればいいので、
(骨の長さ)÷(カーブの全長)x100=Warp値としてあげればPathコンストレインしたIKハンドルは、
カーブの始点から骨の長さ分の離れた位置に常にくるようになります。

次の工程として、上記のことからカーブの全長が必要になりますので、今回配布したNagaoPathLengthプラグインを使用してカーブの全長を出力するようにします。
NagaoPathLengthコンストレインを作成します。

そしてカーブをD&DしてZeroボタンでコンストレインをアクティブにしておきます。



次はRelationコンストレインでの設定です。
PathコンストレインをRelationコンストレインへドラッグ&ドロップしてReceiverとして配置します。


次は、(骨の長さ)÷(カーブの全長)x100=Warp値の計算になるように下図のようにRelationを作成してください。2個目のPathのWarp値は最初のWarp値を足すように設定します。3個目以降も同様に1つ前のWarp値を足すようにしていきます。
 

次は、NagaoPathLengthコンストレインをRelationコンストレインへD&DしてSenderとして配置し、下図のようにコネクションを繋げます。
これで完成です。


細かい設定としてはPathコンストレインのプロパティでFollow Pathにチェック入れて、
UpVector、FrontVectorを設定することと、World Up TypeをObject Rotateにして
World Up Objectを設定することです。

あとは、MayaのSplineIKでいうところのTwist設定をすることです。
なんでもいいのですが、例えばUpVectorという名前のオブジェクトにTwistというCustomPropertieを作成してます。


そのTwistのプロパティを下図のようにPathのRollにリレーションを繋げます。

これで一通りの機能は実装出来ました。このサンプルで作成したFBXファイルも一緒に同梱しました。

既知の問題として2つあります。
1.必ずしも骨がカーブの上に配置されるということではない。下図を参照。
解決策としてはプログラムでカーブの上にくるようにWarp値を計算させることですが、デフォルトの機能だけでは難しいですね。

2.こちらの記事にも書いてありますけど、カーブをアニメーションさせていてもその通りにPlotされないです。こちらの解決策としては、1フレ動かしてキーフレームを打ち、1フレ動かしてキーフレームを打ちの作業を必要なフレーム分繰り返し行えば解決できます。


【Download】
(MotionBuilder2014 64Bit)

2015年7月1日水曜日

【Tips】MotionBuilderの3D Curveのアニメーション

MotionBuilderでパスを作成することは可能でしたが、制御ポイントを調整するにはパスを選択している状態でVertexモードにしないとパスの形状を調整できませんでした。
さらには制御ポイントをアニメーションさせるには、プログラムから制御する必要がありました。

いつのバージョンから出来るようになったかは定かではありませんが、MB2014では制御ポイントの調整をVertexモードやプログラムを使用せずともアニメーション出来るようになってたことを発見しましたので簡単に紹介です。

3D Curveを作成し、プロパティでDefault(Type)からALL(Type)にすると、隠れていた?カーブに関するプロパティが表示されます。



このプロパティ欄をよく見ると制御点らしき項目があります。

しかもキーフレームに対応しててかつオブジェクトを入れることが出来るスロットもあります。

Markerなどのオブジェクトをドラッグアンドドロップでいれると、Markerとは違う位置にカーブが移動していまします。



これはどうやら、元の制御ポイントの座標(頂点座標)分がオフセットされているみたいです。
ですので、これを0にしてあげるとMarkerと同じ位置に制御点が配置されるようになります。

Markerにアニメーションを付けてパスが動いている状態で、Pathコンストレインを使って、
アニメーションを付けてみようとしたら、なんとPlotには対応していないようです・・・・・・。

厳密にいうと、シーンの開始フレームのパスの形状のままでPlotされてました。
Markerでアニメーションさせてたものは無視されているようですね。

回避策としては、1フレーム移動して、自分でキーフレームを打ち、1フレーム移動して、キーフレームを打ちを最後まで繰り返す、手動Plotなるものをやってあげれば、ちゃんとパスに沿ってこちらが想定している状態でキーフレームが打たれます。

結構いいところまで来ているんですがあと1歩足りてないところがMotionBuilderらしいですね。