【maya python7限目】面倒な配置、整列を自動化しよう!

mayapy07 python入門
過去セミナー再配信のお知らせ

過去2回のセミナーが期間限定でアンコール配信中です!
「MayaPython習得に苦しんだ過去の自分に教えてあげたい。。」調べてもわからなかったこと、教えて欲しかったことを、とことん詰め込みました。初心者の方はぜひご覧ください!

ツール作成の全体フローを最短距離で体験できます。スクリプト未経験の方におすすめ!
https://tutorials.cgworld.jp/set/2050

Mayaのオペレーションの自動化について徹底解説。様々な操作を自動化できるようになります
https://tutorials.cgworld.jp/set/2041

こんにちは!ビーバー@ゲーム業界歴約20年 です。maya python初心者の方のために、カンタン・わかりやすい解説サイトを作っています。

maya pythonの学習情報って少ないですよね。自分が骨を折った経験をもとに、maya python基礎を最速で習得できる10回のチュートリアルを作ってみたので参考にしていただければ幸いです。

今回は、7回目。配置や整列の自動化を通して、python特有の文法に慣れていきます。規則的にならべる処理なら、対象が何十万個になろうとスクリプトで一発対応できますよ!

>> setAttrの解説に今すぐ飛びたい方はこちら

このチュートリアルでわかること
  • pythonスクリプトから、オブジェクトを配置・整列する方法
  • setAttrコマンドの使い方

>> Pythonの勉強方法を知りたい方はこちらをどうぞ

※当サイトで紹介する商品は、アフィリエイトプログラムを利用しています。

maya python7限目でやること

setAttrコマンドを使って、配置・整列を自動化してみましょう!

  1. バラバラに配置されたオブジェクトをY=0に整列
  2. さらに等間隔に整列する

①バラバラに配置されたオブジェクトをY=0に整列

ハムちゃん
ハムちゃん

今回もまず実例を紹介してから、解説していくね!

実例

ボックスを5つ、バラバラに配置したシーンで整列をしてみましょう。

mayapy07_01

これをty=0に配置するには、このようなスクリプトを書きます。
最初にボックス5つを選択した状態で、以下を実行。

nodes = cmds.ls(selection=True)
for node in nodes:
    cmds.setAttr(node+".ty",0)
mayapy07_02
ピヨちゃん
ピヨちゃん

ty=0平面に整列できたね~!

ハムちゃん
ハムちゃん

それでは1行ずつ処理を見ていこう!

解説

スクリプトの構造

先ほどのスクリプトはこのような構造になっています。

行数スクリプト処理内容
1行目nodes = cmds.ls(selection=True)選択しているノードを取得して変数nodesに入れる   
2行目for node in nodes:nodesの中の要素に対して以下の処理を行う
3行目␣␣␣␣cmds.setAttr(node+”.ty”,0)   tyアトリビュートの値を0に設定
ピヨちゃん
ピヨちゃん

1&2行目は、4限目5限目で勉強したから大丈夫だよ

ハムちゃん
ハムちゃん

さすが!じゃあ3行目について解説するね!

3行目:tyアトリビュートの値を0に設定する

スクリプトの3行目について詳しく見ていきましょう。
この一文ではnodeという要素のアトリビュート「ty」に0を入れる、という処理を行っています。

行数スクリプト処理内容
3行目␣␣␣␣cmds.setAttr(node+”.ty”,0)      tyアトリビュートの値を0に設定      
ピヨちゃん
ピヨちゃん

setAttrっていうのがアトリビュート値を設定するのかな?

ハムちゃん
ハムちゃん

そうだよ!詳しく解説するね

setAttr

setAttrはその名の通り、アトリビュートに数値や文字列を設定するmayaコマンドです。
書式はこのように書きます。

cmds.setAttr(ノード名.アトリビュート名 , 設定する値)

