2D インバースキネマティクス (IK)
概要
2D インバースキネマティクス (IK) の機能セットを利用すると、2D IK をキャラクターのアニメーションのスケルトンのボーンやトランスフォームに適用できます。2D IK では、ターゲットの位置に向かって移動するボーンのチェーンの位置や回転の計算が自動的に行われます。これにより、簡単にキャラクターの四肢のポージングやアニメーションを設定したり、リアルタイムでスケルトンを操作したりできます。
2D IK をキャラクターのスケルトンに適用する
以下のワークフローは、2D Animation パッケージの アニメーションワークフロー の続きです。2D IK をキャラクターのスケルトンに適用する方法を示しています。
2D Animation パッケージの Skinning エディター の Bone ツール で作成したボーンの階層を参照します。
階層の最上位のゲームオブジェクトに、IK Manager 2D コンポーネントを追加します。通常、このオブジェクトはキャラクターのスケルトン全体のメインのルートボーンです。
使用する IK Solver のタイプを選択して、IK Solvers リストに追加します。IK Solver は、ゲームオブジェクトとして階層にも追加されます。
IK Solver を選択した状態で、IK Solver の Effector と Target を作成、設定します。
Target の位置を動かして、IK が適用されたボーンのチェーンを移動し、ボーンの位置を決めます。
IK Manager 2D の使用例
IK Manager 2D コンポーネントは、階層内の IK Solver を制御します。Manager コンポーネントを階層内の最上位のボーンに追加します。このボーンは一般に Root ボーンと呼ばれます。
この例では、階層内の Root ボーンが Plunkah であるため、このボーンにコンポーネントを追加します。

IK Solver を追加するため、IK Solvers リストの右下にある + 記号を選択します (以下を参照)。

ドロップダウンメニューで、Chain (CCD)、Chain (FABRIK)、Limb の 3 つのオプションのうち、いずれかの IK Solver を選択します。IK Solver のタイプごとに、Effector の位置の求解に使用されるアルゴリズムが異なります。

IK Solver は降順で実行され、リスト内の下位の Solver は、上位の Solver によって設定された位置を参照します。通常、Solver の順番は、スケルトンの階層内のボーンやトランスフォームの順番を反映したものになります。
例えば、腕のボーンが胴体ボーンの子の場合は、胴体の IK Solver は、リスト内では 腕の Solver よりも上位に設定する必要があります。Solver の順序は、各行の左端を上下にドラッグすることで変更できます。
Weight
Weight は、Solver の解がチェーン内のボーンやトランスフォームの位置にどの程度影響するかを表す測定値です。IK Manager 2D にはマスターの Weight プロパティがあり、これが制御しているすべての Solver に影響します。このプロパティは、Solver の個々の Weight 設定に加えて適用されます。
Always Update
パフォーマンスの最適化に使用します。これをオンにすると、IK Manager 2D によって Solver が常時更新されます。オフにすると、すべての IK Solver のチェーンからボーンによって制御されている Sprite Skin のいずれかが表示されている場合のみ、Solver が更新されます。
Restore Default Pose
これを選択すると、すべてのボーンとトランスフォームが元の位置にリセットされます。
IK Solver
IK Solver は、Effector とその接続されたボーンが、Target の位置に到達するために必要な位置と回転を算出します。IK Solver のタイプごとに、異なる条件に合わせて計算を実行するアルゴリズムがあります。
すべての Solver で利用できるプロパティは以下のとおりです。
| プロパティ | 説明 |
|---|---|
| Effector | IK Solver によって求解するボーンやトランスフォームを定義します。 |
| Target | Effector の目的位置を指定するために使用されるトランスフォーム。 |
| Constrain Rotation | Effector の回転を Target の回転に制限します。 |
| Restore Default Pose | 有効の場合は、2D IK を適用する前にボーンを元の位置に復元します。無効の場合は、Effector の現在の位置と回転を基準に 2D IK を適用します。 |
| Weight | スライダーを使用して、IK Solver の解がトランスフォームの元の位置に与える影響の度合いを調整します。最小値の 0 では IK の解が無視され、最大値の 1 では IK の解が完全に適用されます。この値は、IK Manager のマスターの Weight 設定による影響も受けます。 |
| 以下のプロパティは、Chain (CCD) と Chain (FABRIK) のみで利用できます。 | - |
| Chain Length | IK の解が適用されるチェーン内のボーンとトランスフォームの数 (Effector が始点)。 |
| Iterations | アルゴリズムを実行する回数。 |
| Tolerance | Target が目的の位置に到達したと判定し、IK Solver による反復処理を停止するしきい値。 |
Limb
腕や脚などのジョイントのポージングに適した標準の 2 つのボーンの Solver。この Solver のチェーンの長さは、3 つのボーンに固定されます (Effector のボーンまたはトランスフォームを始点として、そのチェーン内の他のボーンを最大 2 つ含めることができます)。
Chain (CCD) - Cyclic Coordinate Descent
この IK Solver では、Cyclic Coordinate Descent アルゴリズムが使用されます。実行回数が増えるたびに精度が高まっていくアルゴリズムです。この Solver は、設定された Tolerance または Iterations の回数 に到達すると実行が停止されます。
以下のプロパティは、Chain (CCD) IK Solver のみで利用できます。
| プロパティ | 説明 |
|---|---|
| Velocity | IK アルゴリズムが Effector に適用されるスピード (目的の位置に到達するまで)。 |
Chain (FABRIK) - Forward And Backward Reaching Inverse Kinematics
この IK Solver では、Forward And Backward Reaching Inverse Kinematics (FABRIK) アルゴリズムが使用されます。実行回数が増えるたびに精度が高まっていくため、Chain (CCD) と類似しているアルゴリズムです。この Solver は、設定された Tolerance または Iterations の回数に到達すると実行が停止されます。
一般に Chain (FABRIK) IK Solver は、Chain (CCD) と比べ、Target の位置に到達するまでの実行回数が少なくなりますが、回転制限がチェーンに適用されていると、実行速度が低下します。この Solver はボーンがリアルタイムで操作されて、位置が変わっても、迅速に適応することができます。
Effector とその Target を作成する
IK Solver を作成したら、次は Effector とその Target を設定します。Target は、Effector が向かうターゲットの位置を表すトランスフォームです。Effector が Target の位置に向かって移動する際に、IK Solver によって、Effector と、それが接続されているボーンのチェーンの位置と回転が計算されます。
Target を設定する手順は以下のとおりです。
- チェーン内の最後のボーンを選択します。
- 空のトランスフォームを作成します (右クリック > Create Empty)。ハイライトされているボーンの子として自動的に作成されます。
- トランスフォームの位置を、チェーン内の最後のボーンの先端に移動します。
- IK Solver を選択します。Inspector ウィンドウを開き、トランスフォームをドラッグして階層から Effector フィールドに移動します。
- Create Target ボタンをクリックします。トランスフォームの位置に Target が作成されます。
Create Target ボタンが無効になっている場合は、Chain Length の値が 1 以上に設定されているか確認します。
- Target が IK Solver の子として作成されます。シーンビューでは円形のギズモとして表示されます。Target を移動し、接続されているボーンのチェーンを操作します。

