liquidjumper MAYA,Python MAYA Python オブジェクトの位置を取得する方法-MAYA アーティストのスクリプト入門-

MAYA Python オブジェクトの位置を取得する方法-MAYA アーティストのスクリプト入門-

maya_py_getattr_translate_topimage

MAYAのスクリプトでは オブジェクトの位置情報を取得 する事がよくあります。

対象のオブジェクトを動かすにしても大きくするにしても元の情報が分からないと、正しく操作できません。

位置情報を取得するには対象のオブジェクトのアトリビュート値を確認する必要があります。

今回はオブジェクトの位置情報を取得する方法とオブジェクトの位置情報を変更する方法を説明します。

getAttr MAYAオブジェクトのアトリビュート情報をPythonスクリプトで取得

オブジェクトのアトリビュート情報を取得するには getAttr コマンドを使います。

ポリゴンキューブを生成して適当に 移動 回転 拡大 しました。

オブジェクト名:test_Cube

test_Cube

getAttr コマンドで生成したポリゴンキューブ「test_Cube」のアトリビュート情報を取得します。

対象のオブジェクトから何のアトリビュート情報が取得できるかは listAttr コマンドで参照できます。

import maya.cmds as cmds

cmds.listAttr("test_Cube")


結果:

# Result: [u’message’, u’caching’, u’frozen’, u’isHistoricallyInteresting’, u’nodeState’, u’binMembership’, u’hyperLayout’, u’isCollapsed’, u’blackBox’, u’borderConnections’, u’isHierarchicalConnection’, u’publishedNodeInfo’, u’publishedNodeInfo.publishedNode’, u’publishedNodeInfo.isHierarchicalNode’, u’publishedNodeInfo.publishedNodeType’, u’rmbCommand’, u’templateName’, u’templatePath’, u’viewName’, u’iconName’, u’viewMode’, u’templateVersion’, u’uiTreatment’, u’customTreatment’, u’creator’, u’creationDate’, u’containerType’, u’boundingBox’, u’boundingBoxMin’, u’boundingBoxMinX’, u’boundingBoxMinY’, u’boundingBoxMinZ’, u’boundingBoxMax’, u’boundingBoxMaxX’, u’boundingBoxMaxY’, u’boundingBoxMaxZ’, u’boundingBoxSize’, u’boundingBoxSizeX’, u’boundingBoxSizeY’, u’boundingBoxSizeZ’, u’center’, u’boundingBoxCenterX’, u’boundingBoxCenterY’, u’boundingBoxCenterZ’, u’matrix’, u’inverseMatrix’, u’worldMatrix’, u’worldInverseMatrix’, u’parentMatrix’, u’parentInverseMatrix’, u’visibility’, u’intermediateObject’, u’template’, u’ghosting’, u’instObjGroups’, u’instObjGroups.objectGroups’, u’instObjGroups.objectGroups.objectGrpCompList’, u’instObjGroups.objectGroups.objectGroupId’, u’instObjGroups.objectGroups.objectGrpColor’, u’objectColorRGB’, u’objectColorR’, u’objectColorG’, u’objectColorB’, u’wireColorRGB’, u’wireColorR’, u’wireColorG’, u’wireColorB’, u’useObjectColor’, u’objectColor’, u’drawOverride’, u’overrideDisplayType’, u’overrideLevelOfDetail’, u’overrideShading’, u’overrideTexturing’, u’overridePlayback’, u’overrideEnabled’, u’overrideVisibility’, u’hideOnPlayback’, u’overrideRGBColors’, u’overrideColor’, u’overrideColorRGB’, u’overrideColorR’, u’overrideColorG’, u’overrideColorB’, u’lodVisibility’, u’selectionChildHighlighting’, u’renderInfo’, u’identification’, u’layerRenderable’, u’layerOverrideColor’, u’renderLayerInfo’, u’renderLayerInfo.renderLayerId’, u’renderLayerInfo.renderLayerRenderable’, u’renderLayerInfo.renderLayerColor’, u’ghostingControl’, u’ghostCustomSteps’, u’ghostPreSteps’, u’ghostPostSteps’, u’ghostStepSize’, u’ghostFrames’, u’ghostColorPreA’, u’ghostColorPre’, u’ghostColorPreR’, u’ghostColorPreG’, u’ghostColorPreB’, u’ghostColorPostA’, u’ghostColorPost’, u’ghostColorPostR’, u’ghostColorPostG’, u’ghostColorPostB’, u’ghostRangeStart’, u’ghostRangeEnd’, u’ghostDriver’, u’hiddenInOutliner’, u’useOutlinerColor’, u’outlinerColor’, u’outlinerColorR’, u’outlinerColorG’, u’outlinerColorB’, u’translate’, u’translateX’, u’translateY’, u’translateZ’, u’rotate’, u’rotateX’, u’rotateY’, u’rotateZ’, u’rotateOrder’, u’scale’, u’scaleX’, u’scaleY’, u’scaleZ’, u’shear’, u’shearXY’, u’shearXZ’, u’shearYZ’, u’rotatePivot’, u’rotatePivotX’, u’rotatePivotY’, u’rotatePivotZ’, u’rotatePivotTranslate’, u’rotatePivotTranslateX’, u’rotatePivotTranslateY’, u’rotatePivotTranslateZ’, u’scalePivot’, u’scalePivotX’, u’scalePivotY’, u’scalePivotZ’, u’scalePivotTranslate’, u’scalePivotTranslateX’, u’scalePivotTranslateY’, u’scalePivotTranslateZ’, u’rotateAxis’, u’rotateAxisX’, u’rotateAxisY’, u’rotateAxisZ’, u’transMinusRotatePivot’, u’transMinusRotatePivotX’, u’transMinusRotatePivotY’, u’transMinusRotatePivotZ’, u’minTransLimit’, u’minTransXLimit’, u’minTransYLimit’, u’minTransZLimit’, u’maxTransLimit’, u’maxTransXLimit’, u’maxTransYLimit’, u’maxTransZLimit’, u’minTransLimitEnable’, u’minTransXLimitEnable’, u’minTransYLimitEnable’, u’minTransZLimitEnable’, u’maxTransLimitEnable’, u’maxTransXLimitEnable’, u’maxTransYLimitEnable’, u’maxTransZLimitEnable’, u’minRotLimit’, u’minRotXLimit’, u’minRotYLimit’, u’minRotZLimit’, u’maxRotLimit’, u’maxRotXLimit’, u’maxRotYLimit’, u’maxRotZLimit’, u’minRotLimitEnable’, u’minRotXLimitEnable’, u’minRotYLimitEnable’, u’minRotZLimitEnable’, u’maxRotLimitEnable’, u’maxRotXLimitEnable’, u’maxRotYLimitEnable’, u’maxRotZLimitEnable’, u’minScaleLimit’, u’minScaleXLimit’, u’minScaleYLimit’, u’minScaleZLimit’, u’maxScaleLimit’, u’maxScaleXLimit’, u’maxScaleYLimit’, u’maxScaleZLimit’, u’minScaleLimitEnable’, u’minScaleXLimitEnable’, u’minScaleYLimitEnable’, u’minScaleZLimitEnable’, u’maxScaleLimitEnable’, u’maxScaleXLimitEnable’, u’maxScaleYLimitEnable’, u’maxScaleZLimitEnable’, u’offsetParentMatrix’, u’geometry’, u’xformMatrix’, u’selectHandle’, u’selectHandleX’, u’selectHandleY’, u’selectHandleZ’, u’inheritsTransform’, u’displayHandle’, u’displayScalePivot’, u’displayRotatePivot’, u’displayLocalAxis’, u’dynamics’, u’showManipDefault’, u’specifiedManipLocation’, u’rotateQuaternion’, u’rotateQuaternionX’, u’rotateQuaternionY’, u’rotateQuaternionZ’, u’rotateQuaternionW’, u’rotationInterpolation’] #

