カテゴリー「Maya様 Scripting」の28件の記事

2019年9月18日 (水)

子供ハイライトすんな。


ツイッタで、Mayaさまの Child Highlighting をオフにすると便利、という話を見つけたので。 


ええその通りです。

っていうか 「オフにすると便利~♪」 などという呑気なレベルではありません。
オフにしないと死にます。 すぐ死にます。 今日死にます。 いいですか。 警告しましたよ。 死にます。

っていうか俺じゃなくてあなたが審で下さい Maya さま。



Maya さまのデフォルトだと、親を選択すると、子供・孫・曾孫~と、子孫全員、末代まで全部、選択ハイライト表示にしやがるじゃないですか。 もう、自分がどれを選んでいるんだか、分からなくなるんですよね。



以下の画像のような状態です。

Ch1

アウトライナを見ると分かるように、実際には joint3 と joint7 の2つを選択しているのですが、選択しているもの以下の階層全体がハイライトされるため、実際に何が選択されているのかはビューポート上の見た目では判別できません。 信で下さい Maya さま。





だからこの階層ファッキンハイライト機能を、プリファレンスでオフにしましょう。 という話です。

Ch3

ここで Never highlight に設定すればいいのですね。 もう、ネバーですからね。Don't とかじゃなくて Never ですよ。 ハイライトしちゃダメよ、くらいの軽い設定ではありません。 なにがなんでも絶対にどうやっても永遠にハイライト表示すんな(゚Д゚)ゴルァ ってことですからね。





これでめでたく、選択されているものだけがハイライトされるようになりました。

Ch2

これでいいんですよ Maya さま。 これをデフォルトの状態にした方がいいんじゃないでしょうかね Maya さま。 今では仕組みを理解したし慣れたけしオフにできるからいいけど、Maya さまを使い始めた初期の頃は、ほんとにもう、これがたまらなく使いにくくてね。どれ選んでいるのか分からないんだもん。 これだけのために、CG業界からの引退を真剣に検討しましたよ。





で、さっき気づいたのですが、Use object highlight setting なんて設定もあるんですね。

Ch4

あれえ? こんなの、前からあったっけ? 最近のバージョンで搭載された機能かな。

階層ハイライト機能を、丸ごとオンオフするのではなく、オブジェクトごとの設定に従うというオプションですね。 プリファレンスでこの設定を選んでいる状態で、オブジェクトを Attribute Editor で開き、Display > Selection の所に設定がありました。 これをオフにしておくと、そのオブジェクトのみ、階層ハイライトをオフにするということのようですね。 いじってみたところ、オフにしたオブジェクト以下の階層は、たとえ個別の設定がオンでも、階層ハイライトはされないですね。 つまりこいつをオフにしたら、そいつの子供以降は問答無用で階層ハイライトオフになるってことなのでしょうね。






でもね、階層ハイライトがオンの方が便利な時もあるわけですよ。リグやってる時とか、親子関係を確認したい時とかね。 こいつ、ちゃんとこの階層に入ってるかな、とか確認する時に親を選ぶと、目的のブツがハイライトされるかされないかでその親の階層内にあるかどうか判別できるとかね。 俺、けっこうしょっちゅうオンオフ切り替えます。 だからホットキーにしてます。



でもこれ、デフォルトだとホットキー割り当てられないですよね・・・? ホットキーエディタで探したんだが、見つけられなかった気がする。だからスクリプト書いたんですね。 それをランタイムコマンドにして、ホットキー割り当ててます。 これ、もう何年も前に書いた気がするな。大したものじゃないけど、一応載せておきます。

ダウンロード - kodomoHighlightSunna.py

 

import maya.cmds as mc
import sys
CurrentValue = mc.selectPref( selectionChildHighlightMode=1, q=1 )
NewValue = not( CurrentValue );
mc.selectPref( selectionChildHighlightMode = NewValue )
sys.stdout.write( "Child Highlighting : " + str(not(NewValue)) + "\n" )
mc.inViewMessage( amg= u"Child Highlighting (゚∀゚) : " + str(not(NewValue)), pos='topCenter', fade=True, fadeStayTime=300, fadeInTime=50, fadeOutTime=200 )


スクリプトを走らせるごとに、階層ハイライトをオン/オフでトグルします。

これをラインタイムコマンドにして、ホットキー化するのが良いと思うんですが、まあ、シェルフとかでもいいんじゃないでしょうか。 俺はホットキー化して、かなり頻繁にオンオフ切り替えてます。









