見出し画像

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フラグ使えば短くなると思う…。がちょっと挑戦したいことがあったので長めのコード)

いいなと思ったら応援しよう!