文系デザイナーのためのmaya MEL/Python基礎の基礎 Step2-12

今回はチェックボックスと文字入力です。
今日の最初のプログラムはこんな感じです。

1から10行目までは前回とあまり変化なく、スライダー作成するだけです。
11行目からですが、これもそんなに違いはありません。For命令でスライダーの値のマイナスから繰り返しています。

def makeCube():
 hei=pm.intSliderGrp(boxH,q=True,value=True)
  for i in range(-1*hei,hei+1):
   print i
   pm.polyCube(w=0.9,h=0.9,d=0.9)
   pm.move(0,0,i)

なので、スライダーが3だと、-3,-2,-1,0,1,2,3と7回繰り返し、Cubeは-3から3まで7個作成され、0.9なので少し隙間ができます。

では、これを改造して以下のようにします。ちょっと長いですが、良く見てください。

実行すると、チェックボックスができるのでXをOnにして実行します。

XとZをOnで4つ

XYZ全部Onで5つ。好きな項目をOn/Offできる機能が付きました。
プログラムは長いですが、新しい箇所は少ないです。7~9行目で、

checkBox1 = pm.checkBox(label='X')
checkBox2 = pm.checkBox(label='Y')
checkBox3 = pm.checkBox(label='Z')

だけでチェックボックスが表示されます。簡単ですね。

あとは、その3つの変数を、関数の方の19,23,27行目でif分で判断しているだけです。

if checkBox1.getValue():
if checkBox2.getValue():
if checkBox3.getValue():

ifが3つですから、チェックボックスがOnのものは全部実行されるのです。
でも良く見てください。それぞれのifの下の3行はほとんど同じですよね?
それぞれの最後の行、22,26,30だけX,Y,Zのどれを移動するかの違いです。
これはムダで美しくありません。
それとこれはバグがあるんです。これだと、0,0,0の位置のCubeは複数あることになりますね。

では、17行め以降を書き換えます。

ほぼ同じことを3回やるので、これをcopyCubeという新しい関数にします。

def copyCube(hei,xi,yi,zi):
 for i in range(-1*hei,hei+1):
  if i != 0:
   pm.polyCube(w=0.9,h=0.9,d=0.9)
   pm.move(xi*i,yi*i,zi*i)

heiの引数を受け取って、Cubeを複数作って、,xi,yi,ziの引数でmoveで移動させる仕組みです。
さらに0の場合ダブって作るバグを取るため、if i != 0:で回避しています。
i != 0は「ゼロでなければ」という意味で「!」を使うのです。つまりゼロでない時だけCubeを作るのです。

それに併せて関数makeCubeを改造します。

def makeCube():
 hei=pm.intSliderGrp(boxH,q=True,value=True)
 if checkBox1.getValue():
  copyCube(hei,1,0,0)
 if checkBox2.getValue():
  copyCube(hei,0,1,0)
 if checkBox3.getValue():
  copyCube(hei,0,0,1)

無駄に繰り返していた部分をcopyCubeに変更して、スッキリしています。
実行結果は・・・原点が空になるだけで、さっきと同じです。

変化がないなら意味がない!とは思わないでください。プログラムは動くことが基本ですが、その後のメンテナンスや改造がしやすいことが大切です。
プロの人でも何日か経ったプログラムを見ると、何をやっていたか解らなくなることもあるのです。
初心者の多くが頑張って長いプログラムを書いてしまい、
 1)後で直すことができない
 2)どうやって動いているか解らない
 3)バグが見つからない
ことから挫折するのです。なるべく関数で処理を分解して、小さい単位で作成することを強くお勧めします。
階段を上がるのは小さな段差なら楽ですよね。

では、もうちょっと改造してみます。
長くなった・・・ようですが、追加したのは13行と29、32行のたった3行です。

実行すると、文字を入れる個所ができて、その通りにオブジェクト名を自動で設定するテキストフィールドという機能です。
13行の
boxname=pm.textFieldGrp(l=”CubeName”,editable=True)
textFieldGrpが文字を入れる機能で、変数boxnameに代入します。