ノード名.アトリビュート名」の部分は文字列で書きます。
例)cmds.setAttr(“pCube1.tx” , 1.0)

もう一度スクリプト部分を見てみましょう。

cmds.setAttr(node+".ty",0)
ピヨちゃん
ピヨちゃん

nodeのtyを0にする、っていう一文なんだね。

ハムちゃん
ハムちゃん

そう、そしてその処理を2行目のfor文で   
nodesのなかの要素すべてに対して行う、
という構造になっているんだ。

実行

ハムちゃん
ハムちゃん

中身を理解したところで実行してみよう

nodes = cmds.ls(selection=True)
for node in nodes:
    cmds.setAttr(node+".ty",0)
mayapy07_02
ピヨちゃん
ピヨちゃん

整列できた!今度は仕処理の組みもわかったよ!

②さらに等間隔に整列する

実例

では先ほどのシーンで、さらに tz=0 , transX=0,2,4,6,8 に整列をしてみましょう。
下記のように書いて実行します。

for i in range(5):
    cmds.setAttr("pCube"+str(i+1)+".tx",i*2)
    cmds.setAttr("pCube"+str(i+1)+".tz",0)
mayapy07_03
ピヨちゃん
ピヨちゃん

おお~!きれいに整列された!!これは実用的だね。
ただsetAttr()の中身が長くて、もう何がなんやらだ、、、涙

ハムちゃん
ハムちゃん

中身を分解してみていけば、難しいことは書いていないんだ。
解説していくね!

解説

スクリプトの構造

スクリプトはこのような構造になっています。

行数スクリプト処理内容
1行目for i in range(5):以下の処理を5回くりかえす
2行目␣␣␣␣cmds.setAttr(“pCube”+str(i+1)+”.tx”,i*2)   PCube〇〇のtxを△△に設定する 
3行目␣␣␣␣cmds.setAttr(“pCube”+str(i+1)+”.tz”,0)PCube〇〇のtzを0に設定する
ピヨちゃん
ピヨちゃん

rangeって何?

ハムちゃん
ハムちゃん

じゃあ、rangeの含まれている1行目から解説していくね。

1行目:以下の処理を5回くりかえす

行数スクリプト処理内容
1行目for i in range(5):         以下の処理を5回くりかえす       

こちらがスクリプトの1行目です。rangeについて確認していきましょう。

range()

range()はfor文と組み合わせることで、下記のように動作します。

for i in range():
␣␣␣()の中の回数、ここの処理を繰り返す

例えば、引数が(5)だと、処理は5回行われ、
i の中に0~4の数字が順番に入っていくという形になります。

rangeはpythonの 関数(かんすう)です。
mayaでは命令をコマンドと言いますが、pythonでの命令は関数と言います。
2限目で学習した「print」も関数です。

ピヨちゃん
ピヨちゃん

rangeは、()の中の回数分、処理をするっていう意味だったんだ!

2行目:PCube〇〇のtxを△△に設定する

次に、2行目を確認していきましょう。

行数スクリプト処理内容
2行目␣␣␣␣cmds.setAttr(“pCube”+str(i+1)+”.tx”,i*2)   PCube〇〇のtxを△△に設定する   
ピヨちゃん
ピヨちゃん

ここが何書いてんのかわからん。。。

ハムちゃん
ハムちゃん

pCubeの番号と、txの設定値を可変にする文章になっているんだ。
setAttrの構造から振り返ろう

setAttrの構造ふりかえり

setAttrの書式を再度確認して、文章の構造をつかみましょう。

cmds.setAttr(ノード名.アトリビュート名 , 設定する値)

cmds.setAttr
ピヨちゃん
ピヨちゃん

こういう構造だったのか!

ハムちゃん
ハムちゃん

,(カンマ)の前が「設定したいノードのアトリビュート名」で、

カンマの後ろが「設定したい値」だね!単純でしょ?

i の挙動