こうやって Maya さまを、日々、小さく小さく調教しながら仕事しています。
俺ごとき大した改造もできないし、大げさなツールは書けません。
小さく小さく調教するのです。


っていうか調教されているのが真実だろうな。
歯を食いしばって Maya さまを使うのも、だいぶ慣れたもんな。
俺が調教されたんだな。



でも芯でください Maya さま



.

| | コメント (0)

2019年9月11日 (水)

ディスプレイタイプサイクル~~~ん。

とっさに書いてアップしてみる脊髄反射スクリプト


ディスプレイタイプサイクル~~~ん

ダウンロード - displayTypeCycloooon.py

 



選択中のオブジェクト(複数可)に対して、Drawing Overrides の中の Enable Overrides をオンにし、かつ、DisplayTypeNormal → Template → Reference でサイクルします。

Displaytype_20190911183301

 


#ディスプレイタイプサイクル~~~ん
#オブジェクト(複数可)選択して実行 → Enable Overrides をオンにしつつ、DisplayType を Normal,Template,Reference でサイクル


import pymel.core as pm
import sys

sels = pm.selected()
dispTypeStr = [ "Normal", "Template", "Reference" ]

for obj in sels:
    pm.setAttr( obj + ".overrideEnabled", 1 )
    displayType = pm.getAttr( obj + ".overrideDisplayType" )
    displayType += 1
    if displayType == 3 : displayType = 0
    pm.setAttr( obj + ".overrideDisplayType", displayType )
    
    msg =  u"[ディスプレイタイプサイクル~~ん] " + obj + " : " + dispTypeStr[ displayType ]
    sys.stdout.write( msg  + "\n" )
    pm.inViewMessage( amg = msg, pos='topCenter', fade=True, fadeStayTime=500, fadeInTime=50, fadeOutTime=500 )


 


おれ、Maya さまのディスプレイレイヤ嫌いなんですよね。使いにくいことこの上ないと思ってます。Drawing Overrides 全般を支配しちゃうんだもんな~   

なのでディスプレイレイヤを使わずに、普通にノード個別単位で Drawing Overrides をいじりたいことも多いんですけどね、でも Attribute Editor でいじるの、超絶ダルいじゃないですか。 Attribute Editor も嫌いなんですよ。 なんだこのクソUIは。 だからスクリプト書いた。 

やりたいのは、とりあえずは 「選択可・不可を切り替えたい」 だけなので、Normal(選択可)、Template(常にワイヤ表示?かつ選択不可)、Reference(選択不可)の3つのモードを、次々にサイクルしていくというものにしました。 そしたら俺的にはなかなか便利で具合が良い。 どうですかね。




| | コメント (0)

2019年8月24日 (土)

HUD にアニメーションレイヤ。

突然スクリプト。

 

HUDに現在アクティブなアニメーションレイヤを表示させるテスト

 

 

-------------------------


import pymel.core as pm

def getSelectedAnimLayer():
    return ( pm.treeView ("AnimLayerTabanimLayerEditor", q=True, selectItem=True) )

if pm.headsUpDisplay( "SelectedAnimLayer",q=1, ex=1 ) == True:
    pm.headsUpDisplay( "SelectedAnimLayer",e=1, remove=1 )

else : pm.headsUpDisplay( "SelectedAnimLayer", section=1, block=0, label='anim Layer:', command=getSelectedAnimLayer,event='SelectionChanged', nodeChanges='attributeChange' )

-------------------------

Animl

スクリプトを走らせるごとに、HUD に現在アクティブなアニメーションレイヤの表示をオンオフします。

表示は、オブジェクト選択に変化があったとき(=他のオブジェクトを選んだり、何も選んでいない状態に変わったりしたとき)にアップデートされます。

 

逆に言うと、アクティブなアニメーションレイヤが変わっても、選択しているオブジェクトが変わらない限り、表示に変更はありません。

 

ううむ、これでは不便ではないか。 むしろ、アクティブなアニメーションレイヤが変わった時にアップデートして欲しい。 

 

event というフラグが、現在は SelectionChanged になっているのですが、ここを何かに変えればいいのかな。でも何に変えればいいのか、まだ調べ切れていません。どなたか教えて下さい。

 

 

 

 

.

| | コメント (0)

2019年4月 6日 (土)

グラフエディタTRS表示フィルタサイクル~~~~ん。



Maya さまのスクリプト。書きたてホヤホヤ。ダッさいスクリプトでごめんなさい。こんなんしか書けないの。 下の方にダウンロードリンクがあります。