シーンビューのギズモ
キャラクターをアニメーション化する際は、IK ギズモの表示設定を切り替えるかカスタマイズすることで、その可視性を調整できます。ギズモを見やすくする必要がある場合や、キャラクターのアニメーションを編集する際に画面上の余計な情報を減らす必要がある場合に便利です。
グローバルな IK ギズモのトグル
シーンビューウィンドウの右上にある Gizmos ドロップダウンメニューをクリックし、IKManager2D (メニュー: Gizmos > Scripts > IKManager2D) のオン/オフを切り替えることで、IK ギズモの有効/無効を切り替えることができます。

Solver ギズモ
Solver ギズモは、Solver を管理する IK Manager 2D コンポーネントからカスタマイズできます。IK Manager 2D コンポーネントの Inspector で、Solver ギズモを個別に非表示にして、重要な Solver のみを表示することができます。ギズモをさらに詳細に区別する場合は、IK Manager 2D コンポーネントの Inspector で、ギズモの色をカスタマイズできます。

スクリプティング API のリファレンス
新しい Solver の追加
Solver2D クラスを拡張することで、独自の Solver を追加できます。拡張したクラスは、IKManager2D コンポーネントの Solver メニューに新しい Solver として表示されます。
Solver2D
このパッケージのすべての IK Solver の基本クラスです。IKManager2D は、これを拡張したクラスをすべて検出し、制御可能な Solver として承認します。独自の IK Solver を作成する場合は、以下のメソッドを実装またはオーバーライドします。
protected abstract int GetChainCount()
この関数は、Solver が所有する IK チェーンの数を返します。Solver が所有する IK チェーンの数を返す場合に使用します。
public abstract IKChain2D GetChain(int index)
この関数は、特定のインデックスの IKChain2D を返します。Solver が所有する、特定のインデックスの IKChain2D を返す場合に使用します。
protected virtual bool DoValidate()
この関数は、Solver に渡されるすべてのパラメーターに対して確認を行います。Solver がすべての入力に従って適切に設定されているかチェックする場合に使用します。
protected virtual void DoInitialize()
この関数は、Solver を初期化し、その Solver が所有する IK チェーンをビルドします。Solver のターゲットや他のパラメーターの変更後に Solver が無効になったときに呼び出します。Solver が所有する IK チェーンなど、Solver に渡されたパラメーターのデータをすべて初期化する場合に使用します。
protected virtual void DoPrepare()
この関数は、トランスフォームの情報 (位置、回転、IK パラメーターなど) を揃えて、IK アルゴリズムによって使用できる構造体に変換します。IK の位置を更新する際に、Solver によって使用されるデータを収集する処理を行う場合に使用します。
protected abstract void DoUpdateIK(List effectorPositions)
この関数は、Solver が所有する各チェーンの Effector の位置のリストを基に、Solver が制御するトランスフォームの適切な IK の位置を計算して設定します。Effector の位置は、シーンビューで操作された場合、ユーザーの位置によってオーバーライドされることがあります。
protected virtual Transform GetPlaneRootTransform()
この関数は、ローカル空間の XY 平面が IK の計算に使用されているトランスフォームを返します、使用するトランスフォームを定義する場合に使用します。
IKChain2D
IK チェーンに関与しているトランスフォームを格納するクラスです。ターゲットとトランスフォームの数を使用してチェーンが設定されていると、Solver を初期化することで、チェーンに適切なトランスフォームが入力されます (有効な場合)。
Target- ターゲットの目的の位置として使用されるトランスフォーム。Effector- 目的の位置に到達するために IK を実行するトランスフォーム。TransformCount- ターゲットを始点として、IK の解に関与しているトランスフォームの数。通常は Solver のChainLengthと同等です。Transforms- チェーンに関与しているすべてのトランスフォーム。通常は、このうちの最後のトランスフォームがターゲットのトランスフォームになり、最初のトランスフォームがチェーンのルートのトランスフォームと見なされます。Lengths- チェーン内の各トランスフォーム間の長さです。
Solver2DMenu
この属性を利用すると、IKManager2D 下で、Solver2D に別の名前をタグ付けすることができます。Solver2D のクラス名を使用したくない場合に使用します。
例えば、メニューで LimbSolver2D に Limb という名前を付ける場合は、[Solver2DMenuAttribute("Limb")] とします。