MayaでRigging(joint orient編)

jointOrient_eye_catchMayaでRigging

今回はjoint orient編です。キャラクターをバインドする前にjointをきれいな状態にしなければなりません。そうしないと後々やっかいなこと(問題ない場合もあるのでリガーがいない現場によってはこのようなことを考慮しないところも‥)になるかもしれません。

また、リガーとコミュニケーションをとるうえで最低限知っておかないといけない部分でもあります。これを機会にバインドされたjointにIKとコントローラーをつけるだけのリギングから一歩先に進む準備をしましょう。

実際はこうやってJoint orientを揃えたjointをコピーしてコントローラー作成用のjointをつくり、それをバインド用jointと接続します。このことについては以前の記事を参照してください。接続用のツールも用意しました。

MayaでRigging(Basic編)
「MayaでRigging」このシリーズではMayaでのリギングについて書きます。リギングといっても様々なレベルがあり、人によって認識がバラバラです。「リグなんてものは簡単だ」という人もいれば、「リグはとても難しい」という人もいます。これ...
Mayaでアトリビュートを接続するスクリプト
MayaでRigging(Basic編)で紹介した自作スクリプトの使い方について解説します。このスクリプトは名前の通りアトリビュートをコネクトするツールです。 MayaでRigging(Basic編) でも説明しましたが、...
スポンサーリンク

joint の決まりごと

上に書いたように全く考慮されない場合もありますが、本来はすべての人がこのルールは守るべきです。今はなぜこうすべきなのか理解できなくても後になって理解できることがあります(私がそうでした)。

回転の値はすべて0にする

当然ですがこれは重要です。0にすれば最初のポーズに戻ることが出来ます。

translate は X のみに数値が入っている状態(例外あり)にする

translateはXだけに数値が入っている状態にしなければなりません。例外はjointが二股、三股と分岐する場合です。

scale はすべて1にする

言うまでもないこととは思いますが、jointが細すぎる場合にスケールで解決しようとしないでください。jointが細すぎる場合は「Display > Animation > joint Size…」で変更してください。

X軸はジョイントの先(子)の方向に向ける

「Display > Transform Display > Local Rotation Axes」で表示することができます。この設定はデフォルトでそうなっているので特に気にしなくても大丈夫です。しかし、一番先(子がない)jointの場合はそうなっていません(子がないため)。

つま先などに配置する(後で使わないので消してしまうような)jointもデフォルトでX軸を先(子)の方向に向けてくれるので引いておいたほうが良いでしょう。先っぽのジョイントオリエンtを変更するほうが手間ですし、リバースフットなどを仕込む場合はつま先の位置が決まっていたほうが良いからです。

joint の引き方

jointを引くにあたって上にあげたようなルールを守らなければならないのでいろいろ制約のある中でjointを引かなくてはならないので、なにかと気を使います。

そこで私はとりあえずは自由にjointを引いて(jointを掴んで移動するのもあり)しまうことをおすすめします。その時点でしっかりjointの場所をしっかり決めてください。

そうやってjointの位置が決まったらLocatorをMatch Translation(Modify > Match Transformations > Match Translation(コンストレインの場合と選択する順番が違うので注意))してそれぞれのjointの位置に合わせます。そして、そのjointをすべて消してしまって、そのLocatorにスナップ(vを押しながらでスナップできます)させながらあらたにjointを引き直します。

ポイントコンストレインでも構いませんがpointConstraintノードを消す手間がかかります。

この方法でデフォルトで引いた場合のきれいな状態でのjointを引くことが出来ます。もっと良い方法があるとは思いますが確実な方法です。

cometJointOrient(ジョイントオリエントを変更するツール)

Mayaの標準機能だけだとjoint orientを変更するのがかなり厄介なのでツールを利用することにします。

