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

2019年1月25日 (金)

IK ハンドル作成のクリックで激怒。

.


Maya さま。

久しぶりにホネ入れる作業をして、また迷ってしまった。 以前にツイッタで教えてもらったはずだったんだけど、忘れていて、戸惑ってしまった。

Maya さまで、ヂョイントに IK ハンドルを入れる時のクリックの操作についてです。

結論から言うと、ビューポート、ハイパーグラフ、アウトライナ、この3つで同じ IK ハンドル作成のクリック操作が統一されていない。アフォですか Maya さま。 という罵倒記事です。




下の画像のような状態。ヂョイントが3つ。人間の腕とかのヂョイントですね。 ここに IK ハンドルを入れます。

Ikh1

Create IK Handle ツールを起動した後、ビューポート上で、 joint1, joint3 の順にクリックすると、IK ハンドルが現れますよね。 手首をつかんでヒジが曲がるような IK の設定ができました。 はい。 何も問題ないです Maya さま。




ですが、諸般の事情で、ビューポート上ではなく、ハイパーグラフ上でヂョイントをクリックしたい場合もあるんですね。 ヂョイントが混み合っていて、ビューポート上では狙った1つをクリックしづらい時とかですね。



でもね、ハイパーグラフ上で同じ操作をしても、ダメなんですよ。  ツール起動後、 joint1 と joint3 を順にクリックしても、何も起こらないの。




で、教えてもらったのが、ハイパーグラフ上では、2つ目のヂョイントのクリックは、Shift を押しながら行う必要があるということでした。 

Ikh2


1の時は、Shift 押してても、押してなくても、OKです。 2のクリックの時は、Shift 押してないとダメですよ。  なんだかねえ。



ビューポート上では Shift なんて要らないのに、納得いきませんが、まあ仕方ない。 こういうもんだとあきらめましょう。 忘れないようにしないと、また慌ててしまう。







で、ハイパーグラフではなく、アウトライナでこの操作をやりたいことも、当然あるわけですよ。


ってことで、アウトライナ上で同じ操作をやってみます。 ビューポートの時のように普通にクリックじゃダメです。 じゃあハイパーグラフの場合を真似て、Shift を押してクリックしましょう。

Ikh3

あれ?  ツールを起動後、1 をクリックして、次に Shift 押しながら 2 をクリックしたら、普通に複数選択になっちゃったよ?


そうか、アウトライナだから、Shift クリックは、最初のクリックとの間にあるものを全部、複数選択にするのか。 まあ、当たり前と言えば当たり前か。

でもハイパーグラフと操作を統一しようとか思わないの Maya さま? Shift じゃないの? 馬鹿なの?






で、結論を言うと、アウトライナ上では ctrl です。 2のクリック時に、ハイパーグラフとは違って、 ctrl 押しながらクリックしてください。 orz

Ikh4





ビューポート上では、ただのクリック。

ハイパーグラフ上では、Shift + クリック。

アウトライナ上では、ctrl + クリック。



いつも通り、アプリケーション全体で徹底的に統一されたこの不統一さ。

Maya さま。今日死滅して下さい。







覚えておきましょう。
忘れていて今日慌てたので、メモでした。



死滅して下さい。






.

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

2018年6月28日 (木)

シーンにあるコンストさん全部一気に選択。

.





すいません、そういう機能、標準では存在しないですよね・・・・?

シーンの中にある、コンストレインを全部選択するって。




無いように見えたので、書いてしまったんですが。

↓ ほら、ここにありそうなもんですが、

Selectallcns

無いですよね?




だから書いちゃったんだけど、まあ、どうでもいい短いスクリプトですが。

Python:

# select all constraint nodes in the scene
import pymel.core as pm
pm.select(pm.ls(type="constraint"), r=1); 

こんなんで大丈夫そうですかね。

アレか、アウトライナとかで何かのモードにすると、コンストレインノードだけどわーーーと表示されて、それを一気に Shift 選択するとか、そういうのなら標準機能だけで可能かな? いや、そんなの無いかな? まあいいや。


リグ作業をしてたりすると、コンストレインだけ一気に選択して Set を作りたいとかね、そういう場面があったので、書いたのでした。 どうでもいいスクリプトですね。 

Maya の皆さんは、こういうの、みんな自前でサッと書いちゃうんですよね? 主に MEL で。  各社、各人、それぞれがあまりにもサッと自前で書き過ぎていて、それゆえにおそらくは不満も無く、こういう機能が必要だとかは思わないんですよねえ多分。 俺のようなその方面の能力に長けていない人間は、こんな小さいことで、いちいち苦労してますw





.

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

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)