HI ソルバの基本要件は、ソリューションが履歴に依存しないことです。つまり、ソリューションはゴールなどの付随的なパラメータの現在の状態のみに基づかなければなりません。
単一のチェーンに位置のゴールを指定する場合、明白な自由度が維持されます。この自由度の量を表す際に、ターン角度が使用されます。
1. 開始関節
2. エンド エフェクタ
3. EE 座標軸
すべての関節が通過する平面を「ソルバ平面」と呼びます。関節が平面上にない場合は、その平面は(A)開始関節と終了関節が通過している平面で、(B)特定のシーンにあるその他の関節に最も近い平面です。
ターン角度は、ソルバ平面の自由度を表しており、開始関節のみ制限します。
数量の点からソルバ平面を説明するには、0 (ゼロ)の意味を理解する必要があります。エンド エフェクタの位置を指定した場合、ゼロ(ソルバ)平面はどこになるでしょうか。ゼロ平面マップは引数として EE 軸をとり、ゼロ平面に対する法線を生成します。
IK システムを使用すると、ソルバのプラグインごとにそれぞれ独自のゼロ平面マップを定義できます。独自のゼロ平面マップを定義しない場合は、既定のマップが提供されます。
ゼロ平面マップに対する引数は、EE 軸の方向を指定する単位ベクトルです。また、エンド エフェクタが EE 軸に沿ってスライドするとき、ソルバ平面は固定されていなければなりません。したがって、ゼロ平面マップは球体上のベクトル フィールドを定義します。球体上にポイントが指定されると、ゼロ平面に対する法線として解釈される接線単位ベクトルが生成されます。
1. ゼロ平面に対する法線
1 つの球体上に連続するベクトル フィールドは存在しないということは数学的な事実です。いくら試してみても、隣接するベクトルが劇的に変化する球体上には、常に 1 つしかポイントは存在しません。このポイントが、エンド エフェクタ軸が近づいたときにソルバ平面が反転する場所です。
その理由の 1 つは、履歴に依存しないためには、固定ベクトルをこの単一ポイントに割り当てる必要があるからです。もう 1 つの理由は、たとえベクトルを割り当てても、隣接するポイントに割り当てられたベクトルと著しく異なるベクトルになるからです。
ゼロ平面マップを定義するために、球体の参照フレームを定義する必要があります。この参照フレームが関節チェーン自体の本質です。
球体は、中心、水平平面、および子午線(経度 0 度)によって定義されます。中心は開始関節に割り当てられます。
すべての関節角度が設定角度であるときのポーズが特に重要です。このポーズを設定ポーズと呼びます。
この設定ポーズでのソルバ平面を水平平面として使用します。開始関節の制御にはターン角度が使用されるので、開始関節の設定角度はそれほど本質的ではありません。また、開始関節と設定角度にゼロを割り当てることによって生成されるソルバ平面を使用して、他の関節に水平平面を定義することもできます。
EE 軸が子午線を定義します。球体は、次の図で示すように定義されます。
1. EE 座標軸
すべての関節が設定角度であるとします。この球体にゼロ平面マップを定義します。
独自のゼロ平面マップを定義するプラグイン ソルバの API は、実際に EE 軸と法線を設定ポーズのソルバ平面に使用します。
virtual const IKSys::ZeroPlaneMap* GetZeroPlaneMap(const Point3& a0, const Point3& n0) const
a0 と n0 は、それぞれ設定ポーズの EE 軸とソルバ平面です。オブジェクト ZeroPlaneMap は、平面法線を球体の各ポイントに割り当てる関数です。
プラグイン ソルバがゼロ平面マップを提供していない場合、IK システムが既定のゼロ平面マップを提供します。IK ソルバ自体はプラグイン ソルバとして実装されています。提供されるマップは次のルールに従って定義されています。
ゼロ平面に対する既定の法線の生成
当然、この方法は北極または南極には使用できません。北極と南極は特別なポイントです。EE 軸が北極および南極を越えて移動すると、法線の方向が突然変わります。法線はユーザの視点から反転します。
通常、設定ポーズはソルバが初めて割り当てられたときのものです。したがって、関節が配置されている平面は水平平面に対応しています。ルール A は、必ず平面上でゴールを移動した場合にチェーンが平面上にとどまるようになっています。
ルール B は、赤道に垂直な大きい円に沿ってゴールを移動するとき、チェーンは常に垂直です。ただし、ゴールがマップの特別なポイントである北極、および南極を通過する場合を除きます。
ここまでは、ワールド全体が IK 要素のみで構成されているかのように説明してきました。実際には、IK チェーンとゴールは別々の変換階層のポイントにある場合があります。最後に、ワールド内で説明してきたエンド エフェクタの位置を、球体上のポイントにマップする必要があります。球体がエンド エフェクタの位置に対してどのように置かれているかによって、緯度と経度の読み方が異なります。この球体が配置されることになる親変換スペースを、「ターン角度の親スペース」と呼びます。また、状況がはっきりしている場合には、「親スペース」と呼びます。
親スペースは、IK パラメータが不変である必要があります。現在、2 つの選択肢があります。
開始関節とゴールの両方がワールドに直接ルート付けされている場合、親スペースの選択は影響しません。次の例では、開始関節はオブジェクト A を親にしています。
IK チェーンは、開始関節を経由してオブジェクト A を親としています。
このポーズが、IK ソルバが割り当てられたときのポーズだとします。したがって、これが設定ポーズです。関節がある平面は、球体の水平平面(ゼロ平面マップ)です。
次の例では、IK ソルバが割り当てられたときに、親スペースに回転が存在する場合を考えます。
IK ソルバが割り当てられたとき、IK チェーンの親スペースに回転が存在します。
親 A は 90 度の回転を含んでいます。これは、ユーザが 4 つのボーンを IK ソルバを割り当てずに作成した後で、Bone2 から Bone4 に IK ソルバを割り当てる場合などです。チェーンの親を直接ワールドにすると、右の図のように見え、ソルバ平面は水平になります。
B の問題点は、右の図の様子がユーザに見えないことです。反転を理解するには、この図を想像しなければなりません。
例 3 では、開始関節を再割り当てした場合について説明します。4 つのボーン ノードの IK チェーンがあるとします。
1. Bone01
2. Bone02
3. Bone03
4. Bone04
開始関節が Bone01 で、終了関節が Bone04 です。図で示したポーズが設定ポーズで、Bone01 に回転が含まれているとします。Bone02 の親を直接ワールドにすると、Bone02 からの階層は右の図のように見えます。
開始関節を Bone02 に再割り当てすると、ゼロ平面マップの球体は右の図の設定に基づきます。
Bone02 から Bone04 のソルバまたはゴールを削除して新しく割り当てる場合は、チェーンが反転しません。なぜでしょうか。それは、開始関節の割り当ては IK チェーンまたはゴールの新規作成とは異なるからです。開始関節は、たくさんある IK パラメータのうちの 1 つです。開始関節を再割り当てするのは、任意のパラメータを修正するのとまったく同じことです。その際、他のパラメータは変更されません。特に、開始関節の再割り当てによってターン角度は変更されません。
IK チェーンまたはゴールの新規作成はこれとは異なります。パラメータを調整して関節チェーンを必ず固定するようにします。特に、ターン角度はソルバ平面がビューポート内で静止するような値に設定されます。