ボーンの挙動制御には、
- インバースキネマティクス(IK)
- フォワードキネマティクス(FK)
の二種類があります。それぞれ一言で説明すると、ボーンの先端位置に向かって、それぞれのボーンが角度を変化させていく機構がIKで、子ボーンが親ボーンの角度に依存する機構がFK、となります。
この記事では、IKとFKを簡単に切り替えられるIK/FKスイッチの作り方を解説します。
Contents
IK/FKスイッチとは
アニメーション作成において、IFとFKは非常に重要な役割を果たします。ポージングにはIKを使用し、モーションにはFKを使うことが多いです。シーンによっては、IKとFKを使い分けていかないと、うまくアニメーションさせることができません。
この記事で解説するIK/FKスイッチの完成イメージがこちらです。
作り方
準備するもの
IKを設定したボーンを用意してください。
スイッチ用ボーンを設置する
アーマチュアにスイッチ用のボーンを追加します。編集モードからボーンを追加し、位置や名前を調整します。位置はボーンの少し上、名前はIKFKSwitchにしました。
ボーンコンストレイントを追加する
続いてスイッチの移動範囲を制限します。ポーズモードからスイッチ用のボーンを選択してください。そして、プロパティのコンストレイント設定より、Limit Locationを追加します。
なお、Shift + Ctrl + cを押すとコンストレイント追加のメニューを呼び出すことができます。ショートカットを駆使して、作業効率を上げましょう。
Limit Locationを追加したら、次はその設定を変更します。
設定内容を上から順にみていきましょう。
①Minimum
それぞれの軸について最小値を設定できます。
チェックボックスは制限のオンオフ、その隣の欄で下限の数値を設定できます。
②Maximum
それぞれの軸について最大値を設定できます。
Minimumと同様チェックボックスで制限のオンオフ、その隣の欄で上限の数値を設定できます。
③Affect Transform
チェックを入れると、制限がボーンのトランスフォーム情報にも影響するようになります。
ポーズモードでの位置とトランスフォーム情報での位置は別々に管理されていて、これがないと直感的に操作できなくなってしまうことがあるので、チェックを入れるのをオススメします。
④Owner
ワールド空間やローカル空間といった、制限のかかる空間を設定できます。
blender2.91以前では、表記がOwner Spaceとなっていますが機能は同じです。
⑤Influence
コンストレイントの影響力を設定できます。0にすると制限が無効化されるので注意しましょう。
今回の設定では、「ローカル空間Z軸のみの移動、距離は0mから1mまで」という制限をかけました。
ドライバーを設定する
ドライバーを使って、スイッチがIK/FKの切り替えるように設定します。ドライバーの基本的な使い方は、次の記事を参考にしてください。
ポーズモードより、IKを設定してあるボーンを選択し、IKのInfluenceにドライバーを設定します。
ドライバーの設定は、以下の通りです。
上二つの項目「Object」と「Bone」には対象のアーマチュアとスイッチを指定します。下二つの項目「Type」と「Space」には、Z LocationとLocal Spaceを設定します。これで、スイッチのローカルZ位置を取得することができるようになりました。
なお、Expressionの欄がデフォルトではvar+1になっていますが、varに直します。これで、スイッチのローカルZ位置を使って、IKのInfluenceを0から1の間で変更できるようになります。
設定を終えたら動作確認をします。スイッチが上ならIK、下ならFKとボーンの制御が切り替わったら成功です。
スイッチの見た目を変更する
IK/FKスイッチの基本的な機能は作ることができたので、次にスイッチとして使いやすいように設定していきます。そのために、カスタムシェイプとシェイプキーの2つを紹介します。
カスタムシェイプを設定する
カスタムシェイプは、ボーンの見た目を任意のオブジェクトに変更できる機能です。
まずは「FK」という文字を形どるオブジェクトを用意します。オブジェクト名はFKにしました。
次にポーズモードでスイッチを選択し、プロパティ > Viewport Display > Custom Shape > Custom Objectに、先ほど用意した「FK」の文字オブジェクトを指定してください。
Custom Shapeの各項目については、以下の通りです。
項目 | 説明 |
---|---|
Custom Object | ボーンの見た目を、指定したオブジェクトに変更します。 |
Scale | ボーンの見かけ上の大きさを設定します。 カスタムオブジェクトの元の大きさを1とします。 |
Override Transform | ボーンの見かけ上の位置、角度、大きさを別のボーンから参照することができます。 空欄のままだとカスタムシェイプを設定しているボーンを参照します。 |
Scale to Bone Length | チェックを入れると、カスタムシェイプの大きさがボーンの長さと連動します。 |
Wireframe | チェックを入れると、カスタムシェイプがワイヤフレームで表示されます。 |
シェイプキーを使ってスイッチの状態を表示する
カスタムシェイプを使いボーンの形状を任意に置き換えることができましたが、FK状態ならFK、IK状態ならIKと変形させられるとより分かりやすくなります。そうした、メッシュ形状の変更をシェイプキーを使って実装してみます。
シェイプキーの基本的な使い方はこちらの記事を参考にしてください。
元の「FK」という文字状態をBasisとして、Valueが1の時に「IK」という文字になるシェイプキーを作成します。
このシェイプキーのValueは、スイッチが上部にある状態で1で、下にある時はValueが0になるようにします。
IKが設定してあるボーンに追加したドライバーをコピーして、シェイプキーのValueにペーストしてください。そうすればスイッチの位置情報とシェイプキーのValueを連動させることができます。
動作を確認し、ボーンの状態にあった文字の形にスイッチが変形したらIK/FKスイッチの完成です。
作成時のトラブルと注意点
起きやすいトラブルと対処法をまとめました。もし思ったように動かない場合は、以下を確認してください。
制限の範囲内なのにボーンが動かない
コンストレイントの、OwnerがLocal Spaceになっているか確認してください。
ボーンに稼働範囲をつけるには、ローカル空間で制限をかけるのが一般的です。
ボーンに制限がかからない
コンストレイントのInfluence値が1になっているか確認してください。
この値は、0から1の数値をとれるようになっていますが、Limit Locationの場合は0なら制限をかけない、それ以外なら制限をかける、という挙動をします。
ドライバーが作動しない
ドライバーが0から1の数値を出力できているか確認してください。ドライバーの出力する値はドライバー設定画面のDriver Valueで確認できます。
IKが持つInfluenceの値や、シェイプキーの値は0から1の数値が必要なので、それに合ったドライバー設定にしてください。
オブジェクトへの変更がカスタムシェイプに反映されない
カスタムオブジェクトの調整は基本、カスタムオブジェクトの編集モードで行ってください。
オブジェクトモードでの変化はカスタムシェイプに反映されません。
IK/FKスイッチを2つ以上作るときの注意点
IK/FKスイッチを複数作るときにありがちなミスを紹介します。以下の点に注意してください。
カスタムオブジェクトを使い回さない
ボーンのカスタムシェイプは、オブジェクトを複製するのではなく、オブジェクトの形状を共有します。
そのため、2つ以上のIK/FKスイッチで同じカスタムオブジェクトを使い回すと、それぞれのスイッチでIK/FKの状態が異なっていても、カスタムシェイプの形は全てIKかFKのどちらかになってしまいます。
今回の説明では、あえてスイッチにオブジェクトとドライバーという組み合わせを使いましたが、そもそもこうした制御系のシステムはスクリプトを書いた方がいいです。スイッチが増えれば増えるほどビューポートが混雑することになるので、実際に運用する場合は「エディターを拡張する」という方向を考えてみてください。
ドライバーを使い回さない
ドライバーをコピー&ペーストすると、ドライバーに設定された値の取得先も変わらないままドライバーが設定されます。ドライバーごとに参照先のスイッチを設定しなおすことを忘れないようにしましょう。
反対に、一つのスイッチで複数のボーンのIK/FKを管理する場合はこの限りではありません。
まとめ
ボーンのIK/FKを素早く、かつ簡単に切り替えられるIK/FKスイッチのご紹介でした。
仕組みはシンプル、それでいて便利さは絶大です。
この記事を通してリグ制作の幅が広がったなら幸いです。
より表現力の高いリグを作るために、ぜひ導入してみてください。