AnyPortrait > マニュアル > ボーンコンストレイント

ボーンコンストレイント


1.7.0

ゲームでキャラクターを動かす際、ボーンを常に特定の範囲内で動作させる必要がある場合があります。
例えば、肘や膝が関節の可動域を超えて回転しないように制限したり、手や足の位置を一定の範囲内に収めたりするといったケースです。
こうした動きを毎回キーフレームで直接制御する代わりに、ボーンのトランスフォームを特定の範囲に合わせて制限する機能があれば、非常に役立つでしょう。
「ボーンコンストレイント」は、ボーンの動きを自動的に制限する機能です。
この機能は「IKによるコンストレイント」にも対応しているため、様々な状況で役立つでしょう。
このページでは、「ボーンコンストレイント」の使用例とともに、関連するオプションについて説明します。




ボーンコンストレイントを適用してみましょう。
(1) 「メッシュグループ」編集画面で、「Bone」タブを選択します。
(2) 「ボーンコンストレイント」を適用するボーンを選択します。
(3) 「IK and Constraints」タブを選択します。
(4) 「Add Constraint」ボタンを押します。




ボーンコンストレイントを追加すると、上記のように様々なオプションが表示されるのが確認できます。




1. Constraint Stack : 追加されたボーンコンストレイントです。編集するボーンコンストレイントを選択したり、「X」ボタンを押して削除したりできます。
2​​. Add Constraint : ボーンコンストレイントを追加するボタンです。
3. Layer Up/Down : ボーンコンストレイントの演算順序を調整できます。同じ演算タイミングの場合、リストの下側にあるボーンコンストレイントが先に演算されます。
4. Constraint Method : ボーンコンストレイントが適用されるトランスフォームの種類です。
5. Coordinate : ボーンコンストレイントの計算が行われる軸を決定する座標系です。オプションによっては、計算の基準となるタイミングが変わることもあります。
6. Axis, Range : ボーンコンストレイントが適用される軸と範囲の値です。
7. Weight : ボーンコンストレイントの適用度合いを決定します。「制御パラメータ」を接続することも可能です。
8. Smooth Clipping : ボーンコンストレイントの範囲付近で、コンストレイントが滑らかに適用されるように設定できます。
9. Guidelines : 作業スペース上でボーンコンストレイントの範囲を視覚的に確認するためのオプションです。
10. 共通オプション : 対象となるボーンコンストレイントに共通して適用されるオプションです。


いくつかの例とともに、ボーンコンストレイントのオプションを見ていきましょう。




例1.「Position + Delta」ボーンコンストレイント


「Position」コンストレイントを使用して、ボーンの位置を制限することができます。
この際、「Coordinate」の値を「Delta」に設定すると、親ボーンを基準として、モディファイアーやアニメーションによる移動を制限できます。
「Position + Delta」方式のコンストレイントの効果を確認しながら、他のオプションについても見ていきましょう。


メモ
この方式は、モディファイアやアニメーションにおけるボーンの移動値を制限します。
対象のボーンが親ボーンとIKチェーンで接続されている場合、ギズモを使ってボーンの位置を編集することはできません。
IKチェーンを先に解除してから、コンストレイントを設定することをお勧めします。




(1) 「Add Constraint」ボタンを押して新しいボーンコンストレイントを追加し、リストから選択します。
(2) 「Constraint Method」の値を「Position」に、「Coordinate」の値を「Delta」に設定します。
(3) 作業スペース上で、選択したボーンの周囲に四角形のガイドラインが表示されます。このガイドラインは、現在適用されているコンストレイントの範囲を示しています。




制約(コンストレイント)が適用される範囲を変更してみましょう。
(1) 「Axis」を選択します。X軸またはY軸のいずれかを選択して制限したり、XとY軸を同時に制限したりすることができます。ここではX軸を選択してみます。
(2) 選択した軸に対してのみ、ガイドラインが表示されることが確認できます。




(3) 「Range Type」の値を変更します。
最大範囲または最小範囲のいずれか、あるいはその両方を指定できます。
「Fixed」を選択すると、トランスフォームの値が指定した値になるように設定されます。
この例では、「Max」を選択してみました。




