やはりというかMBでSplineIKの需要は高いと思いますね。というかこれまでも何故SplineIKがMBで実装されないのかが疑問に感じる位ですね。
MB2014からカーブの制御ポイントがデフォルトの機能でコントロール出来るようになり(こちらの記事を参照)、あとはカーブの全長が分かればSplineIKがMBでも設定出来るようになります。
今回はカーブの全長を出力するプラグインと既存のコンストレインを使った方法でSplineIKを設定する方法をご紹介します。まずはカーブの全長を出力するプラグインのDLパスを記載です。
【Download】
(MotionBuilder2014 64Bit)
まずは、骨階層を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として配置します。
次は、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フレ動かしてキーフレームを打ちの作業を必要なフレーム分繰り返し行えば解決できます。
1つ1つに設定するのでChainIKではなくて、Aimコンストレインでも代用できますね。
次に、ChainIKを設定したIKハンドル(Effector)を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値を足すようにしていきます。
これで完成です。
細かい設定としてはPathコンストレインのプロパティでFollow Pathにチェック入れて、
UpVector、FrontVectorを設定することと、World Up TypeをObject Rotateにして
World Up Objectを設定することです。
あとは、MayaのSplineIKでいうところのTwist設定をすることです。
なんでもいいのですが、例えばUpVectorという名前のオブジェクトにTwistというCustomPropertieを作成してます。
これで一通りの機能は実装出来ました。このサンプルで作成したFBXファイルも一緒に同梱しました。
既知の問題として2つあります。
1.必ずしも骨がカーブの上に配置されるということではない。下図を参照。
解決策としてはプログラムでカーブの上にくるようにWarp値を計算させることですが、デフォルトの機能だけでは難しいですね。
2.こちらの記事にも書いてありますけど、カーブをアニメーションさせていてもその通りにPlotされないです。こちらの解決策としては、1フレ動かしてキーフレームを打ち、1フレ動かしてキーフレームを打ちの作業を必要なフレーム分繰り返し行えば解決できます。
【Download】
(MotionBuilder2014 64Bit)