# IKコンストレイント

<callout>IKコンストレイントはSpine Essentialでは利用できませんのでご注意ください。</callout>

IKコンストレイントは、ボーンの先端がターゲットボーンに接触または指し示すようにボーンの回転を設定できます。これには様々な用途がありますが、最も一般的な用途は、手や足を動かして四肢をコントロールすることです。

通常のアニメーションの方法は、FK、または「フォワード・キネマティクス」と呼ばれています。FKでは、手の位置を決めるために、まず上腕を回転させ、次に下腕を回転させるというトップダウンのアプローチをとります。この方法で実現できる動きもありますが、難しい動きもあります。例えば、スケルトンが立ち上がる際に手を固定するためには、腕のボーンを連続的に調整する必要があります。手を固定するために多くのキーが必要になってしまいます。

IK（インバース・キネマティクス）では、ボトムアップ方式を採用することで、よりエレガントにこれを解決することができます。例えば、手の位置を設定した後、Spineが上下の腕のボーンの回転を自動的に設定することができます。

![](/img/spine-user-guide/ik/ik.png)

IKは、歩行アニメーションの際に足が床を貫通しないようにしたり、ランタイムでIKターゲットを調整して凸凹の地面に立つようにしたり、[ニワトリ](/forum/viewtopic.php?f=8&t=2753)など、様々な作業に役立ちます。

