IK ソルバ
 
 
 

IK ソルバは、IK ハンドルの背後にある数学的アルゴリズムです。IK ハンドルによって制御されるジョイント チェーンに属するすべてのジョイントの回転を計算します。ジョイント チェーンに対する IK ハンドルの作用は、IK ハンドルが使用する IK ソルバの種類によって異なります。デフォルトで、Maya は起動時に次の IK ソルバをロードします。

デフォルト ソルバに加えて、以下のソルバを作成できます。

ジョイント数が 2 ~ 4 個のジョイント チェーンのポーズを設定し、アニメートするには、シングル チェーンまたは回転プレーン IK を使用します。長いジョイント チェーンのポーズを設定し、アニメートする場合は、スプライン IK を使用します。ゲームに使用する単純な 3 ジョイント IK チェーンのポーズを設定し、アニメートする場合は、2 ボーン IK を使用します。

デフォルトでは、作成したすべての IK ハンドルは、同じタイプの IK ソルバを使用するとともに、同じ IK ソルバ ノードを共有します。たとえば、シングル チェーン IK を使用するすべての IK ハンドルも、同じ ikSCsolver ノードにコネクトします。したがって、共有 IK ソルバ ノードのアトリビュートを編集すると、ノードにコネクトするすべての IK ハンドルがその影響を受けます。他の IK ハンドルに影響を及ぼさずに、特定の IK ハンドル用の IK ソルバだけを微調整する場合は、createNode MEL コマンドを使用して、IK ハンドル用の追加 IK ソルバを作成することができます。

IK ソルバの計算

IK ハンドルを移動する場合、ソルバは適切な計算を行って、それに応じて IK チェーン内の全ジョイントを移動し、回転させます。ソルバは、最初に IK ハンドルの位置(移動 XYZ の各アトリビュート)と方向(回転 XYZ の各アトリビュート)を参照します。次に、ソルバは、エンド エフェクタの位置を可能な限り IK ハンドルの位置と方向の近くに移動する方法を計算します。そのために、ソルバはどのように IK ハンドルのジョイント チェーン内にあるジョイントを回転するのが最適かを計算します。最後に、ソルバは、エンド エフェクタが IK ハンドルの位置と方向に到達するように、ジョイント チェーン内の全ジョイントを回転させます。

シングル チェーン ソルバ

シングル チェーン IK ハンドルは、シングル チェーン ソルバを使用して、IK チェーン内の全ジョイントの回転を計算します。また、ジョイント チェーンの全体の方向は、直接シングル チェーン ソルバによって計算されます。

シングル チェーン IK ハンドルと回転プレーン IK ハンドルの違い

シングル チェーン IK ハンドルと回転プレーン IK ハンドルの違いは、シングル チェーン IK ハンドルのエンド エフェクタが IK ハンドルの位置と方向に到達しようとするのに対して、回転プレーン IK ハンドルのエンド エフェクタは IK ハンドルの位置のみに到達しようとすることです。回転プレーン IK ハンドルのエンド エフェクタは、IK ハンドルの位置のみに到達しようとするため、その結果生じるジョイントの回転を容易に予想することができます。回転プレーン IK ハンドルの場合、ジョイント チェーン全体の方向はツイスト ディスク マニピュレータによって制御されます。詳細については、 ツイスト ディスクおよび 回転プレーン ソルバを参照してください。

注:ジョイント チェーンにフリッピングの問題がある場合は、シングル チェーン ソルバの代わりに、回転プレーン ソルバを使用します。回転プレーン ソルバは、シングル チェーン ソルバで発生することがある IK チェーンのフリッピングを制御するために、極ベクトルとともに導入されました。

シングル チェーン IK ハンドルのコンポーネント

詳細については、 一般的な IK ハンドルのコンポーネントを参照してください。

回転プレーン ソルバ

回転プレーン IK ハンドルは、回転プレーン ソルバを使用して、IK チェーン内の全ジョイントの回転を計算しますが、ジョイント チェーンの全体の方向は計算しません。代わりに、IK 回転プレーン ハンドルは、IK ソルバによって計算された方向を使用せずに、極ベクトルとツイスト ディスクを使用してジョイント チェーン全体の方向を直接制御します。シングル チェーン ソルバと回転プレーン ソルバの違いはこの点です。詳細については、 シングル チェーン IK ハンドルと回転プレーン IK ハンドルの違いを参照してください。