29行でそれを受け取り、変数cnに入れます。
cn=pm.textFieldGrp(boxname,q=True,text=True)
32行でpm.polyCube(w=0.9,h=0.9,d=0.9,n=”myBox”+”_”+cn+str(xi*i)+str(yi*i)+str(zi*i))
というようにCubeを作るときにn=”???”と書くとオブジェクト名になるのです。
“myBox”+”_”+cnで文字を足し算します。文字の足し算は意味不明かもしれませんが、文字が連結すると考えればOKです。
xi,yi,ziは引数のmoveの移動量ですね。これは数値なので文字の足し算(連結)できません。そこでstrという関数に入れると、数値を文字に変更してくれるのです。
でもstrって関数は作ってませんね?これはPythonに初めから入っている関数なのです。
これを「Python標準ライブラリ」といって非常に便利な道具がそろっています。

なので、fukanoとテキストフィールドで入力して、xi*i,yi*i,zi*i=0,-1,0だと
オブジェクト名は「myBox_Fukano0_10」になります。
「-」はMayaでは使えないので自動で「_」に変更されてしまいました。このようにPythonとしては処理できてもMayaが受け付けないこともあるので注意です。

今回はここまでです。

UnrealEngine4/UnrealStudioでPython その①

しばらくMayaのPythonのお話をしていますが、ブロスは映像もアニメもやりますが、UnrealEngine4などゲームエンジン・リアルタイムレンダリングも得意とするCGプロダクションです。
そこで、金曜日はその辺を今後は連載していく予定です。

その第一回ですが、UnrealEngine4が「UnrealStudio」というのをリリースをしています。昨年の夏には「DataSmith」と呼んでいたものです。
これは、CADデータや3dsmaxのV-rayデータを変換する機能で、現在は無料ですが、今年の11月から月額49ドルになりますが、建築・機械設計やプロダクトデザインの方は使わない手はありません。

これの解説をしていきたいと思いますが、最初はやはり「Python」です。
UnrealStudioの機能がデータ変換がメインなのでちょっと霞んでますが、これもとても期待される新機能です。
例によってPythonのバージョンは2.7ですがUnrealEngine4をビルドし直せば、他も使えるようなのでいずれご紹介ます。

まず、上のサイトから「無料のベータ版に今すぐ申し込むことができます」をクリックして、登録してください。
そのあと、EpicGameLancherで再ログインしすると・・・

このようにUnrealDataSmithと3dmaxExpoterのメニューが出たらOKです。登録しないと、出ませんのでご注意ください。
UnrealEngine4.19をインストールし、起動します。

いつものNewProjectのC++のさらに右に「UnrealStudio」タブが出ますので、Blankで起動します。

プラグインマネージャーでBuilt-Inで「Python」で検索すると、プラグインがあるので、下の「Enable」チェックをONにして、UE4を再起動します。

ウインドウからアウトプットログを出すと、Pythonが選べるようになっています。
試しにPythonのPrint命令を入力してEnterすると、命令が実行されます。

アウトプットログがゴチャゴチャして見にくい場合、右クリックから「ClearLog」できます。

では、テスト用に短いプログラムを書いてみます。
1行に「import uneal」と書くのがUnrealStudioのPythonのルールです。
この辺はMayaでお馴染みですね。
これをC:ドライブ直下に保存して、アウトプットログで、以下のようにタイプして実行します。
これは、ベクトル変数のV1、V2、V3を計算したものです。
ベクトル変数Vectorは(X,Y,Z)とか(R,G,B)とか3つの値を記録します。
V1.xは3つのうちの最初の要素で5になります。V2は見たまま3つの値を入れています。V1とV2を足すので、X要素が5+5=10です。それを2倍してV3に代入します。
結果、V3=(20,8,6)ということで計算が正しく行われたことが解ります。

コマンドで実行は面倒な場合はFileメニューから「ExcutePythonScript」を実行します。

作成したPythonプログラム~.pyを選べば実行されます。

一度実行して、プログラムを修正した場合、「RecentPythonScript」で再実行できます。

いかがでしょうか?UnrealEngine4でもPythonでスクリプトが実行できるのです。ただし、このままではEditorだけでRuntimeでは動きません。

次回、もう少し実用的なプログラムを書いてみましょう。
火曜日はまたMaya-Pythonです。