フラグを指定しなかったので、全てのアトリビュートのリストが返されました。

この項目のまとめ
対象のオブジェクトから何のアトリビュート情報が取得できるかを知りたいときは listAttr を使うと知ることができます。


Translate 位置情報をPythonスクリプトで取得

getAttr 使ってをポリゴンキューブ「test_Cube」の位置情報を取得したいと思いますが、listAttrで取得した リスト のままでは数が多すぎて参照するのも一苦労です。

listAttr はフラグを指定して目的のアトリビュートのみをリスト表示する事ができます。

アトリビュートを指定する方法は様々ありますが、今回はキーフレームにできるアトリビュートのみを表示するフラグ

keyable(k) を指定します

import maya.cmds as cmds

cmds.listAttr("test_Cube", k=True)


結果:

# Result: [u’visibility’, u’translateX’, u’translateY’, u’translateZ’, u’rotateX’, u’rotateY’, u’rotateZ’, u’scaleX’, u’scaleY’, u’scaleZ’] #


チャンネルボックスに表示されているアトリビュートがリストで返されました。

channel Box


これで 移動 translate ,回転 rotate ,スケール scale  のアトリビュート値を取得できます。


getAttr の使い方は対象のオブジェクト名のあとに「.translateX」の様に追加して文字列で指定します。

