2017/12/12

maya : 選択しているチャンネルボックスで、グラフエディタのFCurve表示

こっちのほうが、使いやすいかも。
UIいらんな…。


# -*- coding: cp932 -*-
# FCurveSelectorChannelBox.py

import pymel.core as pm

# グラフエディタを取得。カスタムグラフエディタ対応で複数のエディタを見に行く
for ge in pm.getPanel(scriptType="graphEditor"):
    # グラフエディタ内アウトライナの選択を一度解除
    pm.selectionConnection(ge.name()+"FromOutliner",e=1,clr=1)
    for obj in pm.selected():
        for a in pm.channelBox("mainChannelBox",q=1,sma=1):
            # 各アトリビュートのFCurveを表示
            pm.selectionConnection(ge.name()+"FromOutliner",e=1,s=obj.attr(a))


2017/12/05

maya : 骨にヘアを揺れ物シミュレーションするツール YURAYURA.py


髪の毛などの数珠繋ぎ階層にヘアシミュレーションをかける揺れ物ツールです。

ダウンロード

使い方:

このスクリプトを、そのままシェルフ登録に出来ます。

プラグインとして使用する場合は、mayaのscriptsフォルダに
このファイルを入れます。
C:\Users\[user]\Documents\maya\scripts
もしくは、PYTHON_PATHが設定してある場所でもOKです。

実行コマンド
import YURAYURA;YURAYURA.YURAYURA()

ツールを実行するとUIが立ち上がります。

GENERATE:
髪の毛のルートを選択して、GENERATEボタンを押すと
YURAYURAシミュレーションセットが作られます。
複数選択でき、一度作成した後でも追加で使用できます。

MODIFY:
SETTING欄の数値を変更して、下にあるMODIFY SETTING ( REFRESH )
ボタンで適用できます。

COLLIDE:
コリジョンをセットしたい場合は、コリジョンオブジェクトを選択して
ADD COLLIDEボタンを押します。

BAKE:
シミュレーション結果が良さそうであれば、BAKEボタンを押すと
元に選択していた階層すべてのRotateにBake Simulationをかけます。
YURAYURAシミュレーションセットは消去され、UIも閉じます。


動画の途中で、ikHandleのInherits Transformをカチカチっとやってますが
ikHandleのリフレッシュがうまく行われず、なんらかのアトリビュートを
いじれば、ちゃんとした結果になるようです・・・。
自分のセットアップが悪いのかも知れませんが・・・。
解決法があれば、教えていただきたいです。


2017/11/29

maya : 選択しているFCurveをリダクション



自分でも書いてみました。
キャプチャエディットしてると使いたくなります。
やっぱり便利です。

YAMATANI.py


# -*- coding: cp932 -*-
# YAMATANI.py

import pymel.core as pm

# FCurveノード名を取得
lfcv = pm.keyframe(q=1,n=1)
for fcv in lfcv:
    ld = [] # 消去するキーのインデックスリスト
    # FCurveの時間、値のリスト取得
    lv = pm.keyframe(fcv,q=1,tc=1,vc=1)
   
    # 最初と最後のキー以外を調査
    for i in range(1,len(lv)-1):
        # キーが上り坂なら消すリストにインデックスを追加
        if lv[i-1][1] < lv[i][1] and lv[i][1] < lv[i+1][1]:
            ld.append([i])
        # キーが下り坂なら消すリストにインデックスを追加
        elif lv[i-1][1] > lv[i][1] and lv[i][1] > lv[i+1][1]:
            ld.append([i])
    if ld:
        # インデックスを使ってキーを消去
        pm.cutKey(fcv,index=ld)
        # 一度すべてのキータンジェントをAutoにする
        pm.keyTangent(fcv,itt="auto",ott="auto")
        # 最初のキータンジェントをSplineにする
        pm.keyTangent(fcv,t=lv[0][0],itt="spline",ott="spline")
        # 最後のキータンジェントをSplineにする
        pm.keyTangent(fcv,t=lv[-1][0],itt="spline",ott="spline")

