カテゴリー「Maya様 Rigging」の3件の記事

2018年5月11日 (金)

ニュートラルじゃないやつ一歩前に出ろ。

.


リグのコントローラとかって、初期状態の TRS が 000, 000, 111 であることが望ましいですね。 リセットすればデフォルトポーズに戻る、みたいなね。   XSI 村出身の人間は、これを 「ニュートラル状態」 「ニュートラルポーズの状態」 と言ったりしますね。 



XSI の Set Neutral Pose。 素晴らしい機能だったね。 Maya さまにはこれが無いんだよなあ。 Freeze じゃないですよ。 ニュートラルポーズは可逆性のものです。 アトリビュートとして、ニュートラルになるためのオフセット値を保持しているというものです。  Maya さまの Freeze は基本的に不可逆じゃないですか。  


それに、Maya帝國の人々はなんでもかんでもこの Freeze をしたがる傾向があるように思えますね。 チュートリアルビデオとかで、 「値が入っていてはいけない。 必ずフリーズして、かつヒストリ削除」 っていつも言ってるもん。  

ヒストリ削除はもちろんいいとして、フリーズの方は時と場合に依りますよねえ。  それフリーズしてしまったら、傾きの数値とか分かんなくなるじゃねえかーーーーっ  てのが多い。 

この無条件フリーズ教の教義は間違っていると俺は思う。 残しておかなければいけない数値も多い。  だからニュートラル状態にしたい時はトランスフォームノード(グループノード)などを親に挟むなどの方が良い場合も多い。 俺は自作の ぬるぬる というツールでやったり、 ys さんのスヴァらしき SiSideBar にモロその機能があるのでそれを使ったりしてます(そういえば、この機能は俺が ys さんにリクエストして搭載してもらったんだっけ? どうだったっけ?)。




で、本題はそれじゃなくて、ええと、ニュートラルになったかどうかのチェッカが欲しかったのですよ。 

リグ作業とかやってて、最後に、各コントローラがちゃんとニュートラルの状態になっているかどうかをチェックするツールね。  別にどうということはない、選択したオブジェクトの TRS がニュートラルになってるかどうかを次々に調べてくれるだけのスクリプトです。 

いつものように屋良マーティンくんに教えてもらったりしながら書いてみたんですが、こんなんで合ってますかね?  一応、正しく機能しているようには見えるんですが、おかしいところあったら、どなた様でも、なにとぞ教えて下さい。


Python:

# -*- coding: utf-8 -*-
#
#    jjjStandForthNonNeutralGuys.py
#    ニュートラルじゃないやつ一歩前に出ろ。
#
#   オブジェクト(複数可)を選んで実行。ニュートラルじゃないやつだけ選択に残る

import pymel.core as pm
import sys

##########################
def roundVal( inList ):
    retList = []
    for i in inList:
        retList.append( round( i, 10 ) )

    return retList
##########################

sels = pm.selected()
motherFuckers = []

if len(sels) != 0:
    for obj in sels:
        if obj.nodeType() == "transform" or obj.nodeType() == "joint" :
            t = roundVal( pm.xform( obj, q=1, translation=1, objectSpace=1, relative=1 ) )
            r = roundVal( pm.xform( obj, q=1, rotation=1,    objectSpace=1, relative=1 ) )
            s = roundVal( pm.xform( obj, q=1, scale=1,       objectSpace=1, relative=1 ) )
 
            if not ( t == [0,0,0] and r == [0,0,0] and s == [1,1,1] ):
                motherFuckers.append( obj )
                pm.warning( obj + u" -- お前一歩前に出ろ。 : " + str(t) + ", " + str(r) + ", " + str(s) )
        
    pm.select( motherFuckers, r=1 )
    if len( motherFuckers ) == 0 : sys.stdout.write( u"ニュートラルじゃない野郎はいませんですた。" )
    else : pm.warning( u"ニュートラルじゃない野郎を選択しますた。 : "  + str( len( motherFuckers ) ) )

ダウンロード jjjStandForthTheNonNeutralGuys.py (1.3K)

こういうことでいいのかなあ。