回転プレーンは、同じプレーンで静止させたいジョイント チェーン(腕や脚など)のポーズ設定に適しています。たとえば、回転プレーン IK ハンドルが駆動する腕の肩、肘、手首の関節は、肘が回転する同じプレーン内にとどまります。プレーン自体は、極ベクトルによって肩の関節で回転します。詳細については、 極ベクトル ツイスト ディスクを参照してください。

回転プレーン IK ハンドルのコンポーネント

ツイスト ディスク

ツイスト ディスクは、ジョイント チェーンをツイストまたは回転するために使用するマニピュレータです。ツイスト ディスクは、IK チェーンの終了ジョイントにあります。

極ベクトルの移動によって、IK チェーンが間違った方向を示したままになる場合があります。極ベクトルの移動後、フリップしないようにするために、ツイスト ディスクを使用して、プレーンの方向を変更することができます。ツイスト ディスクのイメージを表示する場合は、 回転プレーン ソルバを参照してください。

ジョイント チェーン プレーン

ジョイント チェーンの全ジョイントを含み、軸を使用してポーズを設定するプレーンがジョイント プレーンです。ジョイント チェーン プレーンは、ハンドル ベクトルの回りで回転します。極ベクトルを操作する場合は、ハンドル ベクトルの回りでジョイント チェーン プレーンを回転させます。ジョイント チェーン プレーンのイメージを表示する場合は、 回転プレーン ソルバを参照してください。

リファレンス プレーン

ジョイント チェーン プレーンを使用してジョイント チェーンの回転とツイストを行う場合は、ツイストの度合いを測定できるように、プレーンを別の特定なプレーンを基準にして回転させる必要があります。ジョイント チェーン プレーンを回転するときの相対的な基準となるプレーンをリファレンス プレーンと呼びます。リファレンス プレーンのイメージを表示する場合は、 回転プレーン ソルバを参照してください。

極ベクトル

極ベクトルは、IK チェーンの方向を変更することができるマニピュレータです。また、極ベクトルを使用して、フリッピングを制御することができます。

極ベクトルを移動するとリファレンス プレーンの方向が変更されるので、極ベクトルを移 動してジョイント チェーンの方向を直接変更することもできます。ツイスト ディスクを操作するだけで、ジョイント チェーンの方向を変更することができます。これは、ジョイント チェーンの方向の度合い、— またはツイスト — が、リファレンス プレーンとジョイント チェーン プレーンの方位差として定義されているからです。極ベクトルのイメージを表示する場合は、 回転プレーン ソルバを参照してください。

警告:IK ハンドルの配置時に、ハンドル ベクトルと極ベクトルが交差するか、全く正反対の方向を示すと、ジョイント チェーンが突然逆転することがあります。ハンドル ベクトルと交差しないように、または反対方向を向かないように極ベクトルを移動すると、この逆転を防止することができます。

回転ディスク

回転ディスクは、ツイスト ディスクによって IK チェーンが回転した度合いを示すインディケータです。回転ディスクは、IK チェーンの開始ジョイントにあります。回転ディスクのイメージを表示する場合は、 回転プレーン ソルバを参照してください。

リファレンス プレーン インディケータ

リファレンス プレーン インディケータは、極ベクトルの移動を反映して移動する回転ディスク上に緑色のドットとして表示されます。

ツイスト インディケータ

ツイスト インディケータは、回転ディスク上のリファレンス プレーン インディケータとジョイント チェーン プレーン インディケータ間に緑色の円弧として表されます。ツイスト インディケータは、ジョイント チェーンの方向をリファレンス プレーンを基準にした相対位置で表示します。

ジョイント チェーン プレーン インディケータ

ジョイント チェーン プレーン インディケータは、ジョイント チェーン プレーンの方向をリファレンス プレーンに対する相対位置で表示します。ジョイント チェーン プレーン インディケータは、回転ディスク上に表示されます。

スプライン IK ソルバ

