CGキャラクターリギング入門:03 胴体のリギング

08 IK 背骨コントロールを作成する

各IKジョイントにコントロールを作成します。このコントロールは主に移動用なので、立方体の形にしましょう。まず、リファレンス用のポリゴン立方体を作成、 [CV カーブ ツール]([カーブの次数]:1)とポイントスナップで、立方体型のカーブを描きます。今回は、作業を高速化するため、cometツールで立方体を作成しましょう。

Comet > Shapes > cube を選択すると、 ワールド空間の原点に立方体の形をしたカーブが作成されます(図15)。立方体が中心にないときは、[移動]と[回転]チャネルのすべてに 0 を入力、[スケール]は均一な値 1 のままにします。

図15:シンプルな立方体のカーブは、IKコントロールに使用できます

このカーブを spine_hip_IK_ctrl にリネーム、[Ctrl]+[G]キーを2回押して、グループノードを上に2つ作成します。最上位のノードを spine_hip_ik_ctrl_offset、下のノードを spine_hip_ik_ctrl_auto に変更します。

spine_hip_ik_ctrl_offset を選択、[Shift]キーを押したまま、spine_hip_ik_jnt を選択、[P]キーを押します。これで、spine_hip_ik_jnt の下に spine_hip_ik_ctrl_offset がペアレント化されます。

spine_hip_ik_ctrl_offset の[移動]チャネルに値が表れます。これは、_offsetノードがジョイントからどれくらい離れているかを示しています。spine_hip_ik_ctrl_offset の[移動]値にゼロを入力すると、コントロールは正しい位置(ジョイントの位置)に戻ります(図16)。

図16:spine_hip_ik_ctrl の階層。コントロールは適切に配置されました

では、spine_hip_ik_ctrl_offset を選択、[Shift]+[P]キーを押して、ジョイントをペアレント解除しましょう。これからこのコントロールでジョイントを操作できるようにします。spine_hip_ik_ctrl、spine_hip_ik_jnt の順に選択、[コンストレイント]>[ ペアレント](Constraint > Parent)オプションで[オフセットの保持]を無効にして、[適用]を押します(図17)。

図17:新しいコントロールに[ペアレント]コンストレイントを適用し、ジョイントを操作する

コントロールで腰を操作できるようになりました。既定の位置に戻すには、[移動]と[回転]にゼロを入力しましょう。

コントロールの形を編集したいときは、コンポーネントモードに切り替え、CV を移動します。この方法であれば、コントロールのトランスフォーム値に影響しません。では、コントロールを選択、[F8]キーを押しましょう。

自由にコントロールを変形しても良いですが、適切な形を心掛けます。私は骨盤の塊周りにCVをスケーリングして、どの角度からも選択できる形にしました。同じ手順を spine_mid_ik_jnt と spine_chest_ik_jnt でも実行(図18)。腰と同じ命名規則で、コントロールをリネームしてください。

図18:spine_ik_mid_jnt と spine_ik_chest_jnt のコントロールも作成します

09 ツイストを追加する

ツイスト(ひねり)運動を可能にするため、spine_ik を選択、[アトリビュート エディタ]を開きます。[IK ソルバ アトリビュート]>[高度なツイスト コントロール]タブで[ ツイスト コントロールの有効化]をオンにします(図19)。

図19:スプラインIKの[ツイスト コントロールの有効化]。最初は希望どおりのルックになりません

2つのコントロールを選択して、IK ジョイントチェーンのルートと先端からツイストを操作できるようになります。しかし、最初の結果には満足できないでしょう。

これを使いやすく修正するには、[ワールド アップ タイプ]:[オブジェクト回転アップ(開始/ 終了)]、[ツイスト値のタイプ]:[開始/ 終了]にセット。続けて、[ワールド アップ オブジェクト]領域に、spine_hip_ik_ctrl と入力、[ワールド アップ オブジェクト 2]領域で、spine_chest_ik_ctrl と入力します。これらはツイストを操作する 2つのコントロール(IKチェーンのルートと先端)です。最後に、[アップ軸]:[負 Z]に、[アップベクトル]と[アップ ベクトル 2]を 0、0、-1 にセットします(図20)。結果を確認しましょう。2つのコントロールでツイストを上手く操作できるようになりました。

図20:[高度なツイスト コントロール]を更新、正しい動作を設定します

10 ストレッチ(伸縮性)を追加する

現時点で spine_hip_ik_ctrl を移動すると、腰と胸の間のジョイントを動かしたくない場合も、背骨全体がそれに沿って動きます。spine_crv は、腰と胸の間にあり「長さ」を増やして対応しています。ジョイントでも同じ動作を再現したいので、カーブを使ってサポートしていきます(図21)。

図21:カーブは伸びますが、ジョイントはそのままです

まず、spine_crv の長さを調べましょう。カーブを選択、左下隅にあるMEL ボックスで次のコマンドを入力します :arclen –ch 1

これでカーブの長さを保持する隠しノードが表示されます。[アトリビュート エディタ]を開くと[curveinfo1]タブが見つかります(図22)または、カーブを選択、[ハイパーシェード]や[ノード エディタ]で[入力/出力]ボタンを押しても表示できます。それでは、curveInfo1 を spine_curveInfo にリネームしましょう。

図22:[円弧長]はカーブの長さを表します

私が作成した背骨の[円弧長]は 52.526 でした。長さが若干異なる場合は、数値をメモしてください。後でその値を使用します。次は、[円弧長]の値でジョイントのストレッチを操作していきましょう。

