Search Unity

以前掲載したUnity の 2D Animation パッケージに関するブログ記事をご覧になった方の中には、新しいインバースキネマティクスのパッケージがプロジェクトでどのように使えるかに興味がある方もいらっしゃると思います。この記事では、IK の背景にある基本的な考え方と、Unity でのセットアップについてまとめました。

パッケージを入手する

以前お伝えした通り、2D IK は独立したエディターパッケージとしてリリースされ、2D Animation パッケージと同様、パッケージマネージャーから入手することができます。

インバースキネマティクスの基本

インバースキネマティクスを理解するには、まずそれがフォワードキネマティクスを逆にしたものであることを理解する必要があります。フォワードキネマティクスとは、ワールド空間の特定の位置を目指して、各ボーンを手動で移動・回転させる伝統的なプロセスのことです。インバースキネマティクスの背景にある考え方は、複数のボーンのトランスフォームをひとつながりのもの(チェーン)として考えて、各トランスフォームを動かすアルゴリズムを適用し、終端のボーンを目標の位置に可能な限り近い位置に動かそうというものです。

インバースキネマティクスはさまざまなアニメーションのシナリオにおいて便利なツールです。インバースキネマティクスを使うと、たとえば、でこぼこの地面の上でも確実にキャラクターの足が地面の一番上の部分に着くようにしたり、キャラクターがオブジェクトをつかむ様子をシミュレーションしたりすることが可能になります。また、アニメーションのサイクルのデザインやプロトタイプをするとき、インバースキネマティクスを使うとボーンの位置決めを簡単にすることができます。

このブログ記事では、2D Animation の記事で使ったものと同じバイキングのキャラクターのリグ付きスプライトを使って、そちらの記事では説明できなかった部分をとりあげます。ボーン付きのリグで IK を使うには、まず IK Manager 2D コンポーネントを一番上の階層にあるオブジェクトに追加します。ここでは、Sprite Skin コンポーネントが付いた、リグ付きスプライトのゲームオブジェクトに追加することになります。代わりに、リグのルートボーンに IK Manager 2D コンポーネントを追加しても構いません。IK マネージャーでは、その下のほうにある [+] ボタンと [-] ボタンで、オブジェクトに適用する様々な種類の IK ソルバーを追加したり削除したりすることができます。

IK ソルバーの追加

先に進む前に、読者の皆さまを置いてきぼりにしないように、このブログ記事でインバースキネマティクスについて説明するときに使われる専門用語をおさらいしておきます。

まず「IK チェーン」とは、互いに親子関係にあり、IK アルゴリズムの影響を受けるボーンの集まりのことです。IK チェーンの例としてはキャラクターの腕や脚が挙げられますが、チェーンの終端のボーンと根元のボーンの間にはボーンをいくつでも入れることができるので、手足以外にも様々な部分に IK チェーンを適用できます。たとえば、腕のボーンを 1 つのチェーンに入れると同時に、キャラクターの背骨の一部をなすものとして扱うこともできるのです。

「エフェクター」とは、IK チェーンの終端のボーン、あるいは最後の子ボーンのことです。IK のアルゴリズムの目的は、エフェクターをできるだけ目標の位置に近づけることです。エフェクターの例としては、手首のボーンや、細かく作りこまれたスケルトンの指のボーンが挙げられます。

「ターゲット」または「ゴール」とは、アルゴリズムを適用してエフェクターを到達させる、ワールド空間での目標位置のことです。たとえば、キャラクターに武器オブジェクトを握らせたいときは、武器オブジェクトの位置をゴールとして使います。

ここで、ユースケースに最適な IK ソルバーを見定める必要があります。ここで、「IK ソルバー」とは、エフェクターがターゲットの位置に到達するか、反復回数の上限に達するまで IK チェーン内のボーンを回転させるために使うアルゴリズムを指します。すでに様々な IK アルゴリズムが存在していますし、もちろん、自分でカスタムのアルゴリズムを書くこともできます。Unity の IK パッケージは、デフォルトでよく使われる 3 つのタイプのソルバーを搭載しています。そのため、IK のセットアップが非常に簡単です。

1 つ目は CCD(Cyclic Coordinate Descent:循環座標降下)ソルバーです。これはゲームで使われる IK アルゴリズムの中では最もポピュラーなものの 1 つです。エフェクターのある側のチェーンの端から始めて、チェーン内のすべてのボーンに反復処理を行う方法で、反復処理において各ボーンを回転させ、ターゲットにできるだけ近づけていきます。反復処理はエフェクターがターゲットに到達するか、反復処理の回数の上限に達するまで繰り返されます。