(4) 制限範囲の値を入力します。
(5) 指定した軸、制限範囲の種類と値に合わせて、ガイドラインが描画されるのが確認できます。
「Delta」タイプの座標系では、親ボーンの座標系を基準とするため、上記のようにコンストレイントの範囲が設定されます。


以上の手順で、このボーンコンストレイントの基本設定が完了します。
この例で、いくつかのオプションをさらに見ていきましょう。




(1) 「Weight」に関連するオプションです。「Weight」が1より小さい場合、コンストレイントが適用される度合いが弱まります。「制御パラメータ」と接続することも可能です。
(2) 「Smooth Clipping」を有効にすると、範囲の境界付近でトランスフォームが滑らかに制限されるように設定できます。




(1) ガイドラインの表示方法を決定するオプションです。「Guidelines」オプションには、「非表示 (Hidden)」、「選択の有無にかかわらず常に表示 (Always)」、「ボーンが選択された時のみ表示 (Selected Only)」という設定値があります。
(2) 設定された色とスタイルに基づいて、作業スペースにガイドラインが描画されます。
(3) また、「View Menu > Bone Guides > Show Constraint Info」項目から、ガイドラインを一括して非表示または表示に切り替えることができます。


オプションの設定が完了したら、ボーンコンストレイントをテストしてみましょう。




ボーンコンストレイントをテストするために、簡単なアニメーションを作成してみましょう。
(1) 「アニメーションクリップ」を作成します。
(2) 「編集モード」をオンにします。
(3) コンストレイントが適用されたボーンをアニメーションに登録し、移動させます。




(1) 「編集モード」をオフにします。
(2) ボーンの位置が、コンストレイントによって設定された範囲内に制限されることが確認できます。




例2.「Rotation + Delta」ボーンコンストレイント




今回は、ボーンの回転を制限するコンストレイントを設定してみましょう。
(1) コンストレイントを適用したいボーンを選択します。
(2) 「Add Constraint」ボタンを押して、コンストレイントを追加します。
(3) 「Constraint Method」オプションの値を「Rotation」に設定します。
(4) 回転範囲を示すガイドラインが表示されます。
回転の場合、ボーンの基本角度(ローカル座標系)を基準に範囲が設定されます。




回転範囲を設定します。
(1) 「Range Type」の値を「Min ~ Max」に設定します。
(2) 「Angle Range」の値を適切に設定します。


メモ
「Rotation」タイプのコンストレイントの場合、その特性上「Coordinate」オプションは表示されず、常に「Delta」タイプとして動作します。
また、「Range Type」の値は、回転という特性により「Min ~ Max」と「Fixed」のみが存在します。


コンストレイントの基本設定作業が完了したら、次は「Weight」オプションについてさらに詳しく見ていきましょう。




基本的には、「Default Weight」オプションによって、コンストレイントが適用される度合い(0~1)が決まります。
しかし、このオプションに「制御パラメータ」を関連付けると、コンストレイントの度合いをリアルタイムで変更できるようになります。
(1) 「Weight」オプション内の「Control Parameter」オプションを有効にし、「Set」ボタンを押します。
(2) 「Float」タイプの「制御パラメータ」を選択し、「Select」ボタンを押します。




(1) テスト用に「アニメーションクリップ」を作成します。
(2) ボーンを回転させるアニメーションを作成します。
現在はコンストレイントが適用されていないため、ボーンが設定された範囲を超えて回転しているのが確認できます。




(1) ボーンコンストレイントに接続した「制御パラメータ」をアニメーションに登録します。
(2) キーフレームを追加します。
(3) 「制御パラメータ」の値を1に設定します。
(4) コンストレイントが正常に動作し、ボーンの回転が設定された範囲によって制限されることが確認できます。




例3.「Scale + Delta」ボーンコンストレイント




「Scale」方式のコンストレイントを使用すると、ボーンのサイズを制限できます。
(1) 上記のように、制限する座標系、軸、および範囲を設定します。
(2) 作業スペースにサイズを示すいくつかの長方形のガイドラインが表示されます。そのうち、グレーのものは基本サイズを表します。