スプライン IK ハンドルでは、NURBS カーブを使用して、ジョイント チェーンのポーズを設定することができます。カーブを操作すると、ハンドルのスプライン IK ソルバは、それに応じてチェーン内のジョイントを回転させます。スプライン IK を使用して、尾、触手、蛇のような長い、しなやかなジョイント チェーンのポースを設定し、アニメートすることができます。

スプライン IK ハンドルの操作に関するヒントも参照してください。

スプライン IK ハンドルのコンポーネント

ツイスト ディスク

詳細については、 ツイスト ディスクを参照してください。

ロール ディスク

ロール ディスクは、スプライン IK ジョイント チェーン全体をローリングまたは回転するために使用するマニピュレータです。ロール ディスクは、常にスプライン IK ハンドルの開始ジョイントにあります。ロール ディスクは、回転ディスクと極ベクトルに似ています。詳細については、 一般的な IK ハンドルのコンポーネントを参照してください。

高度なスプライン IK コントロール

高度なツイスト コントロール(Advanced Twist Controls)アトリビュートを使用して、チェーン内のジョイントのローカル回転を、固定ワールド空間のベクトルにコンストレインすることができます。このベクトルは、スプライン IK の NURBS カーブの方向です。たとえば、高度なツイスト コントロール(Advanced Twist Controls)を使用して、蛇のキャラクタ、二足歩行のキャラクタの脊椎、またはコイルのスプリングの動きを安定させることができます。また、チェーンに沿ったツイストを微調整して、ツイスト アトリビュートによって、ジョイントにさらにツイストを追加することができます。

追加ツイストを適用する前に、ジョイントのアップ軸を固定ワールド軸にアラインすることにより、以前よりも容易に予想でき、また安定した結果を得ることができます。

詳細については、 高度なスプライン IK ツイスト制御を使用する 高度なツイスト コントロール(Advanced Twist Control)アトリビュートを参照してください。

注:高度なツイスト コントロール(Advanced Twist Control)アトリビュートは、IK ハンドルが ikSplineSolver を使用する場合にのみ適用されます。

スプライン IK を持つ IK ハンドルでは、NURBS カーブを使用して、ジョイント チェーンのポーズを設定することができます。スプライン IK カーブを操作して、ターゲット IK チェーン内の全ジョイントを移動し、回転させます。スプライン NURBS カーブを簡単に操作する方法は、各カーブの CV に対してクラスタ デフォーマを作成することです。詳細については、『NURBS モデリング』マニュアルの「 カーブの編集 > 選択 > クラスタ カーブ(Edit Curves > Selection > Cluster Curve)」を参照してください。

スプライン IK ハンドルは、尾、触手、首、脊椎、および類似のオブジェクトの長いジョイント チェーンをポーズ設定し、アニメートするのに適しています。

開始ジョイントのフリッピング

スプライン IK ジョイント チェーンの開始ジョイントは、スプライン IK カーブやその CV を移動または回転したとき、またはカーブに沿ってジョイント チェーンをスライドさせたときに、逆転(フリッピング)する場合があります。フリッピングは、スプライン IK ソルバによる計算の正常な結果です。

ジョイントのフリッピングは、ジョイントの方向を回転値 0 から 90 度以上回転させたときに発生します。ジョイントの回転値が 0 となるのは、ジョイントの回転 X(Rotate X)回転 Y(Rotate Y)回転 Z(Rotate Z)値が(親ジョイントの回転値を基準にして)ゼロになるような位置です。フリッピングは、ジョイントがほぼ 180 度回転したときに最も顕著になります。

開始ジョイントをほぼ静止位置に配置してから個々のジョイントを移動すると、開始ジョイントが逆転(フリッピング)することを防止できます。詳細については、 スプライン IK チェーンでのフリッピングを防止するを参照してください。

たとえば、モーション パスに沿ってヘビを動かすときなどカーブに沿ってジョイント チェーンをアニメートするときにも、不要なフリッピングが発生する可能性があります。

ジョイントを適切に配置してもフリッピングが発生する場合は、開始ジョイントを別のジョイントまたはトランスフォーム ノードの子ジョイントにしてください。詳細については、 ルート軸の自動作成(Auto Create Root Axis) カーブの自動ペアレント化(Auto Parent Curve)を参照してください。