#移動情報
cmds.getAttr("test_Cube.translateX")
cmds.getAttr("test_Cube.translateY")
cmds.getAttr("test_Cube.translateZ")

#回転
cmds.getAttr("test_Cube.rotateX")
cmds.getAttr("test_Cube.rotateY")
cmds.getAttr("test_Cube.rotateZ")

#スケール
cmds.getAttr("test_Cube.scaleX")
cmds.getAttr("test_Cube.scaleY")
cmds.getAttr("test_Cube.scaleZ")


結果:

cmds.getAttr(“test_Cube.translateX”)
# Result: -0.8586405434866209 #
cmds.getAttr(“test_Cube.translateY”)
# Result: 0.45982550544537903 #
cmds.getAttr(“test_Cube.translateZ”)
# Result: 1.45827738200636 #
cmds.getAttr(“test_Cube.rotateX”)
# Result: 8.869723866828028 #
cmds.getAttr(“test_Cube.rotateY”)
# Result: 5.658825513240842 #
cmds.getAttr(“test_Cube.rotateZ”)
# Result: -32.28716922393838 #
cmds.getAttr(“test_Cube.scaleX”)
# Result: 1.4901937049681462 #
cmds.getAttr(“test_Cube.scaleY”)
# Result: 1.4901937049681462 #
cmds.getAttr(“test_Cube.scaleZ”)
# Result: 1.4901937049681462 #


ポリゴンキューブ「test_Cube」の位置情報が取得できました。

setAttr MAYAオブジェクトのアトリビュート情報をPythonスクリプトで変更

getAttr で対象のオブジェクトのアトリビュート情報は取得できました。

反対に対象のオブジェクトのアトリビュート情報を変更するには setAttr を使います。

オブジェクトに指定変更できるアトリビュートは先程と同じく listAttr で確認できます。

ポリゴンキューブ「test_Cube」 のアトリビュート値を変更します。

#移動情報
cmds.setAttr("test_Cube.translateX",-1)
cmds.setAttr("test_Cube.translateY",-0.5)
cmds.setAttr("test_Cube.translateZ",-1.4)

#回転
cmds.setAttr("test_Cube.rotateX",0)
cmds.setAttr("test_Cube.rotateY",30)
cmds.setAttr("test_Cube.rotateZ",45)

#スケール
cmds.setAttr("test_Cube.scaleX",0.7)
cmds.setAttr("test_Cube.scaleY",0.6)
cmds.setAttr("test_Cube.scaleZ",0.8)


実行:

setAttr start


アトリビュート値が変更されました。

channel box 変更

getAttr と setAttr を使ってオブジェクトの差し替えスクリプトをPythonで作る

getAttr と setAttr を使って簡単なPythonスクリプトを作りたいと思います。


「位置情報がバラバラなポリゴンキューブのオブジェクトポリゴンシリンダーのオブジェクトと差し替える」

以下のPythonスクリプトを書きました。

import maya.cmds as cmds


selectedObjList = cmds.ls(sl=True)
cmds.select(cl=True)

