チュートリアル / 人体構造を意識したキャラクターセットアップ方法 ~ゼロから始めるMayaリギングの基本~
第6回:人体セットアップリアル編/左腕の解説
- Maya
- アニメ
- インテグラル・ヴィジョン・グラフィックス
- キャラクター・リグ
- ゲーム
- コラム
- チュートリアル
- 学生・初心者
- 映画・TV
00.ごあいさつ
01.左腕に必要な補助骨について
01-1.Roll骨
01-2.ボリューム骨
01-3.筋肉骨
02.作例紹介
02-1.シンプル編からの変更点
02-2.補助骨の命名・配置・軸のルール
02-3.役割ごとの具体的な設定
03.おわりに
00.ごあいさつ
皆様こんにちは。
前回は補助骨の基礎の部分について解説しました。
今回からは実際に補助骨を使ったセットアップについて、具体的に見ていきましょう!
本コラムでは他の部位と共通する部分も多い、左腕のセットアップを例に解説していきます。
01.左腕に必要な補助骨について
第5回では形状補正用の比較的単純な補助骨についてご紹介しました。
左腕の動きをリアルに再現する為には、より複雑な設定の補助骨が必要になります。
そこで、腕の動きを再現するためにはどんな補助骨が必要なのか役割ごとに見ていきましょう。
役割ごとに分解して考えることで、説明を簡素化して理解しやすくするという狙いがあります。
本コラムで紹介するものは以下の役割に則って解説しています。
01-1.Roll骨
Roll骨は ”捻りを補正する骨” です。
手首を捻った時など、体幹骨のみの構成だと体積が減少し、細く痩せてしまう場合があります。
これを軽減するためにRoll骨を追加すれば、捻りを前腕全域に分散することができます。
01-2.ボリューム骨
ボリューム骨は ”痩せを緩和する骨” です。
体幹骨を曲げた時に、メッシュが痩せたりめり込んだりする問題があります。
そういった部分の、ボリュームを補正する役割の骨になります。
01-3.筋肉骨
筋肉の伸びや収縮など、”筋肉の動きを表現する役割の骨” です。
肘を曲げた際の肘頭などもこちらで表現しています。
これらの骨を組み合わせることで、腕の動きをリアルに再現することができます。
02.作例紹介
実際に補助骨の配置やコネクションで、どのように制御するのかご紹介していきます。
02-1.シンプル編からの変更点
まずはシンプル編のルールから変更がありますので、以下の点にご留意ください。
■体幹骨の配置変更
シンプル編の骨配置では、一部の体幹骨(肘や手首など)は骨と頂点の動きの特性上、やや外側に寄せて配置していました。
リアル編では補助骨で補正をかけるので、デフォーム時の偏りを避けるために、体幹骨はモデルの中心に配置します。
■Max influencesの変更
シンプル編ではMax influencesを ”4” としていました。
より複雑な表現にはウェイトを振る骨数を増やす事が必要なため、リアル編ではMax influencesを “6” にしています。
第3回でも紹介しましたが、ウェイトの範囲が広くなりすぎる場合は、1つの頂点に対して意図しない骨が影響してMax influencesを超えてくる事がありますので、ウェイトの範囲には注意しましょう。
補助骨の命名・配置・軸のルール
次に補助骨を作成する際のルールを確認していきます。
■補助骨の命名規則について
基本的には第5回で紹介した命名規則を踏襲していますが、今回新しく追加したRoll骨については以下のような命名規則になります。
「_Roll+大文字アルファベット(A~Z)」
また、Roll骨の子にボリューム骨や筋肉骨がある場合には、「LeftForeArm_RollA_SpoT」のようになります。
■補助骨の配置について
こちらも基本的には第5回で紹介した作成位置を踏襲していますが、気を付けたい点があります。
今回、Roll骨は捻りアニメーションの起点になっている骨と同位置に置きました。
後述するコネクションの章で解説する形状補正においても、アニメーションの起点になっている骨と同位置においたほうが扱いやすいため、こちらに配置しています。
前腕は手首が起点になりますので、手首と同位置になります。
上腕の捻りは肩を起点にするので、肩の体幹骨と同位置にRoll骨を置きます。
各補助骨のEnd骨は、親骨のウェイトが強くなるメッシュの付近に配置しています。
■ジョイントの向きについて
ボリューム骨と筋肉骨は第5回のジョイントの向きと同じ方針になります。
Roll骨は捻りの動きが親の骨と同じ回転をするようにしましょう。
+X軸は子階層に向くようにしています。
役割ごとの具体的な設定
シンプル編からの変更点と新しいルールを確認したら、いよいよ左腕の具体的な設定を解説していきます。
■骨配置
左腕の補助骨の配置について、先ほどご紹介した役割ごとに解説します。
まずは階層と骨の位置、ジョイントの向きを確認してみましょう。
▼Roll骨の配置
上腕の捻りは肩を起点にするので、肩の体幹骨と同位置にLeftArm_RollA~Cを配置します。
End骨は肩と肘の間を等分した辺りに配置しています。
前腕の捻りは手首が起点になりますので、手首と同位置にLeftForeArm_RollA~Cを配置します。
End骨は肘と手首の間を等分した辺りに配置しています。
▼ボリューム骨の配置
LeftArm_SpoT,U,F,Bは、肩を前後や上下に曲げた際の痩せや、めり込みを緩和する補助骨になります。
肩の骨と同位置に配置します。End骨は体幹骨のみのウェイト配分で、肩をそれぞれの方向に曲げた時に、最も痩せてしまう部分(三角筋の頂上付近や脇の中間部分)に向けて配置します。
第3回の部位ごとのデフォーム解説も参考に併せてご確認ください。
LeftElbow_SpoFは、肘を内側に曲げた際の痩せや、めり込みを緩和する補助骨になります。
肘の骨と同位置に配置します。肘は内側の回転のみなので、End骨は体幹骨のみのウェイト配分で、最も痩せてしまう肘の内側の中間点に向けて配置します。
LeftWrist_SpoT,U,F,Bは、手首を前後や上下に曲げた際の痩せや、めり込みを緩和する補助骨になります。
手首の骨と同位置に配置します。End骨はArmと同様、それぞれの方向に曲げた時に最も痩せてしまう部分に向けて配置します。
自身の手首を前後左右に動かして、シワになる部分が一つの目安となります。
▼筋肉骨の配置
上腕二頭筋と上腕三頭筋の動きを表現する骨としてLeftArm_RollB_SpoF、LeftArm_RollB_SpoBを配置します。
上腕二頭筋は肘を曲げる際に使われる筋肉で腕の前側にあります。屈曲すると膨らむ、所謂 ”力こぶ” の部分です。
上腕三頭筋は肘を伸ばす際に使われる筋肉で腕の後ろ側にあります。上腕の筋肉の大部分を締め、肘を曲げる際に伸展する筋肉です。
LeftArm_RollB_SpoF、LeftArm_RollB_SpoBともに、Topビューで見たときの筋肉の形状を確認し、それぞれの膨らみのピーク地点に配置します。
肘頭の尖りを表現するためにLeftElbow_SpoBを配置します。
肘と同位置に配置し、End骨は肘を曲げたときに尖りが最も強くなる位置に向けて配置します。
前腕にはたくさんの筋肉がありますが、特に腕の形状と大きさを特徴づける腕橈骨筋と橈側手根屈筋の2つに分けて考えます。
腕橈骨筋は肘を曲げる際に前腕で使われる筋肉、橈側手根屈筋は前腕の回転と手首を曲げる際に使われる筋肉です。
肘を曲げた時の腕橈骨筋が引き上げられる様子や、橈側手根屈筋が収縮する様子を表現します。
LeftForeArm_RollA_SpoTは腕橈骨筋、LeftForeArm_RollA_SpoUは橈側手根屈筋の動きを表現する骨として配置します。Frontビューで見たときの筋肉の形状を確認して、それぞれ膨らみのピーク地点に配置します。
■コネクションとウェイト例
補助骨のコネクションについて、役割ごとに代表的な部位に絞ってご紹介いたします。
コネクションの作業を行うことで、体幹骨を動かした際に、追加した補助骨も連動して動かすことができるようになります。
基礎部分については第5回で解説しているので併せてご確認ください。
▼Roll骨のコネクション
上腕や前腕が適切に捻れることで、急な捻れや痩せのない形状を維持できるように調整します。
Roll骨の設定は、上腕と前腕で共通しているため、ここでは前腕を例に説明します。
LeftForeArm_RollA、LeftForeArm_RollB、LeftForeArm_RollCの3つのRoll骨を用意し、手首を捻った際に、肘から手首にかけて徐々にRoll骨が影響を受けるように調整します。
これにより、捻りを手首付近から前腕部分に分散させ、細くなってしまう問題を解決できます。
ただし、手は ”捻り” だけではなく ”曲げ” も影響します。
よって、Roll骨は ”曲げ”の影響を受けずに ”捻り”だけを継承するようなセットアップをしたいです。そこで ”捻り” だけを抽出してコネクションを設定する方法を紹介します。
以下のGIFは手前側はRotateXだけを参照したもの、奥側が捻りだけを抽出して継承したものです。実現したい動きは奥側のものになります。
捻りだけを抽出するには ”オイラー角”と”クォータニオン” という考え方が必要になってきます。
Mayaの回転はデフォルトでは “オイラー角” という考え方で構成されているのですが、その回転を “クォータニオン” に変換することで ”捻り成分のみを抽出” してRoll骨を制御することができます。
*オイラー角とクォータニオンについて、初めて単語を聞く方もいると思います。
少しだけ解説しますが、無理に理解しようとせず、まずは読み飛ばして実際の手順に進んでも問題ない箇所です。
オイラー角は3次元空間における回転を3つの角度(X, Y, Z)で表現します。
一方、クォータニオンは4つの成分(1つのスカラー成分と3つの成分:W, X, Y, Z)で回転を表現します。
オイラー角は直感的に考えやすい反面、回転順序の影響を受けやすく、今回の手首のように ”曲げてから捻る” といった動作で狙った動きができなくなってしまいます。
対して、クォータニオンは直感的な理解が難しいものの、そういった問題が発生せず、スムーズで安定した回転を適用できます。
補助骨を制御する際、特定の回転軸にのみ連動させたい場合は、オイラー角よりもクォータニオンを利用する方が多くのメリットがあります。
オイラー角からクォータニオンへの変換はUtility Nodesで行えます。
実際にUtility Nodesを使用し、以下の手順でLeftHandの捻り成分のみを抽出してみます。
Utility NodesやNode Editerの基本操作ついては第5回で解説しているので、併せてご確認ください。
1.「eulerToQuat」を作成し、LeftHandのRotateを「eulerToQuat」のInput Rotateに接続します。
2.「quatToEuler」を作成し、「eulerToQuat」のOutput QuatXとOutput QuatWを「quatToEuler」のInput QuatXと Input QuatWに接続します。
この設定により、LeftHandの捻り成分のみを抽出できるようになります。
次に、捻りを手首付近から前腕部分に分散させることで、手首が痩せてしまったり細くなってしまう問題を解決していきます。
Roll骨に係数をかけ、手首に向かうほど、徐々に捻りの影響を受けるように調整することで実現できます。今回は単一の値のみを扱うため「multDoubleLinear」というノードを使用します。
「multDoubleLinear」はinput1とinput2の積をoutputするノードです。
1.「multDoubleLinear」を作成します。
今回はRoll骨を3本配置しているため、「multDoubleLinear」も3つ作成します。
2.「quatToEuler」の Output RotateXを各「multDoubleLinear」のInput1に接続します。
3.各「multDoubleLinear」のOutputを、LeftForeArm_RollA、LeftForeArm_RollB、LeftForeArm_RollCのRotateXに接続します。
4.「multDoubleLinear」のInput2に、それぞれ適切な係数を設定し、手首側のLeftForeArm_RollCが最も影響を受けるように調整します。
このように、肘から手首にかけて徐々に捻りの影響が強まるようにしつつ、LeftHandの捻り成分のみを抽出することで、曲げの影響は与えずに、捻りの影響だけをRoll骨に適用できるようになります。
少しむずかしい部分ではありますが、実際に試して見ると少しずつイメージできるようになるので、ぜひ試してみてください!
▼Roll骨のウェイト例
各Roll骨のEnd骨付近が、最もRoll骨の影響が強くなるようにウェイトを塗ると、きれいなデフォームになります。
捻った時にガタガタになりがちなので気をつけましょう!
スキニングや、スキニングを効率的に行えるケージモデルについての詳細な解説も行っております。こちらも併せてご確認ください。
▼ボリューム骨のコネクション
ここでは手首を例に説明します。手首に配置したボリューム骨は、体幹骨のみではめり込んでしまったり痩せてしまったりする変形を補正し、ボリュームを維持できるように調整します。
手の縦横の回転(曲げ)に対し、半分の値で回転するように設定することで、痩せやめり込みを回避してボリュームを維持することができます。実現したい挙動は以下のようになります。
LeftHandの回転をオイラー角からクォータニオンに変換し、曲げ成分のみを抽出して補助骨を制御します。
これはRoll骨の制御と同様に、オイラー角は回転順序によって軸の向きが変化し、特定の角度で不安定になることを回避するためです。
*この部分について詳しく知りたい方は、以下も併せて読んでみてください。
無理に理解しようとせず、読み飛ばして手順に進んでしまっても問題ない部分となります。
LeftHandの回転から、縦横の回転(曲げ)のみを抽出するには、LeftHandの回転を一度クォータニオンに変換し、そのクォータニオンに対してLeftHandの捻り成分の ”逆クォータニオン” を掛けることで可能になります。
これはクォータニオンの回転加算が掛け算からなっていて、LeftHandの回転からLeftHandの捻りに対して逆数をかけることにより捻りを相殺し、曲げのみの値を取得できるからです。
ここで “逆クォータニオン” という言葉が出てきますが、これはクォータニオンを逆数に変換できるノードになります。
行列に逆行列が存在しますが、クォータニオンにも逆クォータニオンが存在し、同様の扱いができます。
クォータニオンや捻りと曲げの分解については、 COYOTE 3DCG STUDIO様がより詳しく解説していますので、理解を深めたい方はこちらも併せてご参照ください。
https://cgworld.jp/regular/202102-coyote-ta02.html
実際の接続手順ですが、手首のボリューム骨の回転は、ボリューム骨の親であるLeftWrist_Spoが担いますので、まずはこちらに対して以下の手順で接続を行います。
1. eulerToQuatを作成
LeftHandのRotateを「eulerToQuat」のInput Rotateに接続します。
2. 捻り成分を抽出するためのeulerToQuatを作成
LeftHandのRotateを「eulerToQuat」のInput Rotateに接続します。
3. 捻りの逆クォータニオンを作成するためにquatInvertを作成
2で作成した「eulerToQuat」のOutput Quat XとOutput Quat Wを、「quatInvert」のInput Quat XとInput Quat Wに接続します。
4. クォータニオンを合成するためのquatProdを作成
1で作成した「eulerToQuat」のOutput Quatを「quatProd」のInput1 Quatに接続します。
3で作成した「quatInvert」のOutput Quatを「quatProd」のInput2 Quatに接続します。
5. quatToEulerを作成
「quatProd」のOutput Quatを「quatToEuler」のInput Quatに接続します。
この設定により、LeftHandの回転から捻り成分を除去し、縦横の曲げ成分のみを抽出できるようになります。
後は「mutiplyDivide」を使い、-0.5をかければLeftHandの中間の回転を制御することができます。
今回の場合だと、input 2X:0 input 2Y:-0.5 input 2Z:-0.5 のように設定しています。
手首に実際にウェイトを振るボリューム骨は、LeftWrist_Spoの子階層にあり、ドリブンキーで制御します。
ドリブンキーについては第5回で解説していますので、こちらも併せてご確認ください。
LeftHandの回転から直接ドリブンキーを設定すると、フリップしたり意図しない挙動になってしまう場合がありますので、先ほど曲げ成分のみを抽出したLeftWrist_Spoの回転をソースに、子階層のLeftWrist_SpoT,U,F,Bを制御します。
実際にドリブンキーを設定していきます。
まずは、LeftHandの縦回転(掌屈・背屈)の動きに対してドリブンキーを設定していきます。
設定の詳細は、次の表にまとめています。
設定すると以下のような挙動になります。
LeftWrist_SpoはLeftHandの回転の中間の値を取得しているため、凹んでいる箇所に向かって補助骨を移動させることで、メッシュの痩せを防ぐことができます。
掌屈の際、手根部(手のひらの付け根)のメッシュが削れて厚みを維持できないため、LeftWrist_SpoUをTranslateX方向に移動させることで、これを回避しています。
次に、LeftHandの横回転(尺屈・撓屈)の動きに対しても同様にドリブンキーを設定していきます。
設定の詳細は、次の表にまとめています。
設定すると以下のような挙動になります。
横回転の補助骨の制御も、縦回転(掌屈・背屈)と同様に、凹んでいる箇所に向かって補助骨を移動させることで、メッシュの痩せを防いでいます。
こちらがドリブンキーを設定した最終的な結果です。
LeftHandの曲げ回転のみに連動するLeftWrist_SpoをDriverにすることで、前後左右に分けた補助骨がフリップしたり、意図しない挙動になるのを抑えられます。
▼手首のボリューム骨のウェイト例
横回転(尺屈・撓屈)と縦回転(掌屈・背屈)のそれぞれできれいなデフォームにしたいので、ボリューム骨の個々のウェイトが広がりすぎないように注意して塗っていきましょう。
ウェイト調整は補助骨の動きとバランスを取りながら作業をしていく事が重要になります。
実際に骨を動かしながら補助骨と一緒に調整してみてください。
▼筋肉骨のコネクション
最後に筋肉骨のコネクションを行っていきます。
筋肉や関節の動きを表現するので、最終的なクオリティが一気に良くなります。
今まで紹介してきた補助骨設定を駆使して作成していきます。
肘の設定
肘を曲げた際の、肘内側のめり込み回避や外側の尖りを再現します。
LeftElbow_Spoは、LeftForeArmの回転の半分の値で動作するように設定されています。これにより、痩せのないきれいな肘の動きを実現します。
また、LeftElbow_SpoFとLeftElbow_SpoBはドリブンキーで制御しており、肘を曲げた際の内側のめり込みや外側の丸みを適切に補正します。
第5回のコラムで解説した補助骨の例と非常に似ていますので、そちらも参考にしてください。
前腕の設定
肘の屈曲に応じて前腕の形状が内側に寄りすぎないようにドリブンキーを設定していきます。
LeftForeArm_RollA、LeftForeArm_RollB、LeftForeArm_RollCにオフセットをかけることで、前腕の内側の干渉を抑え、形状を補正します。
ForeArmのRoll骨はRotateXで手首を捻ったときの捻り補正、RotateZで肘を屈曲したときの形状補正を行っています。
設定の詳細は、次の表にまとめています。
設定すると以下のような挙動になります。
上腕の設定
肘を曲げたとき、上腕二頭筋は縮んで膨張し、所謂”力こぶ”を形成します。
対して上腕三頭筋は伸展し、筋肉の盛り上がりのピーク位置が収縮しながら肘側に移動します。
まずは上腕二頭筋と上腕三頭筋が伸縮する動きを再現します。
LeftForeArmのRotateZが-120に達したとき、LeftArm_RollC_SpoFとLeftArm_RollC_SpoBの位置が入れ替わるようにドリブンキーを設定します。
これにより、肘を屈曲させた際の筋肉の伸縮を再現できます。
設定の詳細は、次の表にまとめています。
次に上腕二頭筋と上腕三頭筋が膨張・収縮する動きを再現します。
LeftForeArmのRotateZが-90から-120へ遷移する際に、上腕二頭筋の膨張する動きや上腕三頭筋の収縮する動きを、LeftArm_RollC_SpoFとLeftArm_RollB_SpoBのScaleXを用いて調整します。
設定の詳細は、次の表にまとめています。
圧迫されることによる筋肉の厚み
最後に肘を曲げることによって前腕と上腕が干渉し、圧迫され厚みが出る動きを再現します。
LeftArm_RollC_SpoFとLeftArm_RollB_SpoBのScaleZを用いて調整します。
設定の詳細は、次の表にまとめています。
設定すると以下のような挙動になります。
前腕には筋肉の厚みを表現するためにLeftForeArm_RollA_SpoTとLeftForeArm_RollA_SpoUを配置しています。それらをTranslateZ方向に移動させることで、筋肉の厚みを表現します。
設定の詳細は、次の表にまとめています。
設定すると以下のような挙動になります。
■仕上げ
今回は補助骨の配置、コネクションとウェイトとそれぞれ順番にご紹介しましたが、実際にはこれらの作業を行ったり来たりしながらバランスを整えていきます。
例えばウェイトの調整後にコネクションの再調整を行い、更にウェイト調整を重ねるといった事があります。
実際に骨をたくさん動かしてデフォームを確認しながら、調整を繰り返していきましょう。
03.おわりに
今回は左腕に絞った補助骨の解説をご紹介いたしました!
補助骨を使用することでより表現の幅を広げることができますので、ぜひ挑戦してみてください。
次回は腕を除いた上半身について解説していく予定です。
それでは、次回もよろしくお願いいたします!