皆さんはじめまして!
好きな小説は小野不由美の十二国記シリーズ。
クリーク・アンド・リバー社 COYOTE 3DCG STUDIO テクニカルチームの宮本です。
十二国記といえば今年(2025年)12月に行われる十二国記のミュージカルの開演を今か今かと待っています。(”十二”国記だから12月にしたのかな…?)
この記事は前回の「【Character】ほんとに怖いジョイントのお話【序章・命名編】」に引き続き、ジョイントの回転軸の向きの設定についてのお話になります。
スキニング初心者あるある質問
自分は普段リガーとして様々なキャラクターに対してスキニング、リギングを行っています。
最近はリガー志望の新卒の方なども増えてきて、嬉しい限りです。
そこで、よく新卒の方やスキニング初心者の人からこんなことを言われます。
「スキニングするとき、ジョイントの回転軸の向きってどういう基準で決めたら良いですか?」
うーん、確かに「ジョイントの位置」の決め方についてはいろいろとWebに載っていることが多いですが、意外とこの「ジョイントの回転軸の向き」について言及されている記事は個人的には少ない印象です。
なんとなくX軸を子の骨に向けるのがセオリーということは知られているけれど、具体的にどういう原理で決まっているのかを説明するのは少し難しいです。
それもそのはず、このジョイントの向きは使用されるDCCツール(3DCGソフトウェア)、出力されるゲームエンジン、その他にもプロジェクトのレギュレーションなどなど…。多様な判断基準によって最適な向きというものが変わってきます。
つまりケースバイケースということになります。
おおー!! なるほど!!!!!!!! そういうことか!!!!!!
…ということで今回はジョイントの回転軸の向きの決め方について調べてみましたが、結論はケースバイケースということでした!! いかがでしたでしょうか?
この記事が良かったと思う方は高評価とチャンネルとうろk………なわけないですよね。TECH COYOTEブログは有名人に彼氏彼女が居る居ないだのを探るキュレーションサイトではありません。
昨今ではmgearを初め自動でジョイント配置、リグ生成が可能なリギングツールが配布されていたりして、手作業でジョイントを配置することは少なくなってきています。
しかしこのジョイントの回転軸の決定方法はリグのコントローラーにおいても共通する部分は多いため、ジョイントの事だけだとは思わずにお読みいただくと良いかもしれません。
つまりこの知識を把握しているだけで、リギング時のコントローラーの回転軸の決め方もカバーでき、かなり効率的なキャラクターセットアップが可能になるかもしれないということです!
ジョイントの向きを決める要素
さて、前述の通りジョイントの回転軸の向き(以降”向き”と呼称します)は使用される状況によって最適な向きが変わってきます。
しかしある程度大枠の判断基準があるので、それによって決定することができます。
大別すると以下のような判断基準があります。
-
アニメーションさせやすい回転軸
-
ジョイントの回転順序と主軸・補助軸の決定
-
ミラー方向のレギュレーション
-
使用するDCCツールやゲームエンジンの座標系
ゲーム系のプロジェクトでは大体これらによってジョイントの向きは決めることになるかと思います。
もちろん他にもプロジェクトで使用されている内製ツールなどの都合によってこれ以外にも判断基準が増えることがあります。
上から順番に見ていきましょう。
1.「アニメーションさせやすい回転軸」
まずモデルに骨を配置して軸を決める時に大事なのは、「メッシュに対して骨がどの方向に向いていて、どう曲がってほしいか」という点を見極めることが大事です。
今回は髪の毛の骨を例に考えて行きましょう。まずは画像のように骨配置を済ませます。
ここから骨の向きを決めて行きますが、単純にジョイントの方向付けツールで設定した向きがこちらになります。
うーん、一見悪くないようにも見えてしまいますが、実はこれでは少々問題があります。
この軸方向では風で横に揺れるときや、髪の下に空気が入ってふわっと持ち上がる場合にニ軸以上の回転が必要になっていて、そのためにメッシュ同士の干渉も起きやすい状態です。これではアニメーターの方の作業が複雑になってしまいそうです。
以下の画像が軸方向を修正した際の動きになります。
Y軸が頭部の中心部分に向かう方向に沿っているため、一つの軸で髪を横になびかせたり、髪を浮かせやすくなっていますね!
このように、軸方向を決める際には「メッシュ形状に対してアニメーターが動かしたい方向」に合わせて設定することが重要になります。
一概に定義することは難しいですが、メッシュ形状に対して水平垂直方向に軸が並んでいると動かしやすい軸になることが多いです。
この軸方向で髪全体を定義してあげると、まとめて動かしても直感的でかつモデルの干渉も少なく済んだりと、メリットがたくさんありますね!
2.「ジョイントの回転順序と主軸・補助軸の決定」
この項目が一番重要な判断基準になります。一つ前の項目ではメッシュの形状に対してどの方向に軸を設定してあげるとアニメーションに有効かをお伝えしました。
この項目では先ほど決めた曲げる方向に対して、XYZ軸がどこに向いているべきかをお伝えします。
タイトルにある「ジョイントの回転順序と主軸・補助軸の決定」ですが、ジョイントの回転順序は分かるけど、「主軸・補助軸」とは?と思った方もいるかも知れないです。主軸、補助軸とは以下の事を指します。
主軸(Primary Axis):子ジョイントの方向に向く軸
補助軸(Secondary Axis):主軸以外の補助的に姿勢を決定づける軸
ジョイントの向きを決める際、まず初めに主軸をどの軸にするか決めることが多いです。日本ではほとんどX軸主軸が多いです。なぜX軸が多いかは後ほど説明します。
主軸の後は補助軸となる軸を決めるのですが、これは主軸がX軸の場合はY軸かZ軸が補助軸になります。エイムコンストレイントで言うところのUpVectorがこの補助軸になりますね。
この補助軸の決め方には一定の判断基準があります。
それは「回転方向の優先度付け」です。これはつまり、
「一番頻繁に使う回転方向を回転順序の一番外の軸に設定すること」
ということになります。なぜ一番頻繁に使う方向を一番外側の軸に設定する理由については、X軸が主軸となっている点とも絡んできますのでこちらも後ほどまとめてご説明したいと思います。
補助軸を決める際は、この「一番頻繁に使う回転方向」という点を決定するために回転方向の優先度付けが重要になってきます。
例を一つ挙げます。皆さんがキャラクターのSpineジョイントの向きを決める時、以下の①、②、③のどの回転が一番キャラクターが頻繁に行うと思いますか?
おそらく①の回転を一番頻繁に行うと考える方が多いんじゃないかと思います。
皆さんの日常生活で考えても②や③の動きをする機会は①に比べて少ないのではないでしょうか。
つまりMaya標準の回転順序のXYZでいうと、Z軸が一番外側に当たるため、①の軸はZ軸ということになります。
これが「回転方向の優先度付け」になります。これによって補助軸がどの軸になるかを決定します。主軸のX軸と補助軸のZ軸の方向が決まれば自然と最後のY軸の向きも決まることになりますね。
余談ですが、この回転方向は※「ピッチ」「ヨー」「ロール」とも呼ばれています。(※主軸のX軸を進行方向と定義した場合)
XYZ軸での表現では状況によって表す方向が変わることがよくあるので、あえてこの呼び方で回転方向を伝える場合があります。リガーの間ではよく聞く用語だったりします。
ピッチ:進行方向に対して上下方向の回転
ヨー :進行方向に対して左右の回転
ロール:進行方向を中心軸とした回転
さてさて、実はまだ決めることがあります。曲がる方向がどの軸になるかは決まりましたが、正負方向はどう決めるのがいいでしょうか?
上記の画像ではどちらも曲がる方向と対応する軸は一致していますが、曲がったときの値が正負反転します。
この正負方向の決め方についても判断基準があります。
正方向:外転、伸展方向に回る方向
負方向:内転、屈曲方向に回る方向
これまた聞き慣れない単語が乱立して戸惑うかもしれません。これは解剖学的運動学(以下運動学)の用語になりますが、運動学では人間の関節の動き方に「外転」「内転」「伸展」「屈曲」などの呼び方が決まっています。
気になる方は「運動学 運動方向」などで調べるとこれらのことをもっと深く理解できるかと思います。
ただジョイントの方向を設定するうえでは、「体の外側に向かって動く方向、関節の角度が開く方向が正方向、体の内側に向かって動く方向、関節の角度が閉じる方向が負方向」と覚えてもらえれば大丈夫です。思ったよりシンプルですね!
つまりSpineの画像の例では顔の正面側に曲がる方向が負方向、体を反る方向が正方向になります。
なぜ主軸はX軸が多いのか? なぜ一番頻繁に使う軸を一番外の軸にするのか?
ここまできて、なんでX軸が主軸なのか、さらになぜ一番頻繁に使う軸を一番外の軸にするのか、という疑問が湧いた方もいるかもしれません。
もちろん慣例的に定着している部分もあると思うのですが、自分が考える合理的な理由がありますので説明したいと思います。
先に理由を説明すると、以下が大きな要因になります。
デフォルトの回転順序において、ジンバルロックを発生させにくく主軸が常にツイスト方向を向くため
この事を説明するには上腕のジョイントを例に取るとわかりやすいと思います。
まずは上腕の回転方向を決めます。
主軸はX軸とし、人間は通常ほとんどが腕をおろしている状態(=一番頻繁に回転している)なので、腕を下ろす軸をZ軸として設定します。
正負方向は、脇を閉める方向が負方向になるようにしています。すると以下の画像のような回転軸設定になります。これが一番セオリーとなる回転方向かと思います。
ここで回転の動きを見てみましょう。マニピュレーターの表示設定はジンバルにしてどのような回転軸になっているか分かりやすく表示します。
Z軸で動いたあとにY軸が動いていますが、値はそれぞれの軸でしっかりと管理されていますね。
では続いて軸を入れ替えてY軸で脇を閉めるようにしてみます。
Y軸を回転したあと前後に動かすための軸がなくなってしまいましたね。これはいわゆるジンバルロックが起きている状態です。
マニピュレーターの表示をオブジェクトにして前後に回転させると回転値がX軸にも値が入ったり、Y軸の値も変わってしまっていますね。この状態ではアニメーターのキー管理がより複雑化してしまう原因になってしまいます。
この現象はジンバルロックにより消失した軸方向に対して回転させると、オイラー角では三軸すべての軸を使わないと回転させられないことが原因であるためです。
図で説明するとこのようなことが発生しています。
この図はジンバルロックした状態で消失した軸方向(ピンクの矢印の方向)に曲げる例です。
これに対応するには三軸すべてを回すことで、求めるピンク色の矢印の方向に向けることができます。
ただこれでも問題が残ります。
ジンバルロックした状態で消失した軸方向に曲げようとすると、本来欲しかった軌道ではなくなってしまっています。これもオイラー角を使用しているための特有の問題です。
アニメーション作業ではこのように軌道が変わってしまった場合はオイラーフィルターを使って修正したりします。
オイラーフィルターはオイラー角を処理の中でクォータニオンに変換し再計算することでこの問題を解消するものです。
ジンバルロックとはつまり回転順序の第二軸がプラスマイナス90°付近に近づくと発生するオイラー角特有の問題です。
ということは逆に第三軸で腕を前後に振るようにするとどうでしょうか?
かなり特殊ですが主軸は-Y方向とし、第三軸であるX軸で前後回転をするような回転方向にしてみます。
Z軸で腕を下ろしたあとにX軸で回転して…、一見うまくいっていそうですが今度は腕をツイスト(内旋・外旋)するための軸が消えてしまいました。
マニピュレーターをオブジェクト表示にしてツイストすると案の定三軸に回転が入ってしまいました。…なんともままならないものです。
長くなってしまいましたが、これでなぜ主軸をX軸にして一番頻繁に使う軸を一番外の軸に設定するかがなんとなく伝わりましたでしょうか。
一番外側と一番内側の軸を回転させる分にはジンバルロックは発生しません。そのため一番回転頻度が高いものを外側の軸にし、第二軸はその次に頻度が高い軸に設定します。
そうすることで第三軸がツイスト方向に向きつつも、極力ジンバルロックが発生しにくい方向設定となるのです。
ほとんどの場合はジョイントの回転順序はデフォルト(XYZ)である事が多く、その回転順序ではX軸主軸が一番合理的になります。そのためX軸が主軸として採用されている事例が多いのです。
3.「ミラー方向のレギュレーション」
ここまでジョイントの回転方向の決め方をご説明してきましたが、ミラー側では少し状況が変わる場合があります。
つまりLeft側の回転方向をミラーしてRight側にもジョイントを作成する場合、回転方向の決め方が二通りあります。
今回は鎖骨のジョイントを例にミラー側を作成してみます。回転方向は上腕と同じ向きになっています。
Maya標準のジョイントミラーツールを使用してミラーしてみます。ミラーオプションは「動作」基準としています。
この設定では左右のジョイントが同じ回転値で文字通り鏡合わせのように回転するようになります。アニメーターとしてはこの挙動は直感的で好む方も居るかもしれませんね。
しかし一点注意点もあります。
主軸であるX軸の正方向が子に向かっておらず、反対に負方向に子がある状態になってしまっています。
このままでも問題ないケースはありますが、プロジェクトのレギュレーションやセットアップ後の後工程によっては問題が出てしまう可能性もありますので、注意が必要です。
次はX主軸をミラー元と同じように正方向側に子が来るように設定します。
このミラー処理はMaya標準のツールでは対応していないため弊社の内製ツールを使用して生成しています。
方向設定としてはワールド原点を中心としてワールドX軸にスケール-1が入った場合に向く方向と同じ向きになります。(※使用した内製ツールではこの姿勢を行列計算で求めています)
これで主軸の向きはミラー元のLeft側と一致しましたが、回転の動きは左右対称ではなくなってしまいましたね。
一つ目と二つ目の姿勢、どちらを採用するかはプロジェクトや後工程によって判断する必要がありそうです。
4.「使用するDCCツールやゲームエンジンの座標系」
こちらも基本にしてかなり重要な要素です。DCCツールごとに座標系と言われるワールドの向きを決めるルールがあります。平たく言うとこのツールでは左右方向がX軸で、上下方向がY軸、前後がZ軸、というようなルールのことですね。
座標系といえば、今年(2025年)の6月にUnreal Engineの座標系が変更されるというような話がEpicGamesのTim Sweeney氏が言及されて、その界隈では話題になりましたね。
(画像はTim Sweeney氏のX上の投稿から引用)
座標系はワールド全体の向きを決めているので、当然ジョイントの向きにも大きく関係しています。
DCCツールでジョイントを出力してゲームエンジンにインポートする場合などは特に座標系の違いは意識しなければなりません。
例として、MayaとUnreal Engine(以下UE)の座標系を比較してみましょう。
DCCツール・エンジン | 座標系 | 左右方向 | 上下方向 | 前後方向 |
---|---|---|---|---|
Maya | 右手系、Y-up | X軸 | Y軸 | Z軸 |
UE | 左手系、Z-up | X軸 | Z軸 | Y軸 |
左右方向は一致しているものの、上下と前後の方向が入れ替わっていますね。マニピュレータもこのように上下と前後の色が変わっているのがわかります。
ではジョイントはどうでしょう。Maya上で回転の向きが0,0,0となる向きでUEへインポートしてみました。するとUE上ではジョイントの向きが異なっていることがわかります。
スケルタルメッシュの内部情報を覗いてみるとジョイントに90度回転値が入っています。これはUEがMaya上のメッシュの姿勢と、見た目を統一させるため自動的に姿勢を補正した結果、ジョイントに回転値が入ることになります。
UEでルートジョイントに回転値が入ることで、コントロールリグの計算時にジョイントの回転の初期値が0,0,0で無いためこの初期値を打ち消してから回転角度を計算しなければならなくなるなど、些細なことではありますが多少面倒なことが発生する場合もあります。
そのためプロジェクトによってはMayaからUEへインポートする前提のアセットはルートジョイントにX軸-90度を入れるようにし、UEにインポートした時に0,0,0としてきれいな回転値として補正されるように調整したりするケースもあります。
Mayaの-90,0,0の回転値が、UEでは0,0,0になっていることがわかります。
このような例からも分かるように、座標系が異なるツール同士でデータをやり取りする時にはデフォルトの向きが変化するため、特にルートジョイントなどは補正されたあとの事を考慮に入れて骨の向きを決定する必要があります。
まとめ
ということで今回はジョイントの回転軸の決め方について解説してみました。いかがでしたでしょうか?
【ジョイントの向きを決める要素】
アニメーションさせやすい回転軸
ジョイントの回転順序と主軸・補助軸の決定
ミラー方向のレギュレーション
使用するDCCツールやゲームエンジンの座標系
最初にお伝えしたように、今回ご紹介したのは汎用的に使える判断基準に留めているため、後工程や使用するツールなどによってよりルールが追加される場合があります。
そのため必ずジョイントの向きについては事前に後工程のことを考慮し、担当の方がいる場合はその方と要件をすり合わせた上で決定しておくことを強くおすすめします。
でないとアニメーション工程に入った後にジョイントの向き変更など起きると関連するアニメーションがすべて再出力し直し、、、なんてこともありえます。うーん、それは面倒ですね!
くれぐれもジョイントの回転軸設定は計画的に!
最後までお読みいただきありがとうございます! ではでは~!