for i in range(1,len(selectedObjList)):
    
    duplicateObj = cmds.duplicate(selectedObjList[0],rr=True)
    cmds.select(cl=True)
  
    cmds.setAttr(duplicateObj[0]+".translateX" , cmds.getAttr(selectedObjList[i]+".translateX"))
    cmds.setAttr(duplicateObj[0]+".translateY" , cmds.getAttr(selectedObjList[i]+".translateY"))
    cmds.setAttr(duplicateObj[0]+".translateZ" , cmds.getAttr(selectedObjList[i]+".translateZ"))
    cmds.setAttr(duplicateObj[0]+".rotateX" , cmds.getAttr(selectedObjList[i]+".rotateX"))
    cmds.setAttr(duplicateObj[0]+".rotateY" , cmds.getAttr(selectedObjList[i]+".rotateY"))
    cmds.setAttr(duplicateObj[0]+".rotateZ" , cmds.getAttr(selectedObjList[i]+".rotateZ"))
    cmds.setAttr(duplicateObj[0]+".scaleX" , cmds.getAttr(selectedObjList[i]+".scaleX"))
    cmds.setAttr(duplicateObj[0]+".scaleY" , cmds.getAttr(selectedObjList[i]+".scaleY"))
    cmds.setAttr(duplicateObj[0]+".scaleZ" , cmds.getAttr(selectedObjList[i]+".scaleZ"))


解説:

selectedObjList = cmds.ls(sl=True)

対象のオブジェクトを取得してリストにします。
リストの先頭は差し替えたいオブジェクト、今回であれば「ポリゴンシリンダー」それ以降は複数の「ポリゴンキューブ」

for i in range(1,len(selectedObjList)):

range(1,len()) でリストの先頭からではなくポリゴンキューブをループします

※forの使い方は別の記事で紹介しています。是非よんでみてください。


duplicateObj = cmds.duplicate(selectedObjList[0],rr=True)
cmds.select(cl=True)

ポリゴンシリンダーをデュプリケートして duplicateObj にリストします。選択状態アクティブになっているので cmds.select(cl=True) 非選択クリアします。

cmds.setAttr(duplicateObj[0]+".translateX" , cmds.getAttr(selectedObjList[i]+".translateX"))

setAttr()でポリゴンシリンダーのアトリビュートをgetAttr()で取得したポリゴンキューブの値に変更します。


最初に差し替えたいオブジェクト「ポリゴンシリンダー」を選択つづけて位置がバラバラの「ポリゴンキューブ」を選択します。

select all_objs

全てのオブジェクトが選択されています。
様々な大きさのキューブの位置情報を中央のシリンダーにコピーします。

select all_objs _image


スクリプトを実行

「ポリゴンキューブ」と同じ位置に、回転とスケールも同じ数値の「ポリゴンシリンダー」が生成されました。

「ポリゴンキューブ」と中央の「ポリゴンシリンダー」を削除しました。

シリンダーポリゴンに変更

まとめ

オブジェクトの位置情報を取得する方法とオブジェクトの位置情報を変更する方法を説明しました。

  • オブジェクトの位置情報を取得するにはアトリビュートの値を取得しなければなりません。
  • オブジェクトに何のアトリビュートがあるのか確認するには listAttr コマンドを使います。
  • オブジェクトのアトリビュート情報を取得するには getAttr コマンドを使います。
  • オブジェクトのアトリビュート情報を変更するには setAttr を使います。

今回はアトリビュートの中からオブジェクトの位置情報のみの紹介でしたが、listAttrで紹介したように、getAttrで得られるアトリビュート情報は他にも沢山あります。

「オブジェクト名.アトリビュート」のアトリビュートを変えて他にどの様な情報が得られるか試してみてください。

以上です



最新GPUも格安構成も自由に選べる!パソコン買うならBTOの【FRONTIER】







𝕏 ( 旧Twitter ) Facebook Pocket LINE はてブ

おすすめの関連記事



あわせてよく読まれている記事

「MAYA Python オブジェクトの位置を取得する方法-MAYA アーティストのスクリプト入門-」への1件のフィードバック

コメントは受け付けていません。