Maya-Python/cmdsメモ
機能を覚えるための個人的なメモです。なので変数名とか結構てきとーです。背景モデラーなのでリグとかアニメーション関連のコマンドはあまり触れないと思います。
xform
オブジェクトの移動、回転、スケールなどの値を変更出来る。(バウンディングボックスなども)
queryモードは照会するフラグが無いと無意味。今のところ判明してるのはbbフラグ
from maya import cmds
sl_objs=cmds.ls(sl=True)
for sl_obj in sl_objs:
cmds.xform(sl_obj,cp=True)
b_box=cmds.xform(sl_obj,q=True,bb=True,ws=True)
x_min,y_min,z_min,x_max,y_max,z_max =b_box
これで選択したオブジェクトのバウンディングボックスの面を個別に呼び出せるようになる
makeIdentity
トランスフォームのフリーズが出来る。
フラグのnormalは基本False
apply(a)をTrueにするとピボットポイントはそのままで適用される。他t,r,sはフリーズするモード
from maya import cmds
sl_objs=cmds.ls(sl=True)
cmds.makeIdentity(sl_obj,a=True,t=True,s=True,n=False)
例:フリーズ
move
移動を行う。
xformと一緒に使うことが多い。関連のコマンドにrotateとscaleがある。
from maya import cmds
selection = cmds.ls(sl=True)
for selected in selection:
cmds.xform(selected,cp=True)
bb_box =cmds.xform(selected,q=True,bb=True,ws=True)
x_min,y_min,z_min,x_max,y_max,z_max = bb_box
cmds.move(y_min,[f"{selected}.scalePivot",f"{selected}.rotatePivot"],y=True,a=True)
これはピボットポイントを底辺に動かすコード
from maya import cmds
selection = cmds.ls(sl=True)
cmds.move(0,0,0,selection,rpr=True)
これは、選択したオブジェクトを原点に移動するコード。
cmds.move(0,0,0,selection,rpr=True,y=True)を最初のコードの一番下に入れるとその場でy:0に移動する。
listRelatives
フラグで選択したオブジェクトの親や子を取得しリスト化する。
また、Shapeノード名を取得出来る。
from maya import cmds
#pCube1を選択
sl_obj=cmds.ls(sl=True)
get=cmds.listRelatives(sl_obj,shapes=True)
print(get)
Shapeノード名を所得('pCubeShape1')
polyEvaluate
頂点、エッジ、フェースの値を取得するのが主な目的。下記のコードでは[0]を取ると選択したオブジェクトの合計値が取れる。
from maya import cmds
sl_obj=cmds.ls(sl=True)
get=cmds.listRelatives(sl_obj,shapes=True)
num_vtx = cmds.polyEvaluate(get[0],vertex=True)
num_edge = cmds.polyEvaluate(get[0],edge=True)
num_triangle = cmds.polyEvaluate(get[0],triangle=True)
print(num_vtx,num_edge,num_triangle)
選択したオブジェクトの頂点、エッジ、フェースを取得
pointPosition
頂点の座標を取得できるコマンド。
カーブポイントやラティスポイントなども取得出来る。
※オブジェクトではなく、頂点を選択して実行する
(オブジェクト位置はgetAttrコマンドで取得)
from maya import cmds
sl_obj = cmds.ls(sl=True,fl=True)
for vx in sl_obj:
vertex = cmds.pointPosition(vx)
print(f"{vx}:{vertex}")
選択した頂点の値を取得する。lsコマンドにflフラグがないと複数取得できない
manipMoveContext
ピボットポイント(マニピュレータ)の値を取ったり、向きを変えたりできる。editモードで編集のフラグが使え、queryモードで値系のフラグが使える。スナップ移動なども出来る。
from maya import cmds
obj=cmds.ls(sl=True)
mp=cmds.manipMoveContext("Move",query=True,p=True)
print(mp)
選択したオブジェクトのピボットポイント位置を取得
polyListComponentConversion
選択した頂点4つを1つのフェースにしたり、その逆も出来る。
form(から)〜 to(へ)
toだけにするとオブジェクトの全ての値を取ってくる。
from maya import cmds
obj=cmds.ls(sl=True)
vrts = cmds.ls(cmds.polyListComponentConversion(obj,ff=True,tv=True),fl=True)
cmds.select(vrts)
選択したフェースに接する頂点を選択するコード
getAttr
オブジェクトのアトリビュート値を取得できる。
頂点などの値はpointPositionで取得しよう。
(選択出来るアトリビュートはアトリビュートスプレッドシートから見るのが早いかも)
from maya import cmds
sl_objs=cmds.ls(sl=True)
for sl_obj in sl_objs:
tx = cmds.getAttr(sl_obj+".tx")
ty = cmds.getAttr(sl_obj+".ty")
tz = cmds.getAttr(sl_obj+".tz")
print([tx,ty,tz])
選択したオブジェクトのX,Y,Zの値を取得する
setAttr
正直オブジェクトの位置などを変更する場合は、xformでもいいんじゃないかと思っている。
その他、アトリビュートをロックしたりする場合はこちらを使用する。
from maya import cmds
sl_objs=cmds.ls(sl=True)
for i in sl_objs:
get = cmds.getAttr(i + ".tx")
set = cmds.setAttr(i + ".tx" ,get + 10)
選択したオブジェクトがx方向に10ずつ移動
pointConstraint
最初に選択したオブジェクトにスナップする。
コンストレイントは沢山種類がある。
回転を合わせたかったらorientConstraint
スケールを合わせたかったらscaleConstraint
などなど。一応これを使わなくてもスナップ自体は出来る。
from maya import cmds
source, dist = cmds.ls(selection=True)
constraint = cmds.pointConstraint(source, dist)
cmds.delete(constraint)
移動だけ合わせる
duplicate
オブジェクトを複製する。
instanceコマンドでも同じ←変更が反映される
複製したオブジェクトの値を取得してまた別の位置へ置くことなどが出来る。(配列など)
selectコマンド(addフラグ)を使わないと複数複製する場合、選択が外れてしまう。
from maya import cmds
sl_objs=cmds.ls(sl=True)
for sl_obj in sl_objs:
copy = cmds.duplicate(sl_obj)
sel = cmds.select(copy,add=True)
get=cmds.getAttr(copy[0]+".tx")
cmds.setAttr(copy[0] +".tx",get +2)
選択したオブジェクトをx方向に2mずつ複製する
filterExpand
コマンドls(sl)で取得された頂点はvtx[0:5]などとなってしまうので、それらを展開するために使う。頂点の値を取るにはフラグSelectionMask(sm)=31
を使う。エッジが32,フェースが34
その他は公式コマンドヘルプを見よう
from maya import cmds
sl_vertex=cmds.ls(sl=True,fl=True)
vtx = cmds.filterExpand(sl_vertex,selectionMask =31)
print(vtx)
選択した頂点を個別に展開する
group
グループ化できるコマンド。似たようなものだとオブジェクトを結合させるpolyUniteコマンドがある。用途によって使い分ける。
from maya import cmds
sl_obj=cmds.ls(sl=True)
def getCenterObject(obj):
px = 0
py = 0
pz = 0
for i in sl_obj:
ox = cmds.getAttr(i +".tx")
oy = cmds.getAttr(i +".ty")
oz = cmds.getAttr(i +".tz")
set =([ox,oy,oz])
px += set[0]
py += set[1]
pz += set[2]
result = [ px/len(sl_obj), py/len(sl_obj), pz/len(sl_obj) ]
return result
center = getCenterObject(sl_obj)
D_obj = cmds.group(sl_obj,n="My_Group")
cmds.move(center[0],center[1],center[2],["My_Group.scalePivot","My_Group.rotatePivot"],a=True)
これは選択したオブジェクトをグループ化してピボットポイントを中心にするコード(多分xformのbbフラグ使えば短くなると思う…。がちょっと挑戦したいことがあったので長めのコード)