« ワイからさん for Maya。 | トップページ | ニュートラルじゃないやつ一歩前に出ろ。 »

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 さま。






.

|

« ワイからさん for Maya。 | トップページ | ニュートラルじゃないやつ一歩前に出ろ。 »

コメント

コメントを書く



(ウェブ上には掲載しません)




トラックバック


この記事へのトラックバック一覧です: ヂョイントらべる~~ん。:

« ワイからさん for Maya。 | トップページ | ニュートラルじゃないやつ一歩前に出ろ。 »