「cometJointOrient」という私が昔から使っているツールを紹[介します。

www.comet-cartoons.com」こちらからダウンロードしてください。

「MEL Script Suite」の中にある「cometScript.zip」の中にある「cometJointOrient」というmelを使ってください。Maya6.01と書いてあることから相当古いものなので今はもっと良いものがあるかもしれませんが、慣れているのでこれを使って説明します。

cometJointOrientの使い方

まず、ダウンロードしたzipを解凍して「cometJointOrient」を「C:\Users\ユーザー名\Documents\maya\バージョン\scripts」の中に入れます(mayaを起動する前、すでに起動している場合は再起動)。ユーザー名バージョンはそれぞれの環境にあわせて変えてください。

Mayaのコマンドラインが「MEL」になっていることを確認して、「cometJointOrient」と打ってEnterキーでWindowが立ち上がります(シェルフに入れたい場合は「cometJointOrient」をシェルフまで真ん中マウスボタンでドラッグしてください)。

Window が立ち上がったら上画像のように設定します。

Aim Axis は「X」(X軸がジョイントの先(子)の方向)

Up Axis は「Y」

World Up Dir: は「0.0」「1.0」「0.0」

Tweak:は「45.0」「0.0」「0.0」(X軸を45度(45度でなくてもわかりやすい角度でOKです)ずつスナップして回転(下のボタンで+方向か-方向の回転を選べます))

Amaterasuを使用する(2020/04/22 追記)

cometJointOrientはかなり古いツールであり、英語です。その点に懸念を抱かれている方はAmaterasuという多機能プラグインの中にJoint Editorというものがあり、それを使うのも良いでしょう。無料です。

Joint Editor | KIWAMIDEN
概要 ジョイント作成に便利な機能をまとめたツールです。 使い方 Create ポリゴンコンポーネントの位置を取得して、形状にあったJointをすばやく作成できます。 Mirror Joint 設定に応じて、ジョイントを反転します。標準と異なり複数のジョイントを反転することができます。 Across 反転させる平面を選択...
Amaterasu | KIWAMIDEN
Amaterasuは、「ツール」「プラグイン」をまとめたMaya向けのツールパッケージです。 Mayaは高機能な3DCGソフトですが、作業をしていると色々な不満な点がでてしまいます。 あー!まじこの作業めんどくさい! この機能微妙!ホントヤダッ! プログラムでこんなの作れない? こういった現場の声をもとに、少しでもMa...

「Mayaでコントローラー作成」という以前書いた記事でこのAmaterasuを紹介しました。

Mayaでコントローラー作成
Mayaを長年使ってきて疑問に思うことがあります。それは「なぜこんな(簡単な、技術的に難しいわけでもない)ことが標準機能として搭載されていないのか?」ということです。その筆頭格といえるのがリグのコントローラーを作成する機能です。このことこ...

joint orient(回転の方向づけ)の調整

上の画像のような人間の左半身のジョイントを引きました。

ジョイントの名前は上の画像のようにつけました。

左半身なので腕と足のジョイントの名前には「L_」をつけてあります(後で反転コピーをする際にこのような名前にしておくと便利です)。

ここからjoint orientの設定をします。

まず、先程の「comeJointOrient」を立ち上げて、上で説明したような設定にします。

ジョイントをすべて選択して左上の「Show Axis」ボタンを押すと選択したjointの「Local Rotation Axes」が表示されます。Mayaのメニューから表示させるよりこちらのほうが便利です。

joint orient を調整するためのルール

これから書くルールに従ってjoint orientを調整します。

上で紹介したツールを使ってLocal Rotation AxesをX軸を回転させて調整します。

X軸はジョイントの先(子)の方向に向ける

これはデフォルトでそうなっているので特に気にしなくても大丈夫です。しかし、引いたjointの先端は子がないためにX軸の方向が違います。指の先端などで回転しない (後で消しても問題ない) jointの場合はそのままでも構いませんが、私の場合は見た目が美しくないので揃えてしまいます。

Z軸は同じ向きに揃える(Y軸との兼ね合いで絶対条件ではない)

Z軸の向きを揃えることによって、すべてのjointを選択して曲げるときに同じ方向に曲がります。上の画像はRotate Yですが、Rotate Zも同じように曲がります。

Y軸は曲がる外側に向ける

膝と肘の場合は一方向にしか曲がらないのでわかりやすいです。曲がらない方(膝と肘の側)にY軸を向けます。指の第一関節と第二関節の場合も同じです。

わかりづらいのは背骨の場合です。この場合は背中側にY軸を向けるのが一般的です。

私はなぜこのようなルールなのか意味がわかりませんでした。しかし、Rotate Orderのことを考えてみると繋がりました。Y軸を曲がる方向の外側に向けるとRotate Zで回転することになります。Rotate Orderが「XYZ」の場合は最も強いZ軸を使用することになります。背骨の場合も背中を前屈する場合の回転軸がRotate Zになります。

Rotate Orderについての記事は以下を御覧ください。

ジンバルロックとRotate Order
MayaでRiggingのjoint orient(ジョイントの方向づけ)の項目を書いていましたが、その前にジンバルロックとRotate Order(回転順序)の説明必要だと気づいたのでこちらの記事を先にあげます。ジンバルロックを...

半身のjoint orientを調整した状態です。

Mirrot Joints で反対側を作成する

Riggingメニューで、Skelton > Mirror Joints のオプションを上の画像のように設定します。

Mirror across: はYZにして、Mirror function をBehavior にします。

Search for: に「L_」をいれます。jointの名前をつけるときに左腕や左脚に当たる部分にこの「L_」をつけたのはこのためです。反転した側はReplace with:の「R_」に置き換えられるようになります。

反転したものはX軸が逆方向(親の方向)に向かっていますが、これで大丈夫です。

左右の脚を両方選択して左右対称に曲がるようになっているか確認します。腕についてもおなじように確認してください。

コメント

モバイルバージョンを終了
',b.captions&&s){var u=J("figcaption");u.id="baguetteBox-figcaption-"+t,u.innerHTML=s,l.appendChild(u)}e.appendChild(l);var c=J("img");c.onload=function(){var e=document.querySelector("#baguette-img-"+t+" .baguetteBox-spinner");l.removeChild(e),!b.async&&n&&n()},c.setAttribute("src",r),c.alt=a&&a.alt||"",b.titleTag&&s&&(c.title=s),l.appendChild(c),b.async&&n&&n()}}function X(){return M(o+1)}function D(){return M(o-1)}function M(e,t){return!n&&0=k.length?(b.animation&&O("right"),!1):(q(o=e,function(){z(o),V(o)}),R(),b.onChange&&b.onChange(o,k.length),!0)}function O(e){l.className="bounce-from-"+e,setTimeout(function(){l.className=""},400)}function R(){var e=100*-o+"%";"fadeIn"===b.animation?(l.style.opacity=0,setTimeout(function(){m.transforms?l.style.transform=l.style.webkitTransform="translate3d("+e+",0,0)":l.style.left=e,l.style.opacity=1},400)):m.transforms?l.style.transform=l.style.webkitTransform="translate3d("+e+",0,0)":l.style.left=e}function z(e){e-o>=b.preload||q(e+1,function(){z(e+1)})}function V(e){o-e>=b.preload||q(e-1,function(){V(e-1)})}function U(e,t,n,o){e.addEventListener?e.addEventListener(t,n,o):e.attachEvent("on"+t,function(e){(e=e||window.event).target=e.target||e.srcElement,n(e)})}function W(e,t,n,o){e.removeEventListener?e.removeEventListener(t,n,o):e.detachEvent("on"+t,n)}function G(e){return document.getElementById(e)}function J(e){return document.createElement(e)}return[].forEach||(Array.prototype.forEach=function(e,t){for(var n=0;n","http://www.w3.org/2000/svg"===(e.firstChild&&e.firstChild.namespaceURI)}(),m.passiveEvents=function i(){var e=!1;try{var t=Object.defineProperty({},"passive",{get:function(){e=!0}});window.addEventListener("test",null,t)}catch(n){}return e}(),function a(){if(r=G("baguetteBox-overlay"))return l=G("baguetteBox-slider"),u=G("previous-button"),c=G("next-button"),void(d=G("close-button"));(r=J("div")).setAttribute("role","dialog"),r.id="baguetteBox-overlay",document.getElementsByTagName("body")[0].appendChild(r),(l=J("div")).id="baguetteBox-slider",r.appendChild(l),(u=J("button")).setAttribute("type","button"),u.id="previous-button",u.setAttribute("aria-label","Previous"),u.innerHTML=m.svg?f:"<",r.appendChild(u),(c=J("button")).setAttribute("type","button"),c.id="next-button",c.setAttribute("aria-label","Next"),c.innerHTML=m.svg?g:">",r.appendChild(c),(d=J("button")).setAttribute("type","button"),d.id="close-button",d.setAttribute("aria-label","Close"),d.innerHTML=m.svg?p:"×",r.appendChild(d),u.className=c.className=d.className="baguetteBox-button",function n(){var e=m.passiveEvents?{passive:!1}:null,t=m.passiveEvents?{passive:!0}:null;U(r,"click",x),U(u,"click",E),U(c,"click",C),U(d,"click",B),U(l,"contextmenu",A),U(r,"touchstart",T,t),U(r,"touchmove",N,e),U(r,"touchend",L),U(document,"focus",P,!0)}()}(),S(e),function s(e,a){var t=document.querySelectorAll(e),n={galleries:[],nodeList:t};return w[e]=n,[].forEach.call(t,function(e){a&&a.filter&&(y=a.filter);var t=[];if(t="A"===e.tagName?[e]:e.getElementsByTagName("a"),0!==(t=[].filter.call(t,function(e){if(-1===e.className.indexOf(a&&a.ignoreClass))return y.test(e.href)})).length){var i=[];[].forEach.call(t,function(e,t){var n=function(e){e.preventDefault?e.preventDefault():e.returnValue=!1,H(i,a),I(t)},o={eventHandler:n,imageElement:e};U(e,"click",n),i.push(o)}),n.galleries.push(i)}}),n.galleries}(e,t)},show:M,showNext:X,showPrevious:D,hide:j,destroy:function e(){!function n(){var e=m.passiveEvents?{passive:!1}:null,t=m.passiveEvents?{passive:!0}:null;W(r,"click",x),W(u,"click",E),W(c,"click",C),W(d,"click",B),W(l,"contextmenu",A),W(r,"touchstart",T,t),W(r,"touchmove",N,e),W(r,"touchend",L),W(document,"focus",P,!0)}(),function t(){for(var e in w)w.hasOwnProperty(e)&&S(e)}(),W(document,"keydown",F),document.getElementsByTagName("body")[0].removeChild(document.getElementById("baguetteBox-overlay")),w={},h=[],o=0}}});
タイトルとURLをコピーしました