前回modoのIKについて書いたので、ついでにIKに関連したリグの組み方の例として、IKゴールの移動範囲を腕や脚の長さより遠くに移動しないように制限する方法を書いてみます。
LightWave のIKには「ゴールを接着 (Keep Goal In Reach)」という機能があり、IKチェーン(IKによって制御されているスケルトン)の長さより遠くにIKゴールが移動しない設定がありました。この設定をmodoで再現したものです。
作り方は単純でDistance Constraint を使用してアイテムの移動範囲を制限します。
作成手順です。
- IKの始点と同位置にロケータを作成して、ロケータの子のスケルトンにIKを適用します。
これはFBIKのアップベクターの作成手順で使用する階層構造と同じです。 - Distance Constraint を作成します。
Distance Constraint はその名の通り、距離でコンスレイントするモディファイヤです。 - ロケータを作成して、IKゴールの位置に移動します。
ロケータをビューポートでドラッグアンドドロップ(長押し)すると、ドロップアクションメニューが表示されるので「位置を一致」を選択すると簡単に同じ位置にアイテムを移動できます。 - IKゴールをロケータの子にし、ロケータの「ワールド位置」をスケマティックに追加します。
- Distance Constraint を設定します。
IKチェーンの親のロケータと、IKゴールの親のロケータの「ワールド位置」を Distance Constraint の「起点」と「終点」にリンクします。Distance Constraint のプロパティでクランプを「最大」、距離をIKチェーンの長さに設定します。画像ではIKチェーンの長さを計るために、測定モディファイヤの Measure Distance を使用しています。 - 最後にMeasure Distanceの「位置出力」を、IKゴールの親のロケータにリンクします。
IKを制御するときはIKゴールを直接編集するのではなく、ロケータを編集することでIKチェーンの長さより遠くに移動しない状態になります。親アイテムを移動したときもIKゴールが一緒に引っぱられて動きます。
注意点としては、見た目は制限されていてもトランスフォームの値は生きていることです。IKゴールを遠くまで移動してしまうと、IKチェーンの親アイテムを移動したときに、なかなかゴールに到達しない感じになります。
IKに関連したリグを組もうとすると発生しやすい問題が「モディファイヤ依存ループ」です。IKはIKゴールの位置を使用してスケルトンの位置や角度を計算するため、IKチェーン内のスケルトンの位置や角度を使用してIKゴールを操作しようとすると処理がループしてしまい計算不能になります。
IKに関連したリグを作るときは、IKチェーンと関係ない階層のアイテムを使用するとうまく行くと思います。