「Delta」座標系の「Scale」コンストレイントは、「Position」と同様のオプションを持ち、実際にも同様に動作します。
ただし、「Scale」コンストレイントでは、範囲の値が常に「正の数」でなければならないという点で違いがあります。
これは、「Scale」コンストレイントがボーンの「Scale」の反転を考慮していないためです。




例4.「Position + World (FK)」ボーンコンストレイント


今回は、「Coordinate」の値を「World」に設定してみましょう。
「Position」と「Scale」のコンストレイントはどちらも「World」座標系をサポートしていますが、その動作は異なります。
また、「Position」コンストレイントにおいて「IK」を使用するかどうかによっても、動作や結果が変わります。
今回の例では、IKを使用しない状態で、「Position」コンストレイントに「World」座標系を適用してみます。




(1) コンストレイントを追加・選択した後、「Constraint Method」の値を「Position」に、「Coordinate」の値を「World」に設定します。
(2) ガイドラインの座標系が、本件とは無関係なワールド座標系で描画されていることが確認できます。




(1) 位置を制限するための範囲の軸と値を設定します。ワールド座標系では範囲の設定が難しいため、「Set Current Position to Property」ボタンを押すと現在のボーンの位置が範囲の値に入力されます。これを利用して位置を推測し、入力することも可能です。
(2) 設定されたコンストレイントの領域をワークスペース上で確認できます。




「Move by IK」オプションは、位置を制限する際にIKを使用するかどうかを決定します。
今回の例ではIKを使用せずにテストを行うため、チェックを外します。




(1) テスト用に「アニメーションクリップ」を作成します。
(2) 「編集モード」をオンにします。
(3) 今回は、「World」座標系の特性を確認するため、親ボーンが移動するアニメーションを作成してみました。




(1) 「編集モード」をオフにします。
(2) 親ボーンを移動させても、コンストレイントが適用されたボーンは設定範囲の外へは移動しないことが確認できます。


「World」座標系のコンストレイントは、モディファイアやアニメーションの値とは無関係に、全体的なポーズを基準として動作することがわかります。




例5.「Position + World (IK)」ボーンコンストレイント




今回は、「IK」を適用した「Position + World」コンストレイントについて見ていきましょう。
このコンストレイントを適切に使用するには、上記のように「IKチェーン」が設定されている必要があります。




(1) IKチェーンが設定されたボーンを選択します。
(2) 「Add Constraint」ボタンを押して、コンストレイントを追加します。
(3) 上記のように「Position」および「World」方式のコンストレイントになるよう設定し、範囲の値を適切に入力します。
(4) 「Move by IK」オプションを有効にします。




(1) 「アニメーションクリップ」を作成します。
(2) 「編集モード」をオンにします。
(3) IKチェーンのルートボーンを動かし、コンストレイントが動作するように誘導します。




(1) 「編集モード」をオフにします。
(2) 「Position」コンストレイントが動作していることが確認できます。また、このコンストレイントによって、IKチェーン全体のポーズがIKにより変化することも確認できます。




IKと組み合わせてコンストレイントが動作する様子です。
上の結果からわかるように、この方式のコンストレイントは、「歩行中のキャラクターの足が地面にめり込むのを防ぐ」といった処理を実装するのに非常に効果的です。


他のオプションを活用して、コンストレイントをより柔軟に使ってみましょう。
これまでは、コンストレイントの範囲を設定するために値を直接入力していました。
この方法では手間がかかるうえ、リアルタイムに変更することもできません。
そこで、「別のボーン」の位置をコンストレイントの範囲の値として利用すれば、この問題を解決できます。




(1) 「地面」の高さの役割を果たす「Bone Ground」というボーンを新たに追加しました。
(2) コンストレイントが設定されていたIKチェーンのボーンを選択します。
(3) 先ほど作成したコンストレイントを選択します。
(4) 「Refer to Bones」オプションを有効にし、「Set」ボタンを押します。
(5) 「Bone Ground」を選択し、「Select」ボタンを押します。


「Refer to Bones」オプションは、他のボーンを参照して、制限範囲に該当する値を置き換える役割を果たします。
この際、X軸・Y軸および最小・最大範囲のそれぞれに、異なるボーンを割り当てることが可能です。
ボーンが割り当てられていない場合は、入力した数値が使用されます。