CCD ソルバーをセットアップするには、まず CCD ソルバーを IK Manager コンポーネントに追加します。追加すると、ヒエラルキーで「New CCDSolver2D」がスプライトのオブジェクトの子になっていることが確認できます。この状態になると、CCD ソルバーの振る舞いと、ソルバーが影響するボーンを設定することができます。IK をバイキングの腕に追加する方法を見ていきましょう。追加するには、腕のチェーンの最後のボーンを選択し、ヒエラルキーで空のトランスフォームのオブジェクトを新しく作ります(右クリックして Create Empty)。新しいオブジェクトは自動的にボーンの子になります。このトランスフォームをつかんで、手首のボーンの先に移動させられます。このオブジェクトは、ターゲットとエフェクターの両方の役割を持ちます。

 

新しく追加した CCD ソルバーを選択して、さらにいくつか設定するべき項目があります。まず、Target と Effector にゲームオブジェクトを割り当てるオプション項目です。先ほど作成した空のゲームオブジェクトをつかんで、Target フィールドにそれをドラッグします。ここで設定したゲームオブジェクトは、IK チェーンの終端のトランスフォームとして振る舞い、ゴールに近づくようにキャラクターの手首のボーンの先を回転させます。

次に、IK ソルバーで処理するチェーンの長さを割り当てます。スライダーをドラッグすると、黄色のギズモがスケルトンのパーツに沿って出現し、チェーンを構成していきます。ここではチェーンの長さを 4 にしました。手首の先のトランスフォームから、手首のボーン、前腕と上腕のボーンまでをチェーンに含めることになります。チェーンの設定を適切に行ったら、Create Effector ボタンをクリックし、IK チェーンの到達目標となるトランスフォームを自動的に生成することが可能になります。

 

設定はこれで終わりです。新しい IK のギズモがバイキングの手の部分に表示され、ターゲットを変更すると、それに反応して IK の解も変化することがわかります。

CCD ソルバーにはこれらの他にも設定項目があります。順に見ていきましょう。

Iterations は、ゴールに到達するまでにアルゴリズムを反復して適用する最大の回数を設定する項目です。多くのソルバーは反復アルゴリズムによって動いているため、ゴールが到達不可能な位置にある場合を考慮して反復回数に上限を設ける必要があります。IK をランタイムで使う場合は、反復回数をごく小さくしておくと良いでしょう。しかし、アニメーションの中の位置決めにしか使わないならば、アニメーションの記録中は反復回数を必要なだけ大きくとると良いでしょう。

Tolerance は、エフェクターとゴールがこの距離よりも近づけば、IK アルゴリズムの処理が完了したとみなす最大の許容距離を設定する項目です。

Velocity は、アルゴリズムの反復処理が 1 度行われるたびに加えられる回転の大きさを設定する項目です。一般的に、Velocity の値を大きくするとより早くゴールに到達するようになります。

最後に、Weight は IK の解を適用する全体の強度を設定します。この項目はさらに IK マネージャーコンポーネントにあるグローバルの Weight の設定にも影響を受けます。

キャラクターの手首の先を IK で回転させず、腕を特定の位置に持ってくるためだけに IK を使いたい場合は、手首のボーンを Target フィールドに設定し、手首のボーンを元にエフェクターを作成すると良いでしょう。または、Constrain Rotation チェックボックスをオフにして、ボーンの位置を手動で決められるようにしたり、エフェクターを回転させられるようにしても良いと思います。

 

2D IK パッケージには他にも、特にヒューマノイドのキャラクターをアニメーション化するときに役立つ、Limb ソルバーと呼ばれる IK ソルバーも搭載されています。これは、3 つのトランスフォームからなるチェーンのみに適用するよう修正した CCD アルゴリズムです。手足の位置を決める場合に最適なアルゴリズムであり、手足をおかしな方向に向けてしまう IK の計算結果を「反転(flip)」させるオプションもあります。しかし、CCD アルゴリズムほど豊富なカスタマイズのオプションは備えていません。

 

FABRIKForwards And Backward Reaching Inverse Kinematics:前方後方到達インバースキネマティクス)ソルバーも搭載されています。このアルゴリズムでは、まずチェーンを逆方向にたどり、それから、逆方向にたどる処理中に得たポイントに対して正しい長さを適用しつつ、ヒエラルキーの一番上のボーンから順方向にチェーンをたどって IK の計算を行います。FABRIK は一般的に、CCD よりも少ない反復回数でターゲットに到達することができますが、チェーンに回転の制約がかけられている場合は、1 回の反復処理が CCD よりも遅くなります。

