getAttr MAYAオブジェクトのアトリビュート情報をPythonスクリプトで取得
オブジェクトのアトリビュート情報を取得するには getAttr コマンドを使います。
ポリゴンキューブを生成して適当に 移動 回転 拡大 しました。
オブジェクト名: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 を使うと知ることができます。
|
Pythonのスクリプトで「この条件のときはOK」でも「この条件のときはダメ」と分岐させる方法を紹介します。 CG制作ツールのMAYAを使って説明しますが、あくまでもPythonの紹介なので、MAYAを持ってなくても理解できるように紹介した... |
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’] #
チャンネルボックスに表示されているアトリビュートがリストで返されました。
これで 移動 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)
実行:
アトリビュート値が変更されました。
|
Pythonのスクリプトで頻繁に使われる list関数特にMAYAで使われるスクリプトの多くは、list から始まってるといっても過言ではないぐらい重要です。本記事ではMAYAでスクリプトを書く上で避けては通れない list の使い方を紹... |
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の使い方は別の記事で紹介しています。是非よんでみてください。
|
同じ作業を繰り返したいときがあります。例えば、大量のオブジェクトを条件に沿って並べたいとか複数の頂点を順番に調べて、条件に沿って特定の頂点を特定したいとか。 そのような事をしたい場合は for を使います。今回もMAY... |
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()で取得したポリゴンキューブの値に変更します。
最初に差し替えたいオブジェクト「ポリゴンシリンダー」を選択つづけて位置がバラバラの「ポリゴンキューブ」を選択します。
全てのオブジェクトが選択されています。
様々な大きさのキューブの位置情報を中央のシリンダーにコピーします。
スクリプトを実行
「ポリゴンキューブ」と同じ位置に、回転とスケールも同じ数値の「ポリゴンシリンダー」が生成されました。
「ポリゴンキューブ」と中央の「ポリゴンシリンダー」を削除しました。
|
MAYAは使えるスクリプトとしてMELの他にPythonも使うことが出来ます。通常MELで書くときはMELだけ。 Pythonで書く時はPythonだけで済ましますし、殆どの場合それで十分対応可能です。だた例えば、 MELでPythonで書... |
まとめ
オブジェクトの位置情報を取得する方法とオブジェクトの位置情報を変更する方法を説明しました。
- オブジェクトの位置情報を取得するにはアトリビュートの値を取得しなければなりません。
- オブジェクトに何のアトリビュートがあるのか確認するには listAttr コマンドを使います。
- オブジェクトのアトリビュート情報を取得するには getAttr コマンドを使います。
- オブジェクトのアトリビュート情報を変更するには setAttr を使います。
今回はアトリビュートの中からオブジェクトの位置情報のみの紹介でしたが、listAttrで紹介したように、getAttrで得られるアトリビュート情報は他にも沢山あります。
「オブジェクト名.アトリビュート」のアトリビュートを変えて他にどの様な情報が得られるか試してみてください。
以上です
|
アーティスト・デザイナーはプログラミングを学ぶ事をオススメします。作業効率を上げられ、プログラマーとのコミュニケーションがスムーズになりケアレスミスも減らすことができる。プログラミングを覚えて無駄になることはまず考えられません... |
▶最新GPUも格安構成も自由に選べる!パソコン買うならBTOの【FRONTIER】
|
近年プログラミング学習の需要が高くなっています。CGデザインの業務に携わる現場でも、その需要は益々高くなりプログラミングが分かる人と分からない人で、今後大きな開きが出てくると思われます。そしてプログラミングが学べるプログラミングスクールもリ... |
|
MAYAのスクリプトでは オブジェクトの位置情報を取得 する事がよくあります。対象のオブジェクトを動かすにしても大きくするにしても元の情報が分からないと、正しく操作できません。位置情報を取得するには対象のオブジェクトのアトリビュート値を確認... |
|
BTOパソコンの草分け的ブランドFRONTIER(フロンティア) 3DCG/動画編集/ゲーム用途に合わせてCPUやGPUなどパーツを自由に選べてコスパにもこだわる方にオススメ。 |
Facebook
Pocket
LINE
はてブ
おすすめの関連記事
|
多くの新機能が追加されたMAYA2022。モデリングツールの新機能「SweepMesh/メッシュをスイープ」は、チューブや額縁、道路やリボンやロープ、などカーブに沿わせてインタラクティブに生成そして編集できて非常に便利。 ただ不満あるとすれ... |
|
MAYAのメインメニューバーに項目を追加する事ができれば、チーム共有のツールをまとめたり、プロジェクト単位で専用ツールを分ける等の使い方ができます。MAYAでスクリプトを使って自作GUIにメニューバーを追加する方法は簡単にできますが、MAY... |
|
「鉄板の面に複数のリベットを並べたい」「布に縫い目をモデリングしたい」建築物などの壁や扉などをモデリングする際に鉄板にリベットを並べると、グッとリアリティが増します。壁や扉はどちらも平面なので、リベットのオブジェクトパーツを複製して並べるの... |
|
MAYAはPythonでスクリプトを書けますが、MAYAのデフォルトのスクリプトはMELです。MAYAでPythonでスクリプトを書けるようになってから大分たつので今はなくなりましたが、Python対応し始めた頃はまだMELと同等のコマンド... |
|
MAYAを操作していると望んでいた挙動にならずにイライラする事が多々あります。 例えば、複数のオブジェクトを扱っている場面で起こりがちな事として、特定のオブジェクトのアトリビュートエディタを表示したままにしておきたいのに、他のオブジェクトを... |
あわせてよく読まれている記事
「MAYA Python オブジェクトの位置を取得する方法-MAYA アーティストのスクリプト入門-」への1件のフィードバック
コメントは受け付けていません。