いや、もともとは、エイム付きカメラで作業しているときに、グラフエディタで、必要のない回転の値とかを無駄にたくさん表示しやがるので、ごちゃごちゃして見づらくてしょうがない。



やむなくグラフエディタ内で Show > Select Attributes... で表示させるものをフィルタしていたんですが、これも面倒じゃないですか。 せめて、ホットキー1つとかボタン一つで、フィルタを次々にサイクルさせられれば、ちょっとはいいかな~という程度の考えで、書いてみただけです。本当に便利かどうかは運用してみないと分からない。 全然便利じゃないかもしれない。 やってみるしかない。


 Getrsfiltercycloooon_1  


起動すると、シーンのトップ階層に、graphEditorVisibleAttributes というトランスフォームノードを作ります。この中に TRS という名前のカスタムアトリビュートがあって、その値を見て、サイクルをしています。 実行するたびにこの値が加算されて、その値によって表示するアトリビュートを変えるということです。 このようにトランスフォームノードなんかを置いて現在の値を保持するって、なんかダサいでしょうか? もっとスマートなやり方ないでしょうかね?


ただの python スクリプトです。シェルフなりどこかに登録して使えばいいと思います。俺はホットキーにするかな。


便利にしたいんだよなあグラフエディタ
どなたかダウンロードして試してみてもらえませんか


ダウンロードはこちらから


# -*- coding: utf-8 -*-
#
# グラフエディタ TRS 表示フィルタサイクル~~~~ん ver1.0
#
# グラフエディタの TRS の表示オンオフを、フィルタなし、pos のみ、rotのみ、scl のみ の4つでサイクル

import pymel.core as pm
import maya.mel as mel
import sys

def toggleVisibleAttribute( TRSName, flag, ge ):
mel.eval( "filterUISelectAttributesCheckbox " + TRSName + "X " + str(flag) + " " + ge + ";" )
mel.eval( "filterUISelectAttributesCheckbox " + TRSName + "Y " + str(flag) + " " + ge + ";" )
mel.eval( "filterUISelectAttributesCheckbox " + TRSName + "Z " + str(flag) + " " + ge + ";" )

##############
groupNodeName = "graphEditorVisibleAttributes"
groupNode = pm.ls( groupNodeName )
if not groupNode :
#print( "creating." )
groupNode = mc.group( empty=True, name=groupNodeName )
pm.addAttr( groupNode, longName="GE_TRS_Visible", attributeType='long', min=0, max=3, defaultValue=0 )
pm.setAttr( groupNode + ".GE_TRS_Visible", e=1, keyable=1)

else : groupNode = groupNode[0]

TRS_Visible = pm.getAttr( groupNode + ".GE_TRS_Visible" )
#print( "TRS_Visible = " + str(TRS_Visible) )
TRS_Visible += 1
if TRS_Visible == 4 : TRS_Visible = 0
##############

fuckinGraphEditors = pm.getPanel(scriptType="graphEditor")

for item in fuckinGraphEditors:
ge = str(item) + "OutlineEd"

if TRS_Visible == 0 :
toggleVisibleAttribute( "translate", 0, ge )
toggleVisibleAttribute( "rotate", 0, ge )
toggleVisibleAttribute( "scale", 0, ge )
msg = u"TRS 全部表示 (/・ω・)/ グラフエディタ~"

elif TRS_Visible == 1 :
toggleVisibleAttribute( "translate", 1, ge )
toggleVisibleAttribute( "rotate", 0, ge )
toggleVisibleAttribute( "scale", 0, ge )
msg = u"pos のみ表示 (/・ω・)/ グラフエディタ~"

elif TRS_Visible == 2 :
toggleVisibleAttribute( "translate", 0, ge )
toggleVisibleAttribute( "rotate", 1, ge )
toggleVisibleAttribute( "scale", 0, ge )
msg = u"rot のみ表示 (/・ω・)/ グラフエディタ~"

elif TRS_Visible == 3 :
toggleVisibleAttribute( "translate", 0, ge )
toggleVisibleAttribute( "rotate", 0, ge )
toggleVisibleAttribute( "scale", 1, ge )
msg = u"scl のみ表示 (/・ω・)/ グラフエディタ~"

pm.setAttr( groupNode + ".GE_TRS_Visible", TRS_Visible )
sys.stdout.write( msg + "\n" )
pm.inViewMessage( amg= msg, pos='topCenter', fade=True, fadeStayTime=900, fadeInTime=50, fadeOutTime=200 )

 

 