アニメーション編集画面でテストしてみましょう。
(1) 「Bone Ground」を動かしてみると、(2) ガイドラインも一緒に動くのが確認できます。




この状態で「編集モード」を終了すると、「Bone Ground」のY位置を基準にコンストレイントが動作することを確認できます。




「Position + World (IK)」コンストレイントで使用されるオプションについて、さらに詳しく見ていきましょう。
「Common Constraint Properties」の項目には、「FK-based IK」と「Smooth IK」というオプションがあります。
これらは、コンストレイントによってIKが動作する際に使用されるオプションです。
まずは、「FK-based IK」オプションの役割について見ていきましょう。






「FK-based IK」オプションは、コンストレイントによるIKが動作する際の初期ポーズをどのように設定するかを決定します。
「FK-based IK」オプションを有効にすると、「FKによるポーズ」を基準にIK演算を行います。
「FK-based IK」オプションを無効にすると、コンストレイントが適用される直前のポーズを基準にIK演算を行います。つまり、「他のボーンのコンストレイント」や「IKコントローラー」などの影響を受ける可能性があります。


そこで、このオプションの効果を確認するために、「IKコントローラー」を活用してみます。
上記のように、1つのIKチェーンに2つの「Effector Bone」を接続する「IKコントローラー」を設定しました。


メモ
IKチェーン内の「初期ポーズ(Initial Pose)」オプションの値が「Prefer Angle」である場合、「FK-based IK」かどうかによる大きな違いはない可能性があります。




アニメーション編集画面で、上記のように編集してみました。
(1) IKチェーンが左側に曲がるように、キーフレームアニメーション(FK)を作成してみました。
(2) 逆に、「Effector Bone」は右側に配置しました。




(1) 「編集モード」をオフにします。
(2) 「Effector Bone」と「IKコントローラー」によって、IKチェーンの関節がFKとは逆に右側へ曲がっていることが確認できます。




この状態でコンストレイントを動作させてみましょう。
「FK-based IK」が有効な左側の結果では、FKのポーズを基準に関節が左側に曲がった状態で、コンストレイントとIKが動作します。
一方、「FK-based IK」が無効な右側の結果では、IKコントローラーの結果に基づいてコンストレイントが動作します。




次に、「Smooth IK」オプションを見てみましょう。
このオプションは、コンストレイントが適用されるタイミングで「IKのウェイト」を徐々に増加させる役割を果たします。
その際、制限範囲までの距離に比例してウェイトが調整されるため、距離の値を別途入力する必要があります。
(1) 「Smooth IK」オプションを有効にし、「Transition Distance」の値を大きめに変更して、確認しやすくします。




ボーンが下へ移動する簡単なアニメーションを作成し、コンストレイントが適用される過程を確認してみましょう。
コンストレイントが適用されたボーンが制限範囲に達したにもかかわらず、一瞬その範囲よりさらに下へ移動してから戻ってくる様子が確認できます。
これは、「Smooth IK」によってIKのウェイトが徐々に増加し、その分コンストレイントの適用が緩やかになったためです。
このようにコンストレイントの範囲を緩和することで、滑らかな動きを作り出すことができます。






例6.「Scale + World」ボーンコンストレイント




「Scale」と「World」を組み合わせたコンストレイントは、別の用途で使用されます。
(1) 親ボーンのサイズが変更されると、(2) 子ボーンのサイズもそれに比例して変化するのが、基本的なスケルタル演算の仕組みです。
しかし、親ボーンのサイズとは無関係に、子ボーンのサイズを適度に制限したり、あるいは完全に固定したりしたい場合もあるでしょう。
その際に使用されるのが、「Scale + World」コンストレイントです。




(1) サイズを固定したい子ボーンを選択します。
(2) コンストレイントを追加し、「Constraint Method」の値を「Scale」、「Coordinate」の値を「World」に設定します。




(3) 「Axis」の値を「X, Y」、「Range Type」の値を「Fixed」に設定した後、それぞれの軸のサイズが「1」に固定されるように設定します。




これで、親ボーンのサイズが変更されても、子ボーンのサイズは変わらないことが確認できます。