スクリプト?何それ怖い・・・っていう文系デザイナーのために、とりあえず実用的なツールを作りながら、MayaでのPythonスクリプト書き方を極力簡単に説明していきます!
コンテンツ
Pythonって何?
プログラミング言語です。(え、それくらい知ってるって?)
プログラミングで行うことをざっくり説明すると、数値や文字列を変数という入れ物に入れ、それをそれぞれ「〇〇〇文」という処理方法を指示する文で計算を行い結果を出力します。・・・いや、本当にこれだけのことです。
つまり、「変数」と「〇〇〇文」、プラス「関数」を覚えればプログラム(スクリプト)は書けます(え?一つ増えたって?)。
変数は処理に値を渡すための入れ物
学生のころみんなが大好きだった数学で「x = 1」とか「y = 2」とかってやりましたね。この「x」や「y」がプログラミングでいう変数です。
数学で「x = 1」は「xは1ですよ!」って意味だったのに対し、プログラミングでは「xという入れ物に1という数字を入れますよ!(代入)」という意味であり、値が入った変数を各処理間でやり取りを行います。
#「英数字 = 値」の形で記述するだけで変数の作成と値の代入ができる
x = 1
#大体何の値を扱っているかわかる変数名をつける(任意)
finger = 5
#数字から始まる変数は作れない
2manEar = 4
#プログラムの文法上他の意味を持っている文字列は変数としては使えない
not = 0
変数には「型」がある
数学で扱うのは数字だけですが、プログラミングでは文字列やリスト、タプル、整数、浮動小数点など扱うデータに種類があり、それぞれに「型」があります。
「型」は代入した値によって勝手に決まるものなので、値を入れる分にはあまり型を気にすることはありませんが、後に変数を処理で扱う際には変数の「型」が何であるかが重要になってきます。
#整数型(int型とも言う)
ABC = 1
#浮動小数点数型(float型)
ABC = 0.5
#文字列型(string型)
ABC = 'abc'
#リスト型(list型)
ABC = ['abc', 123, 0.1]
#辞書型
ABC = {name:'Tarou', age:30}
#bool型
ABC = True
ABC = False
if文で条件分岐処理
最初に説明した「〇〇〇文」の一つ。
num = 5
if num >= 4:
print('正解!!')
else:
print('不正解・・・')
#実行結果は、「正解!!」と表示されます。
上記「if」の横に書かれている「num >= 4」は「numという変数に入っている数値は4以上だ」ということを意味しており、もしこれが正しければ3行目にインデント(空白部分)を開けて書かれた「print(‘正解!!’)」が実行されます。
仮に1行目が「num = 3」だった場合、4行目の「else:」の後に書かれている「print(‘不正解・・・’)」が実行されます。
このように、「if 〇〇〇:」の〇〇〇部分に条件を書くことでそのあとの処理を実行させるかどうかをプログラムに判断させるわけです。
for文でループ処理
ある処理を決められた回数繰り返させるのが「for文」です。
for num in range(10):
print(num)
実行結果から言うと、「0123456789」と表示されます。
ここで行われた処理を説明すると、range(10)から0という数値が出力→それがforの後ろにあるnum変数へ代入→2行目のprint(num)でnumの中身を表示→range(10)から1→numへ代入→numの中身を表示→・・・・
という感じで同じ処理を10回繰り返します。
このようにinの後ろにあるものから1つずつ要素を取り出し、処理にそれを利用しつつ、その要素の数だけ処理を繰り返すのがfor文です。
ちなみに、「range(〇〇〇)」は〇〇〇に入れた数字を0から順番にその数字の個数返していく処理をします。つまり、10と入れると「0 1 2 3 ・・・9」と返します。
import文はとりあえず書いておけばOK
Mayaのスクリプトでは初めに以下のように記述します。
import maya.cmds as cmds
import文はこのあとにも説明する「関数」などの機能が詰め込まれたモジュールを読み込むための記述です。
上の記述はMaya内の様々な機能を使うためのモジュールを読み込んでいます。とりあえず必ず書くってことを覚えておけば大丈夫です。
「関数」とは!
数学で1次関数とか2次関数とかってやりましたね・・・。
「y = 2x+8」についてx=-5のときyの値を求めよ!みたいな。
プログラミングでいう関数もある意味同じで、「引数(x)が〇〇のとき戻り値(y)は●●です!」という感じで処理をしてくれます。
つまり、何かしら値を渡すと決まった処理を返してくれるのが関数です。
関数は「自分で作って使う」場合と「Pythonまたはソフト側で提供しているものを使う」場合があります。
複数回使う処理は関数化する
import math
def getDistance(A,B):
dis = math.sqrt((B[0] - A[0])**2 + (B[1] - A[1])**2 + (B[2] - A[2])**2)
return abs(dis)
positionA = [5,6,7]
positionB = [8,9,10]
distance = getDistance(positionA,positionB)
print(distance)
プログラム内では同じ処理を何回も使うことがあります。それらを毎回書いているとコードが長くなって分かりづらいうえ、処理を修正する際にも一つ一つ書き換える必要が出てきます。
関数化によって処理をまとめてしまえばそれらを解決することができます。
例えば上記のコードは2つの座標から距離を計算する処理を関数化しています。処理自体は1行ですが何回も使うので関数化した方が便利です。
2~4行目で関数の定義を行っており、「def」の後に関数名つづいて()内に入力に当たる変数A,変数Bを記述しています。そして3行目は実際の処理である計算式を記述し、4行目の「return」のあとに返す値(変数)を記述することで関数の出来上がりです。
6,7行目ではX、Y、Zの座標を示す変数を定義しています。
そして8行目で作成した関数に変数を渡し、帰ってきた距離の値を「distance」変数に代入しています。
9行目の「print(distance)」で距離を表示させています。
Mayaは関数で操作する
import maya.cmds as cmds
cmds.polySphere(sx=10, sy=15, r=20)
上記のコードは名前の通りpolySphereを作成する関数です。
1行目でインポートしているモジュールはMayaの機能を使うための関数が用意されています。
そして、3行目がpolySphereを作成する関数です。引数の「sx=10」はX方向のサブディビジョン、「sy=15」はY方向のサブディビジョン、「r=20」は半径の幅を指定しています。
引数の渡し方についても、『複数回使う処理は関数化する』で出した例(8行目)のように、渡す変数のみ記述するのが一般的ですが、上記例のように「それぞれの関数に用意された引数名」=「値」という書き方もあります。
mayaの関数の書き方は後者で、関数名とその関数が持っている引数名については以下の方法で調べることができます。
「maya help」で検索→「Mayaヘルプ – Autodesk Help」を開く→「テクニカル ドキュメント」→「Pythonコマンド」
まとめ:とりあえずPythonについてはざっくりと
とりあえず、Pythonについてざっくりと知って頂ければ大丈夫です。細かいことは分からなくても、どんな概念があるのかということだけ知っていればいくらでも調べることができるので。大事な流れは抽象から詳細。