今回は、前回出てきました関数=「def」を命令を理解しましょう。
関数は、
def 関数の名前(引数):
[タブかスペースを空ける]命令1
[タブかスペースを空ける]命令2
[タブかスペースを空ける]命令3
:
:
次の命令 [タブかスペースなしで]
というルールです。例えば
import pymel.core as pm
polyCylinder()
pm.polySphere()
pm.cmds.move(2, 0, 0)
pm.polyCube()
pm.cmds.move(-2, 0, 0)
というプログラムを実行すると、以下の結果になります。
当たり前ですが、プログラムは実行した命令の数だけ自動でやってくれます。
それを毎度入力するのは大変です。では関数にします。
import pymel.core as pm
def TreeObject():
pm.polyCylinder()
pm.polySphere()
pm.cmds.move(2, 0, 0)
pm.polyCube()
pm.cmds.move(-2, 0, 0)
これを実行しても何も起きません。そこで、
TreeObject()
を実行します。どうですか?ちゃんと同じことを1命令でできましたね?
では少し改造します。
import pymel.core as pm
def TreeObject(x):
pm.polyCylinder()
pm.polySphere()
pm.cmds.move(x, 0, 0)
pm.polyCube()
pm.cmds.move(-x, 0, 0)
関数の実行の際に
TreeObject(3)とします。
どうですか?X=3なので、キューブとボールが±3の位置になりました。「引数」は関数の中に数値などのデータを送り届ける役割をするのです。
ではさらに改造します。
import pymel.core as pm
def TreeObject(x,z):
pm.polyCylinder()
pm.cmds.move(0, 0, z) pm.polySphere()
pm.cmds.move(x, 0, z)
pm.polyCube()
pm.cmds.move(-x, 0, z)
その後、
import pymel.core as pm
for n in range(10):
print n
TreeObject(2,n)
を実行します。
こんな感じになりました。for命令は過去にやったと思いますが、
for n in range(10): で下にある行を10回繰り返す、という意味です。
そこにprint nでカウントしているnを表示して、TreeObject(2,n)で関数を呼び出しているのです。
pm.cmds.move(0, 0, z)で、nの値がzに入って移動しながらコピーする、という仕組みです。
でも何かおかしいですね?Zに移動しているのにY方向の上に積み重ねてしまっています。
Display→ObjectDisplay→Local rotationAxisを表示すると、各パーツは横置きなので、Zは上なのですね。
このように関数は長い命令を1つまとめて、プログラムを作りやすく、読みやすくすることができます。
今回はここまでです。