次に、引数の中に含まれている i の挙動を確認していきます。
range()の引数が5なので、 i には0~4が順番に代入されていきます。
再度スクリプトを提示します。

    cmds.setAttr("pCube"+str(i+1)+".tx",i*2)

初回の処理は、i に 0 が代入されて、

cmds.setAttr(“pCube”+str(0+1)+”.tx”,0*2)
つまり、
cmds.setAttr( “pCube”+str(1)+”.tx” , 0)
となります。

赤字の部分は、「+」で “pCube” str(1) “.tx” の3つの文字列を連結していますね。

ピヨちゃん
ピヨちゃん

str(1)って何?

ハムちゃん
ハムちゃん

str()関数は、数値を文字列に変換する関数だよ

この例では、文字列である”pCube” , “.tx”と、数値である1は、
「+」で連結出来ないため、
str()関数で、数値の1を文字列の1に変換しています。

文字列は文字列としか連結できません。
見た目は1でも、数値なのか文字列なのか、データ型を意識する必要があります。
ただ「1」と書いた場合は数値になるので、
str(1)とすることで文字列として扱うことができます。

ピヨちゃん
ピヨちゃん

じゃあ初回の処理の内容は

cmds.setAttr(“pCube1.tx” , 0) になるんだね!

ハムちゃん
ハムちゃん

そのとおり!
以降、2回目の処理では、i に1が代入されて、、という形で
処理が繰り返されていくんだ

3行目:PCube〇〇のtzを0に設定する

それでは最後の3行目を見ていきましょう。

行数スクリプト処理内容
3行目␣␣␣␣cmds.setAttr(“pCube”+str(i+1)+”.tz”,0)PCube〇〇のtzを0に設定する
ピヨちゃん
ピヨちゃん

わかるよ!これはさっきと同じ構造で、tzに0を設定しているんだ!

ハムちゃん
ハムちゃん

そのとおり!

実行

ハムちゃん
ハムちゃん

中身を理解したところで実行してみよう

for i in range(5):
    cmds.setAttr("pCube"+str(i+1)+".tx",i*2)
    cmds.setAttr("pCube"+str(i+1)+".tz",0)
mayapy07_03
ピヨちゃん
ピヨちゃん

やったあ~!!整列できたよ!

まとめ

今回学習した内容のポイントをまとめます。

学習のポイント
  1. setAttrを使って、オブジェクトのアトリビュート値を設定する
  2. range関数とfor文で引数で指定した回数の処理を行う
  3. str()関数で数値を文字列に変換する
ハムちゃん
ハムちゃん

setAttrはとっても便利だから、いろいろ試してみてね!

次回はsetAttr,range()にaimコンストレインを組み合わせて、
より実践的な配置と整列に取り組む内容になります。お楽しみに!

はじめてpython学習するなら!

はじめてプログラミングを勉強するとき、エラーはつきものですよね。
何時間もスクリプトが動かないこともしばしば。。
そんな時、くわしい人に教えてもらいたい、と思うことはありませんか?

侍テラコヤは、はじめてpythonを学習する方にピッタリのサービスです。
サブスク型オンラインスクールで、月¥2980~の良心的なお値段!

現役エンジニアのサポートが充実しており、
オンラインのマンツーマンレッスンとQ&A掲示板で即座に悩みを解決することができます

maya python基礎

本サイトの【まとめ】 maya python 基礎 入門!では、
10回シリーズでmaya pythonの基礎が習得できるコンテンツを発信しています。

  • ちまたのスクリプトを読んで、内容を理解したい
  • mayaのスクリプトリファレンスの読み方を習得したい
  • 自分で簡単なツールを書きたい
  • 基礎的なmayaコマンドをpythonで使えるようになりたい

など、mayaでpython基礎を身に着けたい方は、ぜひご活用ください♪

オススメの本。pythonが楽しく学べます☆

変数、for文の復習はこちら↓

コメント

タイトルとURLをコピーしました