インバースキネマティクスや CCD アルゴリズムの仕組みについてさらに知りたい方は、3D における IK や CCD アルゴリズムについて、James Bouckley が Unite Berlin 2018 で行った講演の動画をご覧ください。James はこの講演で、元の CCD アルゴリズムに対する修正のアイデアも示しています。

前述したように、カスタムの 2D ソルバーを書いたり、パッケージに搭載されている既存のソルバーを基にして、新たなソルバーを開発することが可能です。こうした話題についてさらに知りたい方は、GitHub のプレビュー版のドキュメントをご覧ください。独自のソルバーを開発する方法について良いアイデアを得られると思います。

違う種類のソルバーが 2 つ、同じボーンに影響するような状況では、ソルバーが使われる優先度は IK Manager 中でのソルバーの並び順で決まるということは覚えておいてください。リストの上にあるほど、ソルバーの優先順位が上がります。

また、重要事項として、IK ソルバーを削除しても、オブジェクトに対してアニメーションのキーフレームを設定していない場合は、デフォルトの位置はオブジェクトに戻らず、破壊的な変更となることを覚えておいてください。IK の解の影響をキャンセルしたい場合は、Restore Default Pose を選択して、ボーンを IK が適用される前の位置に戻す必要があります。この操作を行えば、IK ソルバーを安全に削除することができます。

アニメーションにおける IK の利用

アニメーションクリップで IK を使う場合に、IK エフェクターがアニメーション化するゲームオブジェクトの子になっているときは、IK エフェクターの位置を変えると、その位置もアニメーションのキーフレームとして追加されます。最初にすべての IK エフェクターにキーフレームを追加することはできますが、あとでそれを削除する場合は、エフェクターによって変更されるボーンにキーフレームを設定してから IK を削除する必要があります。この方法であれば、ボーンのトランスフォームを正しい位置に維持することができます。ただし、IK の解がアニメーションフレームすべてには適用されなくなるため、IK の解によってボーンが動かされるすべてのステップをキーフレームにしていない限りは、ボーンがトランスフォームに到達するまでの動き方が変わってしまう場合があります。

これで終わりです!これで皆さんに、アニメーションでインバースキネマティクスを使っていただくための予備知識はすべてお伝えしました。IK の機能は、2D Animation の機能と互いに強く結びついてはいますが、2D Animation の扱う範囲を超えても IK はなお有用なツールです。どんなときも、IK を活用するクリエイティブな方法を実験したり発見したりする自由があります。ここで、IK エフェクターにコライダーを付けた場合にどのような結果になるか試した例をご覧ください。

参考資料・フィードバック

IK を使うための追加情報は 2D IK レポジトリで見ることができます。このレポジトリでは最新のドキュメントも提供されています。

API の詳しい情報や、独自の IK ソルバーを書く方法を確認する方にとって、ドキュメントは非常に役に立つものとなっています。

同じレポジトリで、実際に動かして、このブログ記事で紹介したワークフローの基本を学ぶことができるサンプルプロジェクトをいくつか提供しています。

#Unity2DChallenge

Unity では、新しい各種 2D パッケージで皆様がどんなプロジェクトを作成されているか、どんな使用体験をされているかに、とても興味があります。

これが Unity 2D Challenge を開催した理由の 1 つです。Unity の新しい 2D ツールを使ってコンテンツを制作し、賞金や Unite のチケットを獲得しましょう!ピクセルパーフェクトなアートから、2D ゲームの試作品まで、どのような作品でも受け付けています。コンテストへの応募期間は 12 月 17 日です。〆切まであとわずか。今すぐ制作を始めましょう!

2D Animation フォーラム でも、皆様のプロジェクトのご紹介、ご意見・ご感想をお待ちしております!

コメント受付を終了しました。

  1. How to limit rotation of a bones?

  2. SOMEONE TESTED THIS FOR perfomance? WHEN 2 SUCH CHARACTERS IN THE CAMERA ALREADY A VERY DROP FPS!!! SOMEONE TRYED?

  3. SOMEONE TESTED THIS FOR PRODUCTIVITY? WHEN 2 SUCH CHARACTERS IN THE CAMERA ALREADY A VERY DROP FPS!!! SOMEONE TRYED?

  4. I am confused. I am now using version 1.0.16 package, and for every type of solve (ccd, fabr, limb), there is only CreateTarget button instead of CreateEffector button. So what is the workflow now?

  5. gta 5

  6. Morning Fun Game

    12月 4, 2018 4:59 pm

    Does this 2D IK system come from anima2D ? Which means anima2D has integrated into Unity ?

    1. As mentioned by Unity before, this is a new set of tools coded from the ground up, and Anima2D will not be integrated. It is depreciated. Unity has learned a lot from it and prefers to make a new set of workflows available via package manager.