使用例については、IKコンストレイントの[デモ](/spine-demos#Inverse-kinematics)、[プロジェクト例](/spine-examples#IK-Constraints)、[Tips](/spine-tips#IK-Constraints)をご覧ください。

# セットアップ

SpineのIKは、1本または2本のボーンを制約することができます。IKコンストレイントを作成するには、まず:

* ボーン1本で行う場合、制約するボーンを1本選択してください。IKコンストレイントを作成後、そのボーンはターゲットボーンを指すように回転するようになります。
* ボーン2本で行う場合、制約するボーンを選択し、その子ボーンも選択してください。IKコンストレイントを作成後、子ボーンの先端がターゲットボーンに当たるようにボーンが回転するようになります。

<callout>制約するボーンをクリックすると、先端にターゲットが作成され、制約されるボーンが動かないようにIKコンストレイントを作成できます。</callout>

次に、ツリーのプロパティで`New...(新規...)` `IK Constraint(IKコンストレイント)`を選択し、ターゲット選択モードに入ります。既存のボーンをクリックするか、何もないところをクリックして新しいボーンを作成し、ターゲットとなるボーンを選びます。制約するボーンをクリックすると、そのボーンの先端にターゲットが作成されます。ターゲットボーンはコンストレイントされたボーンの子孫にはなりません。

![](/img/spine-user-guide/ik/setup.png)

> 3本以上のボーンを制約することは、非決定的で制御が困難なためサポートされていません。代わりに、複数のIKコンストレイントまたはFKを使用してください。

# プロパティ

1つのボーンのIKの場合:

![](/img/spine-user-guide/ik/properties1.png)

2つのボーンのIKの場合:

![](/img/spine-user-guide/ik/properties2.png)

## 親

`Parent(親)`は最初に制約されたボーンを表示しています。クリックすると、そのボーンが選択されます。

鉛筆のアイコンをクリックすると、別のボーンを選択することができます。

## 子

<callout>このプロパティはボーン1本のIKの場合は空白になります。</callout>

`Child(子)`は2番目に制約されたボーンを表示しています。クリックすると、そのボーンが選択されます。

鉛筆のアイコンをクリックして別のボーンを選択したり、`X`ボタンをクリックして子ボーンを消去することができます。

## ターゲット

`Target(ターゲット)`はターゲットとなるボーンを表示しています。クリックすると、そのボーンが選択されます。

鉛筆のアイコンをクリックすると、別のボーンを選択することができます。

## 正

<callout>このプロパティはボーン2本のIKの場合だけ使用できます。</callout>

`Positive(正)`にチェックすると、子ボーンは親ボーンに対して正方向（反時計回り）に回転します。

![](/img/spine-user-guide/ik/bend-direction.png)

この曲げ方向プロパティは[キーにする](/spine-keys#IKコンストレイント)ことができます。

## 圧縮

<callout>このプロパティはボーン1本のIKの場合だけ使用できます。</callout>

`Compress(圧縮)`は、ターゲットボーンまでの距離が制約されたボーンの長さよりも小さい場合に、制約されたボーンを小さくスケーリングします。

この圧縮プロパティは[キーにする](/spine-keys#IKコンストレイント)ことができます。

## ストレッチ

`Stretch(ストレッチ)`は、ターゲットボーンまでの距離が制約されたボーンの長さよりも大きい場合に、制約されたボーンを大きくスケーリングさせます。

このストレッチプロパティは[キーにする](/spine-keys#IKコンストレイント)ことができます。

ボーン2本のIKと併用した場合の制限:

* 子ボーンのローカルYトランスレートは0に設定されます。
* [ソフトネス](#ソフトネス)が0よりも大きい場合、ストレッチは適用されません。
* ストレッチは、親ボーンが不均一なローカルスケールを持っている場合には適用されません。

![](/img/spine-user-guide/ik/stretch-gif.gif)

## 統一

`Uniform(統一)`がチェックされていて、かつ[圧縮](#圧縮)か[ストレッチ](#ストレッチ)が使用されている場合、ボーンがX軸とY軸の両方で同じようにスケーリングされるようになります。

![](/img/spine-user-guide/ik/stretch-uniform-gif.gif)

## ソフトネス

<callout>このプロパティはボーン2本のIKの場合だけ使用できます。</callout>

`Softness(ソフトネス)`は、制約されたボーンがまっすぐになるときに、ボーンの動きを遅くします。ソフトネスが0の場合、IKボーンはターゲットが範囲外になる直前に非常に速く動いてしまうことがありますが、これは通常望ましくありません。

ソフトネスの値は、ボーンがまっすぐになるとスローダウンし始めるボーンの最大到達点からのターゲットボーンの距離を表しています。ターゲットがボーンの最大到達距離を超えて動くまで、ボーンは完全にはまっすぐになりません。

このソフトネスプロパティは[キーにする](/spine-keys#IKコンストレイント)ことができます。

![](/img/spine-user-guide/ik/softness-gif.gif)

## ミックス

`Mix(ミックス)`については[コンストレイントのミックス](/spine-constraints#ミックス)をご覧ください。ミックスプロパティは[キーにする](/spine-keys#IKコンストレイント)ことができます。

多くの場合、FKとIKの混合は、アニメーション中に0(FKのみ)と100(IKのみ)の間を行き来するために一時的に必要なだけです。しかし、状況によっては、FKとIKの混合を利用して、キーにするのが困難な複合的なモーションを実現することができます。例えば、IKで腕を上下に少し揺らしながら、FKで別のアニメーションを行うような場合です。

ミックスが0以上100以下の場合、ターゲットとなるボーンを動かすと、回転が急に反対方向になってしまうことがあります。これは、ボーンの回転とコンストレイントの回転の間の補間が、最も短い回転方向を使用するために起こります。

ボーン2本のIKでは、ミックスが0より大きく、親ボーンが不均一なローカルスケールを持っている場合、子ボーンのローカルYトランスレートは0に設定されます。

# 制限事項

IKと[ボーンのトランスフォーム](/spine-bones#ボーンのトランスフォーム)の相互作用のため、いくつかの小さな制限が適用されます:

* ターゲットボーンは、制約されるボーンの子にはできません。
* ボーン2本のIKの場合:
  * 子ボーンは、親ボーンの直下の子でなければなりません。
  * 継承する回転、スケール、シアーを無効にすることは、どちらの制約されたボーンにもできません。
  * 親IKボーンのローカルシアーは0に設定されます。
  * ミックスが0より大きく、親ボーンが不均一なローカルスケールを持っている場合、子ボーンのローカルYトランスレートは0に設定されます。
  * ストレッチでは、子ボーンのローカルYトランスレートが0に設定されます。
  * ストレッチは、ソフトネスが0よりも大きい場合は適用されません。
  * ストレッチは、親ボーンが不均一なローカルスケールを持つ場合には適用されません。

# ビデオ

[youtube:sos36zmLFOc&list=PLwGl7Ikd_6GRFo7d0uRu_fN2RIlvkxW7b]

[次: パス・コンストレイント](/spine-path-constraints)
[前: コンストレイント](/spine-constraints)
[Spine ユーザーガイド: 目次]