.





| | コメント (0)

2018年7月17日 (火)

子供を複製すんな。

.





Mayaさまで、子供を持つオブジェクトを複製すると、子供ごと(階層ごと)複製されちゃいますよね?



XSI の場合は、ノード単体で選んでいればそのノードだけが複製され、ブランチ選択されている場合は階層ごと複製されるという、非常に合理的かつ分かり易いものでした。  Maya さまは有無を言わせず階層丸ごと複製してしまうように見える。



子供複製すんなやゴルァ
このオブジェクトだけ複製したいの。
子供は要らないの。
オプションつけろやゴルァ




と思っていたんですが、ツイッタで教えてもらいました。


duplicate コマンドpo オプション(parentOnly)を付けるだけで良かったんですって。 



MEL

duplicate -po
ドキュメント



マジで!

こんな小さいことが、大革命ですよ俺には!

わあ、これもっと早く知りたかったw

ありがとうございます K.Yさん。





さっそくランタイムコマンドにして、ホットキー割り当てました。



でもこれ、なんで標準機能として無いのだろう。 こんな短いスクリプトで済むからまあいいけど、でもスクリプトなんか書かなくても普通にできて欲しいことだと思うんだけどなあ。 Maya な皆さんは、不便じゃないんですか?   Mayaさまを馬鹿にしているとか、ユーザさんに嫌味言っているとかじゃなくて、ほんと正直、単純に、不思議です。 俺の方がおかしいのか。 子供ごと複製する場合の方が圧倒的に多いのか。 いや~ 子供ごと複製したい時と、子供は要らない時と、どっちも同じくらいあるでしょう~  



そんなことないですか。

そうですか。





.