2 ボーン ソルバ

2 ボーン IK ソルバは、回転プレーン IK ソルバのサブセットです。したがって、2 ボーン ソルバを持つ IK ハンドルは、回転プレーン IK ハンドルと同じ方法でジョイント チェーンの回転を解決します。詳細については、 回転プレーン ソルバ 回転プレーン IK ハンドルのコンポーネントを参照してください。

2 ボーン IK ハンドルは、2 つのボーンと 3 つのジョイントからなる短いジョイント チェーンのポーズを設定し、アニメートするためのツールです。2 ボーン IK ハンドルを持つ長いジョイント チェーンのポーズを設定し、アニメートしようとする場合、2 ボーン ソルバは開始ジョイントと最後から 2 番目のジョイントの回転だけを解決し、ジョイント チェーン内の他の全チェーンを無視します。

2 ボーン ソルバは、同じプレーンで静止させたいジョイント チェーン(腕や脚など)のポーズ設定に適しています。たとえば、回転プレーン IK ハンドルが駆動する腕の肩、肘、手首の関節は、肘が回転する同じプレーン内にとどまります。プレーン自体は、極ベクトルによって肩の関節で回転します。詳細については、 極ベクトルを参照してください。

2 ボーン ソルバは、Maya で最速の IK ソルバです。このため、2 ボーン IK ハンドルはゲーム開発環境でキャラクタを作成するのに適しています。Maya には 2 ボーン IK ソルバのプラグイン ソース コードが含まれているので、ゲーム開発者は、この機能の正確な動作をゲーム エンジン内で再現したり、コードを修正して開発者自身のカスタム IK ソルバを作成することができます。

IK 2 ボーン ソルバ プラグインのソース コード

2 ボーン IK ソルバのソース コードは、devkit の ik2Bsolver ディレクトリにあります。このソース コードは、ユーザが独自の IK ソルバ プラグインを作成するときの適切なサンプルになります。また、主要なアルゴリズムを抽出して利用すると、ゲーム エンジン内で 2 ボーン IK ソルバの動作を正確に再現することができます。詳細については、ik2Bsolver ディレクトリ内の README ファイルを参照してください。

マルチチェーン ソルバ

マルチチェーン ソルバは、複数の IK ハンドルを同時に解決することができます。マルチチェーン IK ハンドルを使用して、タコのキャラクタの触手のような複雑なモーションをアニメートすることができます。

マルチチェーン ソルバを持つ IK ハンドルは、シングル チェーン IK ハンドルと同じ方法で、ジョイント チェーン内のジョイントを管理します。詳細については、 シングル チェーン ソルバを参照してください。

注:IK ハンドルの優先順位(Priority)ウェイト(Weight)アトリビュートは、マルチチェーン IK ソルバにのみ適用されます。 ヘルプ > ノード & アトリビュート リファレンス(英語)(Help > Node and Attribute Reference)ikMCsolver を参照してください。

関連項目

スプリング IK ソルバ

スプリング IK ソルバ(ikSpringSolver)は、すべてのジョイント間で均等な回転を実現します。これは、昆虫の足のような多数のジョイントをもつ手足にポーズ設定してアニメートする場合に便利です。

springIKinsect.mov

スプリング IK ソルバは、角度にバイアス値を適用することにより、そのジョイント チェーン内のジョイント間の角度を均等に維持します。これにより、すべてのジョイント間の角度が常に均等に分散されます。スプリング IK ソルバは、どちらも IK ハンドルが極ベクトルを持つという点で、回転プレーン IK ソルバに似ています。スプリング IK ハンドルは極ベクトルを持つため、スプリング IK ジョイント チェーンが極ベクトルに交わるとフリッピングが発生します。

スプリング IK ソルバを使用する IK ハンドルはレスト ポーズを必要とします。デフォルトでは、ターゲット ジョイント チェーンの位置と方向はスプリング IK ハンドルの作成時にはレスト ポーズとなります。レスト ポーズでのスプリング IK ジョイント チェーンの最初と最後のジョイント間の距離により、ジョイント チェーンを曲げる伸ばすか決められ、個々のジョイントの動きに影響を与えます。

関連項目