各オブジェクトの TRS値を取得するのに xform コマンドを使っていますが、relative フラグがほんとに要るのかどうかとか、実はよく分かってません(汗



あと、TRS を持たないオブジェクトを選んでいたらエラーになるので、 nodeType を調べて  "transform" か "joint" だったら処理するようにしているつもりなんですが、この2つ以外に TRSを持っている種類のオブジェクトってありますでしょうか? これ実は前から知りたかった。 

Light とか Camera は、transform で引っかかってくれるからこれでいいんだけど、joint は TRS 持っているのに、nodeType の分類は transform ではないんんですよね。 joint の他にもそういうタイプのもの、あるかなあ? と思って。  どなた様でも、知っていたらなにとぞ教えて下さい。











さあこのスクリプトを使って、ニュートラルにし忘れているコントローラを見つけよう。 全員きっちりニュートラルになれば、こいつのリグ作業はたぶん終わり。 またひとつクソリグを作ったぜ。 けけけけけけけけ。  


リグには2種類しかない。 リグとクソリグだ。  


世の中にあふれるクソリグを集めて1冊の本にしたい。  世界クソリグ大全。  愛情あふれるクソリグの解説を書きたい。  俺自身も立派なクソリガーになって、俺のクソリグをその1ページに入れるんだ。 けけけけけけけけ。



.

| | コメント (2) | トラックバック (0)

2018年5月 3日 (木)

ヂョイントらべる~~ん。

.





またもや唐突にスクリプトを載せてみる。

たったさっき書いたやつ。


Dyointlabeloooon_2



ヂョイントを選んで実行すると、名前を元にヂョイントラベルの設定をします。



誰か使ってみてくれないか。 おかしいところ教えてくれないか。 書きたてホヤホヤで、まだちっとも練られてないですけど。



ダウンロード jjjDyointLabelooon_alpha1.py (2.1K)

Python :

# -*- coding: utf-8 -*-
#
#    jjjDyointLabeLoooon.py
#    ヂョイントらべる~~ん
#
#    ジョイントのラベル設定の自動化を試みたスクリプト
#    スキンウェイトのミラーで重要かと思って。
#    ヂョイントの名前付けがちゃんと終わっていることが前提
#    ヂョイントを選んで実行
#
#    例) ヂョイント名 = jnt_L_arm1  --->  ラベル = arm1(L)

import pymel.core as pm

#   ここらへんテキトーに書き換えて下ちい
strToDel = "jnt"    #   ← ヂョイントの名前に入っている文字列で、ラベルに入れたくないものがあれば
cSideList = [ "_C_", "_c_", "_CENTER_", "_center_", "_Center_", "_CT_", "_ct_", "_Ct_" ]
lSideList = [ "_L_", "_l_", "_LEFT_", "_left_", "_Left_", "_LFT_", "_lft_", "_Lft_", "_LT_", "_lt_", "_Lt_" ]
rSideList = [ "_R_", "_r_", "_RIGHT_", "_right_", "_Right_", "_RGT_", "_rgt_", "_Rgt_", "_RT_", "_rt_", "_Rt_" ]

def machoInList( inObj, inList ):
    for item in inList :
        if item in str(inObj):
            matcho = item
            break
        else : matcho = ""

    return matcho

def fuckinDyointSide( dyointName ):
    
    L = machoInList( dyointName, lSideList )
    R = machoInList( dyointName, rSideList )
    C = machoInList( dyointName, cSideList )
    
    if   C != "" : return [ dyointName.replace( C, "" ), 0, "Center" ]
    elif L != "" : return [ dyointName.replace( L, "" ), 1, "Left" ]
    elif R != "" : return [ dyointName.replace( R, "" ), 2, "Right" ]
    else         : return [ dyointName,                  3, "None" ]

############################
sels = pm.selected()
for dyoint in sels:
    
    if pm.objectType( dyoint, isType="joint" ) :
        
        dyointName = str( dyoint ).replace( strToDel, "" )
        dyointSideList = fuckinDyointSide( dyointName )
        
        pm.setAttr( dyoint + ".type", 18 )
        pm.setAttr( dyoint + ".drawLabel", 1 )
        
        pm.setAttr( dyoint + ".otherType", dyointSideList[0] )
        pm.setAttr( dyoint + ".side", dyointSideList[1] )
        
        sys.stdout.write( dyoint + " --> " + dyointSideList[2] + " : " + dyointSideList[0] + "\n" )
         


俺、まだスキニング周りが不慣れでよく分かってないかもだけど、ええと、Maya さまでスキンウェイトを左右対称コピーするときって、ヂョイントの名前を基準に L R の対応マッピングを決めるわけじゃないんだよね?


名前の代わりに Joint Labelling の文字と Side の値を使ってマッピングはできるように見える。  そのためにも、ラベル付けはちゃんとやっておかなければいけない気がしている。 


Mirrorw

ウェイトのミラーリングだけでなく、ウェイトの設定の時も、この名前のホネはどれだ? ってのちゃんと視覚的に分かるためにも、ラベルが必要な気がするね。  XSI ならウェイトエディタでホネ選ぶとハイライトされて判別が付くので、ラベル的なものはあんまり要らないんだけどね~


でもこのラベルをいちいち設定していくのが超めんどくさい。 補助ツールは標準機能で少しあるけど、これがまたちっとも使いやすくない。


だから、ジョイント名を元にラベルの設定を自動化できればいいなと思ったわけですよ。 どうですか。  どのみちオブジェクト名をちゃんと付ける習慣は持っているのでね、その名前を利用できれば、ラベル設定のコストが最小限になるかなあ、と。  ネットで少し探してみたら、そういうツールはあったけど、名前を元に自動判別してくれるわけではなかったので、ちょっと使いづらかった。 だから書いてみた。




そもそもね、名前でマッピングしてくれればそれでいいんですよ Maya さま。 XSI みたいに、シンメトリマッピングテンプレートのようなものがあればそれで済むじゃないですか。 アレさえあれば、たとえ名前の付け方がテキトーでも、左は hogehoge_joint、 対応する右は hageJoint2 みたいに強引に対応を決めることすらもできちゃうわけでね。


どうしてもラベルを使えと言うならば、このスクリプト程度の自動化補助ツールは搭載して欲しいなあ。  っていうかウェイトのミラーリングのデフォルト設定で、左右のマッピングが Closest Joint になっているのも、なんかおかしいと思う。 複数の骨の位置がぴったり重なっている場合なんてよくあるわけで、骨の位置を見てマッピングするなんて、そりゃおかしい結果になることが多いだろうなあ、とか思うわけです。






ほんと、ひとつひとつの機能が、親切過ぎる不親切さで作られていますね Maya さま。






.

| | コメント (0) | トラックバック (0)

2018年4月26日 (木)

なんでジョイントをイッキに選ばせてくれないんですか。

.




Mayaさまって、ビューポート上でイッキにジョイントを選ぼうとマウスドラッグしても、親のジョイントしか選ばせてくれないですよねえ?




Jointsel1


                 ↓


Jointsel2




なぜなんでしょう。
親だけが選ばれてくれた方が都合のいい場合って、
どういう場合なのでしょう。

おれ、本当に想像できなくて。

普通に子供まで選ばせて頂きたいのですが。
Maya さま。




と、もう何年も思い続けてきたのですよね。


人に聞くと、大抵、ジョイント選んで Select > Hierarchy ってやれば全体選択できるよ、と言われるんですが、必ずしも全体を選択したいわけじゃない時も多いじゃないですか。 10階層あるジョイント階層の中の、第2ジョイントから第6ジョイントまで選択したい時とか、あるじゃないですか。 普通にビューポートで、選択範囲に入ったやつだけ、親だろうが子だろうが複数イッキに選択されて欲しいんだよなあ。



あと、ジョイント階層の中にジョイント以外のものが入っている時、それは選択したくないって場合も多いんですよね。 例えばジョイントの表示上の太さを変えたい時とかね。 ジョイント以外のものが選択に含まれていると、Radius のアトリビュートがチャネルボックスに現れてくれないもんだから。   だから、Select > Hierarchy じゃ都合悪い場合も多いわけですよ。 まあ、いったん Select > Hierarchy してから、要らないものはちまちま選択から外していくという作業をすればいいんですけどね。 でももちろん、それも面倒です。数が多いと無理ですよ。



今のところ、アウトライナなどで選択するか、どうしてもビューポートで選択したい時は Shift + クリックを繰り返すとかしていますが、面倒です。すんげえ面倒です。 面倒というだけでなく、なんかこう、馬鹿馬鹿しい気がして、非常にストレスフルです。 納得いかない感がつのると言うか。



で、さっき、スクリプトで少しは楽にできないかな~と思って書いてみたら、まあなんか、ちょっとだけマシになったかな、と思いました。 ちょっとだけです。 ほんのちょっとだけ。


python:
#jjjSelectGoddamnJointsOnly
import pymel.core as pm
pm.select( hierarchy=1 )

goddamnJoints = pm.ls( sl=1, type="joint" )
pm.select( goddamnJoints, r=1 )

ジョイント(複数可)をまず選んで、実行すると、その階層下のジョイントだけを、最下層まで、イッキに選択します。

つまり、Select > Hierarchy に 「ジョイントしか選択に残さない」 という機能を付けただけです。実際コードもそのまんまです。いったん Select > Hierarchy を実行して、そこからジョイントだけを抽出しているというコードになっています。
だから、マウスドラッグで一気に選択できない問題は何一つ解決してないです。 せめてこれだけでも、と、ジョイントだけを選んでくれるようにしたら、ちょっとだけ便利な場合が増えましたというだけのことです。 むしろため息の方がつのるw





これ、なんとかならんでしょうか?

俺が知らないだけ?

マウスドラッグで、親だけでなく全部、フツーに選びたいのですよ。


Maya さま?






.

| | コメント (6) | トラックバック (0)