UnrealEngine4/UnrealStudioでPython

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

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

これの解説をしていきたいと思いますが、最初はやはり「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です。

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

前回の続きでUIを作っていきます。スライダーでCubeの大きさを決めるだけでは全然実用性が無いですので。
では、以下のプログラムからです。

def makeCube():
 hei=10
 for i inrange(0,hei):
  pm.polyCube(w=1,h=i+1,d=1)
  pm.move(0,0,i)
  pm.rotate(i*10,0,0)


実行して、makeCube()というコマンドをさらに実行します。
こんな芸術的な形状ができます。
解説しますと、
1:関数のmakeCube()を定義。引数は無し
2:heiという変数を10に設定
3:for命令で、iという変数を0からheiまで繰り返し。この下の4~6がインデント(行の頭にスペース)しているのでそれを10回繰り返しします。
4:Cubeを幅1、高さi+1、奥行1で作成
5:Zに1移動します。1,2,3・・・10と変化します。
6:Xにiを10倍した値を回転します。1,10,20・・・100と変化

というわけで、Cubeがだんだん大きくなって、回転しながら移動するという立体を自動生成できます。heiの値を変えれば箱の数も自由に変化できますね。

for命令を忘れた!という方は過去の連載をご覧ください。

そこで、前回のスライダーのプログラムと組み合わせるのです。

import pymel.core as pm
Swindow = pm.window("testWindow",t="Slider",w=300,h=100)
pm.columnLayout(adj=True)
pm.text("input Copy Count")
boxH=pm.intSliderGrp(l="Count",min=0,max=20,f=True)
pm.button(l="Create",c="makeCube()")
pm.showWindow(Swindow)
def makeCube():
 hei=pm.intSliderGrp(boxH,q=True,value=True)
  for i inrange(0,hei):
   pm.polyCube(w=1,h=i+1,d=1)
   pm.move(0,0,i)
   pm.rotate(i*10,0,0)

実行すると、以下のようにスライダーが表示され、その数だけCubeを複製します。だいぶオリジナルツールになってきました。

説明すると、さっき作ったmaleCubeに関数のheiの値をスライダーの値を受け取っているだけです。前回の連載の内容と比較してください。前回はこれをスケールに値に入れたのですが、それを繰り返す回数にしただけです。

前回との違いはfloatSliderGrpintSliderGrpに変更しています。
前は「高さ」の値ですから、1.2とか5.6とか小数点以下がありますからfloatですが、今回は「個数」なので整数のintを使います。
プログラムで難しいのは流れているデータが何なのかを予想して作ることです。

このようにアイディアがあれば、プログラムをだんだんと拡張していけば良いのです。

では、さらにその前の連載のラジオボタンを使ってみます。
上の5と6行目の間に以下を行を入れます。

pm.rowLayout(numberOfColumns=3)
pm.radioCollection()
pm.radioButton(label="BOX")
pm.radioButton(label="BALL")
pm.radioButton(label="POST")
pm.setParent('..')


実行すると、3つのラジオボタンが横並びになります。これも復習ですね。

まだ何も機能が入っていません。そこで以下のように書き換えます。変更点だけ掲載します。どこに入れるかは、画像で確認してください。

radioCo = pm.radioCollection()
pm.radioButton('radioButton1',label="BOX")
pm.radioButton('radioButton2',label="BALL")
pm.radioButton('radioButton3',label="POST")
sele = pm.radioCollection(radioCo, q=True, select=True)
for i inrange(0,hei):
 if sele =='radioButton1':
  pm.polyCube(w=1,h=i+1,d=1)
  pm.move(0,0,i)
  pm.rotate(i*10,0,0)
 elif sele =='radioButton2':
  pm.polySphere(r=i+1)
  pm.move(0,0,2*i)
 elif sele =='radioButton3':
  pm.polyCylinder()
  pm.move(0,0,i*2)
  pm.scale(1,i+1,1)
実行すると、以下のようにラジオボタンで3タイプのモデルを選んで、スライダーでコピーできるツールになりました。
ボールは直径が2倍づつ大きくなり、柱はY方向に1づつスケールが増えます。
8:radioCoという変数にラジオボタンで選ばれた値を入れる変数を作成します。
9~11:‘radioButton?’を各ボタンのラベルの前につけて、どれが選ばれたかの判断に使います。
21:seleという変数にラジオボタンで選ばれた値を入れます。
23、27、30でif、elif命令でseleの値とボタンの値が一致しているか判断して、それ以下の行の命令を実行します。それぞれ、Cube、Sphere、Cylinderのポリゴンで、移動や回転、スケールなどしています。
if命令を忘れた!という方も過去の連載をご覧ください。
少し長くなってきましたが、ゆっくりやればできるはずです。ぜひチャレンジしてください。
次回はチェックボックスと文字入力のフィールドを実験します。