2017/11/15

maya : タイムレンジのゲットセット

いくつかやり方があるけれど、これが一番シンプルかなー。

import pymel.core as pm

# タイムレンジの内側のゲットセット
pm.Env().minTime = 100
print pm.Env().minTime

pm.Env().maxTime = 500
print pm.Env().maxTime

# タイムレンジの外側のゲットセット
pm.Env().animStartTime = 0
print pm.Env().animStartTime

pm.Env().animEndTime = 600
print pm.Env().animEndTime

2017/11/08

python : 関数のデフォルト引数

今日はじめて知ったんですが、pythonの関数のデフォルト引数の挙動

>>> def b(l=[]):
... l.append(1)
... return l
...
>>> print b()
[1]
>>> print b()
[1, 1]
>>> print b()
[1, 1, 1]
>>>

あらららららららららら・・・・???

調べてみると、デフォルト引数は、関数が作成されるときに一度だけセットされるみたいです。
回避するには

>>> def c(l=None):
... if l is None:
... l=[]
... l.append(1)
... return l
...
>>> c()
[1]
>>> c()
[1]
>>> c([1])
[1, 1]
>>>

とかやるみたいです。
完全に間違ってました・・・orz

2017/11/02

maya : 選択しているオブジェクトのアニメーションキーを前後5フレずつ消す

k の値をお好きに変えてどうぞ。
いままで、手動でやってたのを後悔するわ…。


# -*- coding: cp932 -*-
# RemoveNeighboringKeys.py

import pymel.core as pm

k = 5 # 前後の消すフレームの値
c = pm.currentTime()
pm.cutKey(pm.selected(),time=(c-k,c-1))
pm.cutKey(pm.selected(),time=(c+1,c+k))

2017/11/01

maya : 選択しているオブジェクトのコンストレイントをすべて削除

コードが短すぎて、逆に不安…。
デフォルトでつけておいて欲しい。

import pymel.core as pm
pm.delete(pm.listRelatives(pm.selected(),typ="constraint"))

2017/10/27

maya : 最上位のDAGオブジェクトのリスト取得

ユーザーが作ったもののみ

import pymel.core as pm
print [obj for obj in pm.ls(assemblies=1) if not obj.name() in ["persp","top","front","side"]]

もっとスマートに出来る?
しかも、assembliesってなんだよ…。分かりにくいな…。

2017/10/26

maya : NurbsCurveのこの辺のParametric Length値を知りたい

あらかじめcurve1とlocator1を用意してから実行。
次のコードは、locator1からcurve1に一番近いポイントのParametric Length値を取得します。



import pymel.core as pm
import maya.api.OpenMaya as om

lct = pm.PyNode("locator1")
pt = om.MPoint(lct.getTranslation())

sel = om.MSelectionList()
sel.add("curve1")
path = sel.getDagPath(0)
crv = om.MFnNurbsCurve(path)

p,pl = crv.closestPoint(pt)

print pl

Attach to Motion Pathで、Parametric Lengthにチェックを入れて出てきた値を入れるとそこにコンストできます。
しかし、コードが長いなぁ…。

maya : pymelで選択している階層すべてのコンストレイント取得

import pymel.core as pm

# 選択している階層すべてのコンストレイント取得
pm.listRelatives(pm.selected(),ad=1,typ="constraint")

2017/10/20

maya : pymelでResetTransformationsとCenter Pivot

すぐ忘れるのでメモ
両方選択無し。

import pymel.core as pm

# null1をResetTransformations
obj = pm.PyNode("null1")
pm.makeIdentity(obj)

# pSphere1をCenter Pivot
obj = pm.PyNode("pSphere1")
pm.xform(obj,cp=True)

Perforce: 複数のワークスペースを更新するバッチ

batを叩けば全部更新。 @echo off set P4PORT=x.x.x.x:xxxx set P4USER=user set P4PASSWD=password echo %P4PORT% echo %P4USER% echo %P4PASSWD% echo %P4PAS...