ユーティリティノードで[円弧長]を相殺して、ジョイントに値を渡すことができます。[ウインドウ]>[ノード エディタ](Window > Node Editor)で[Tab]キーを押し、multiplyDivide と入力、[Enter]キーで作成します。

このノードをダブルクリックして、[アトリビュートエディタ]に読み込み、spineLength_md にリネーム、[操作]を[除算]にセットしましょう。

[ノード エディタ]で右の拡張アイコンをクリック、spine_curveInfoとspineLength_mdノードを広げます。これで両ノードに関連づけられたアトリビュートを確認できます。spine_curveInfoノードで、[円弧長]の出力をクリック、spineLength_md の[入力1]>[入力1X]にドラッグして接続します。

[アトリビュート エディタ]で spineLength_md を調べると、[円弧長]の値が[入力 1X]アトリビュートになっています。[入力 1X]と同じ値をコピー、[入力 2X]にペーストしてください。[入力 1X](52.526)を[入力 2X](52.526)で割ると、出力値は1になります。spine_crvの長さが変わると、spineLength_mdノードはその変化を読み取り、正しい長さを得るため、ジョイントにこの値を供給します(図23)。

図23:[乗算除算]ノードで、カーブの長さを相殺します

次は、[ノード エディタ]で新しい[乗算除算](multiplyDivide)ノードを作成、spine_ik2_md にリネーム。spine_ik2_jnt の[移動 X]( 長さ)をコピー、spine_ik2_mdの[入力 2X]にペーストしましょう。続けて、spineLength_mdノードの[出力 X]をspine_ik2_mdの[入力 1X]に接続します(図24)。

図24:カーブの[円弧長]をジョイントの[移動 X]に繋いで、背骨を伸ばします

最後は、spine_ik2_md の出力を spine_ik2_jnt に接続しましょう。[アウトライナ]でspine_ik2_jnt を選択、中ボタンドラッグで[ノード エディタ]にドロップ。そして、spine_ik2_md の[出力 X]を spine_ik2_jnt の[移動 X]に接続します。

ほとんどのジョイントは長さが異なるので、各ジョイントに[乗算除算]ノードを作成、各ジョイントの長さをそれぞれの[乗算除算]ノードに渡します。これはすぐに実行しましょう。作業中にノードを見失ったときは、[ハイパーシェード]を開いて、[ユーティリティ]タブをチェックしてください。

作業がすべて完了すると、背骨を spine_crv から離すことなく、IK コントロールを移動できるようになります(図25)。

図25:正しく動作する完成した伸縮性リグ

11 FK コントロールを作成する

FKコントロールに移りましょう。最終的に、これで IKコントロールも操作します。

まず、[アウトライナ]でルートを選択、[Shift]+[H]キーを押して、FK ジョイントチェーンを非表示解除してください。最初に、正のX回転で曲がるようにFK ジョイントチェーンの方向を調整します。これは、ほとんどのジョイントチェーンで必要となる処理です(IK 背骨ジョイントチェーンではこの作業を避けるため、高度なツイストを設定しました)。

spine_fk1_jnt を選択、[スケルトン]>[ジョイントの方向付け](Skeleton > Orient Joint)オプションに進みます。[主軸]:Y、[補助軸]:Z、[補助軸のワールド方向]:Y (+) にセットします(図26)。ジョイントをテストして、正しく動作することを確認してください。

図26:FKジョイントの方向を設定、正のX回転で曲げます

向きを設定すると、おそらく Y軸はチェーンの下を向き、[移動 Y]がジョイントの長さになります。X軸をチェーンの下向きにして、正のZ 回転で屈曲を作成することも可能です。正直なところ、それはどちらでも問題ありません。唯一の条件は、リグ全体に一貫性を保つことです。

次は FK背骨コントロールを作成します。プロセスを高速化するため、簡単なスクリプトを使用しましょう。[ スクリプト エディタ]で新規[Python]タブを開いて「scripts」ディレクトリから createControls.py スクリプトを読み込みます(図27)。

図27:FK背骨コントロールを作成するため、createControls.py スクリプトを使用します

スクリプトを実行すると、まず、接尾辞 _jnt を持つ任意のジョイントと同じ名前のコントロールを作成します(_jntを_ctrl に置換)。次に、コントロールの下に2 つのグループノードを作成、適切な名前に変更します。 さらに、[ペアレント]コンストレイントでコントロールを適切な位置に移動、その後に[ペアレント] コンストレイントは削除されます。最後の行に書かれたコンストレイントでジョイントがコントロールに接続されます。

膨大な作業に聞こえるかもしれませんが、コメントを除くと10 行のコードです。スクリプトを使う前に、FKジョイントと関連コントロールには、[方向]コンストレイントを適用したいので、最後の行を次のように編集してください。

それでは、spine_fk1_jnt、spine_fk2_jnt、spine_fk3_jnt、spine_fk4_jnt を選択、[スクリプト エディタ]ですべてのスクリプトテキストをハイライト、テンキーの[Enter]キーを押します。[アウトライナ]を見ると、階層構造を持つ4つのジョイントそれぞれに、コントロールが作成されます。コントロールの形や大きさは、コンポーネントモードで編集しましょう。

コントロールにもジョイントと同じような階層が必要です。まず、spine_fk4_ctrl_offset を spine_fk3_ctrl の下にペアレント化、次に、spine_fk3_ctrl_offset を spine_fk2_ctrl の下にペアレント化、最後は、spine_fk2_ctrl_offset を spine_fk1_ctrl の下にペアレント化します(図28)。回転をテストしてください。上手くいけば、すべてが順番に動作します。

図28:完成したFK背骨コントロールの階層