| | コメント (10) | トラックバック (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月18日 (金)

こいつのキー全部選択してください。

.





選択中のキーを元に、そのアニメーションカーブにあるキーフレーム全部を選択するというスクリプトであります。



なんてことはない。  コメント除けば実質3行w

でも意外と便利に使ってますよ。



Python:

# -*- coding: utf-8 -*-
#
#    jjjPleaseSelectAllKeysOnThis.py
#    こいつのキー全部選択してください。
#
#    選択中のキーフレーム(複数Fカーブ可)からFカーブ全体を選択するスクリプト

import pymel.core as pm

#    選択中のキーからFカーブ取得
selectedAnimCurves = pm.keyframe( q=True, selected=True, name=True )

#    選択中のFカーブを対象に selectKey コマンドでキーを一網打尽
if len(selectedAnimCurves) != 0 : pm.selectKey( selectedAnimCurves, r=1 )

ダウンロード jjjPleaseSelectAllKeysOnThis.py (0.5K)





Maya さまのグラフエディタは、2017 以降すんげえ良くなったけど、やっぱり使いにくいことには変わりなくてね。

↓ こういう場合めんどくさいといつも感じます

Keysel1

この、Rotate Y のキーだけを、全部イッキに選択したい。 カーブ丸ごとドラッグして値やタイミングを変えたいとか、そういう時ね。

でも、目的のキー全体を囲うようにマウスドラッグすると、 その範囲に入った他のキーまで選択されやがりますよね。

何を当たり前のことを、と思うかも知れませんが、XSI 村ではですね、まずはキーなりFカーブなりを選択すると、次のドラッグではそのFカーブの中からしか選択できなくなってくれるんですよ。

つまり、Y のキーだけ選びたい、とかそういうことがすんげえ楽にできるんです。 いちいちFカーブの表示をオンオフしたり、左側のアウトライナなどにマウスポインタを持っていくことなく、サッと目的のキーのみ選択できるということです。   これがどれだけラクなことなのか想像できないあなたは、生粋のMaya インペリアル人です。




↓ で、やむなく、左側のアウトライナからアニメーションカーブを選択する。

Keysel2

こうすると、そのカーブが単独表示になりますよね。

この状態で、ガッとマウスドラッグして全部のキーを選択してしまう。

そのままいじってもいいけど、やはり、他のアニメーションカーブを見ながら、相対的な値を考慮しながら、いじりたいじゃないですか。 このままだと選択中のアニメーションカーブしか見えてないわけですから。



↓だからやむなく、左側のアウトライナでオブジェクト名をクリックして、全アニメーションカーブを表示復活させます。 

Keysel3

幸いにもこの時にキーの選択状態が変わったりはしないので、めでたく、「全カーブを見ながら、イッキに選択したキー全部をまるごとドラッグできる」 状態になりました。 ふう・・・・。



でもこれ、すんげえめんどくせえじゃないですか。

たったこれだけのことで、いったい何回クリックしたり、マウスをあちこちに動かさなければいけないんですか Maya さま。  支んで下さい Maya さま。





なので、ちょっとでも楽にならないかな、と思って書いてみたのがこのスクリプトです。

まずはキーを選びます。1個でも、いくつでも。 その状態でこのスクリプトを走らせると、そのキーが所属するアニメーションカーブ全体が選択されるというものです。

俺はホットキーに登録して使っています。 左側のアウトライナに手を伸ばさずに済むだけ、楽に感じます。 ホットキー押す手間はあるけど、マウス位置をあんまり動かさなくていいので、ラクだと思いました。





↓ ちなみに、選択を 「キー」 ではなく 「カーブ」 にすれば、カーブあるいはキーに触れた瞬間、アニメーションカーブ丸ごと選択されてくれますね。

Keysel4

これ、Curve の項目にたしかデフォルトで M のホットキーが付いてたんだよな。 でも 2017 だと、なぜかそのホットキーバインドが2重で登録されていて、片方を消さないとホットキーが効かないみたいなアフォな不具合があった気がする・・・。

いちいちこのメニューを出すのはもちろん面倒なので論外ですが、ホットキーさえちゃんと効く状態にしておけば、今回のこのスクリプトなんて使わずとも、ホットキーポンでカーブ選択モードになって、カーブ全体を選択後にまたホットキーでポンと戻せばいいかな、とも思いました。

でも全フレキーだったりすると、カーブとして選ぶのが困難なんだよな。 キーとキーの間の線の部分を狙ってクリックしないといけないからな。 これは論外か。  だから、ホットキーポンで、 Curve がオンかつ Key がオフという状態になればいいのかな。 これはこれでスクリプト書く必要がありますね・・・・・



グラフエディタ、もっと進化しないとですね~
だいぶ良くなったけど、まだまだですね~


俺は人生の大半の時間をグラフエディタの中で過ごしてしまっているので、ここ重要なんです。


やむなくたくさんスクリプト書きますが、Maya さまのキーフレーム系、アニメーションカーブ系のスクリプトって、ほんと書きにくい orz  

Fカーブオブジェクト、Fカーブオブジェクトのコレクション、そこから取得できるFカーブキーオブジェクトおよびコレクション。 こんな風にXSI 村では関連するオブジェクトを芋づる式に取得できたのでそんなに苦でもなかったのですが・・・・・ 


Maya さまの場合、選択中のキーからアトリビュートの名前を文字で取って、それを元に、フレームいくつからフレームいくつまでこれやって下さい、みたいな、そんな書き方なのかな? 全然しっくり来ないんだよなあ。
コマンドも keyFrame とか keyTangent とか selectKey とかに分かれていて分かりにくいし、ゲットもセットも同じコマンドのフラグ違いとか。  取得できるのはキーオブジェクトじゃなくてキー時間のリストだったり。
 
取得したものからメソッドやプロパティを使って連鎖的に何かをする感じがなく、 ぜ~~んぶ文字列とかで情報ゲットして、最後にコマンドに情報全部羅列して食わせてやっと何かできるみたいな?  違うことやろうと思ったら取得のプロセスをルートパスからやり直しているような、なんかそんなイメージがあるんです。 これまた頭から取得すんの?  みたいな。 


・・・・・うーむ、上手く説明できないし、なんかこう、不正確なこと言ってたらすいません。 でもほんと、キーフレーム系、グラフエディタ系はほんと、何度書いてもピンと来ない感じです。 しんどい。


カンニング集みたいなのまとめるしかないな。 考えるのは最初の1回だけで、1か所にまとめてメモしておけば、あとはコピペすりゃいいやみたいなやつ。  いつかそういうのまとめたい。 です。 しんどい。






.

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

2018年5月16日 (水)

再生速度トグる~~~ん。

.


またもや発作的に書いたスクリプトを載せてみるんですけどね。


なんかヘンなところあったら突っ込み下さいね。 シロートがほんと、手探りで書いているようなものなので・・・・





ビューポートの再生速度を、通常の 0.5 倍とか2倍とか、スピードを切り替えることができますよね。  


でもいちいち Preference 開くのが面倒なので、n倍の速度で再生する、っていう n の数値を2つだけ登録しておいて、その2つの値でトグルするというスクリプトです。



Pyhon:

# -*- coding: utf-8 -*-
#
#    jjjPlaybackSpeedToggleooon.py
#    再生速度トグる~~~ん
#
#    再生速度を2つの値でトグルするスクリプト
#    1倍速再生と 0.5倍速再生を切り替えるとか。 スクリプトの冒頭の2つの値を適当に書き換えて運用
#    モーション作業でこれ欲しいときあるじゃないですか。いちいち pref 開くのめんどくせえし。


#再生速度切り替えの数値  テキトーに書き換え
speed1 = 0.5
speed2 = 1.0

import sys
import pymel.core as pm

#現在の再生速度取得  play every frame = 0.0
currentSpeed = pm.playbackOptions( playbackSpeed=1, q=1 )

#    Play Every Frame だった場合 = 最大再生速度を2つの値でトグル
if currentSpeed == 0.0 :
    currentMaxSpeed = pm.playbackOptions( maxPlaybackSpeed=1, q=1 )
    #print ( "play every frame : currentMaxSpeed = " + str( currentMaxSpeed ) )
    if currentMaxSpeed == speed1 : pm.playbackOptions( maxPlaybackSpeed=speed2 )
    else : pm.playbackOptions( maxPlaybackSpeed=speed1 )
    
    currentMaxSpeed = pm.playbackOptions( maxPlaybackSpeed=1, q=1 )
    msg = u"再生速度 = 全フレ再生 : 最大速度 =  " + str(currentMaxSpeed) + u"   (゚∀゚)"

#    Play Every Frame じゃなかった場合 = そのまんま再生速度を2つの値でトグル
else:
    #print ( "currentSpeed = " + str( currentSpeed ) )
    if currentSpeed == speed1 : pm.playbackOptions( playbackSpeed=speed2 )
    else : pm.playbackOptions( playbackSpeed=speed1 )

    currentSpeed = pm.playbackOptions( playbackSpeed=1, q=1 )
    msg = u"再生速度 =  " + str(currentSpeed) + u"   (゚∀゚)"

#    結果をお知らせしておしまい。    
sys.stdout.write( msg + "\n" )
pm.inViewMessage( amg= msg, pos='topCenter', fade=True, fadeStayTime=1500, fadeInTime=100, fadeOutTime=400 )

ダウンロード jjjPlaybackSpeedToggleooon.py (1.7K)


Playbackspeed

↑ここの設定のことです。

いちいち Preference 開くの面倒だから、ホットキーにしたくてね。 当然のことながら、ホットキーにするなり、すぐに手が届くシェルフとかに登録するなり、 Preference を開いてこの設定をいじるよりもラクな起動方法で使わないと意味ないですね。




モーションビルダーは、確か UI 上にこの設定が出ているんじゃなかったっけ? すぐに切り替えられて便利でしたよね。  Maya さまもそうだといいのになあ。 なぜ Preference の奥に隠してしまうのだ。 前から、楽にこれが切り替えられるといいなあと思ってたんですが、なんか書けそうな気がしてしまったので、今日書きました。 こんなんで合ってるかなあ?



再生速度が Play Realtime の時は、単に再生速度を2つの値でトグルします。  Play Every Frame の時は、最大再生速度の方を2つの値でトグルします。  2つの値は、スクリプトの冒頭の数値を好みで書き換えればいいんじゃないのかな。 デフォルトでは 1 と 0.5 です。 つまり、1倍速=ノーマル速度と、 0.5倍速=半分の速度(ゆっくり)のトグルになります。

アレですね、例えば 60fps のゲームモーションなんかをいじっている時に最も使いたくなりますね。 特に、クイックで激しいモーションとかは、カクりとか、軸のブレみたいなのを見つけるのに、ゆっくり再生してみたくなる。 そんな時にポンポンと気軽にスピードを切り替えたいという、アレです。






ちなみにですが、ずいぶん前にも書いた けど、heads up display の FPS 表記は、1ビュー再生の時以外は信用しちゃダメですからね。 

さっきも Maya 2018 で試してみたけど、まだ直ってねえや。 2倍速だろうが 0.5 倍速だろうが、2ビュー以上で再生すると不正確な数値が出てます。  嘔吐デスクさま、いつまで放置すんの。 やる気あるんでしょうか。 



まあ、ないですよね。 

知ってます嘔吐デスクさま





.

| | コメント (0) | トラックバック (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)