どうも、最近TAとしての業務が増えてきたワタリシキです。
今回はMayaとUEで位置のコピペを行うツールを作ってみましょう。
最近はUEでのモデリング機能も充実してきましたがまだまだ実際の現場ではMayaなどのDCCツールでモデリングを行うことが多いです。
プロップならインポートした後に配置すれば良いのですが、構造物などは他のオブジェクトとの干渉具合などを確認しながらモデリングしたい場合があります。
位置情報のコピペ機能があると便利なので作ってみます!
↓今回作ったもの
これを応用すればマップ全体の同期ツールなども作れそうですね!
詳細
前提としてMayaとUEは別ツールのためコピーした位置情報をどこかに保存しておく必要があります。CSVやJSONなど別ファイルに保存する方法、パイプラインツールを用いて値を渡す方法などがありますが、今回は簡単な方法としてクリップボードを使ってみます。
どうやってクリップボードに書き込み、読み取りするかですがいくつか方法が考えられます。
- pythonのsubprocessモジュールを使う
Pythonにはsubprocessモジュールというものがあり、プログラムから他のアプリを起動したり、実行結果を得たりするモジュールです。windowsに付属するclip.exeを使うとクリップボードにコピーができます。
しかし読み取りができないため貼り付け先のツールでペーストさせ、変換するという手間が起きます。
- PythonのPyperclipモジュールをインストールする
こちらはclip.exeの強化版で書き込み読み取り両方できますがpip installする必要が出てきます。一人ならともかくプロジェクトなどで全員の環境にinstallするのは多少手間です。
Unrealにはクリップボードを使う機能がC++にあり、それをBPに公開する方法があります。良さげですがC++を使う必要があるのとMaya側で別途実装が必要そうです。
結果的にはこれが成功で、Maya→PySide2、UE→tkinterというそれぞれ標準で付いているGUIのモジュールを使うことで追加インストールやC++無しでクリップボードやりとりが可能でした。
後から調べたらPowerShellでもできたのでモジュール分ける必要ないかもしれません!
Mayaのコードはこんな感じ
from PySide2 import QtGui
import maya.cmds as cm
cb = QtGui.QClipboard()
# 取得
data = cb.text()
list = cm.ls(sl=True,type="transform")
for sel in list:
data = data.split(',')
trans = cm.getAttr(sel+".translate")
rot = cm.getAttr(sel+".rotate")
scale = cm.getAttr(sel+".scale")
tform = trans + rot + scale
cbtext = str(tform)
cbtext = cbtext.replace('(','')
cbtext = cbtext.replace(')','')
cbtext = cbtext.replace('[','')
cbtext = cbtext.replace(']','')
cb.setText(cbtext)
print(cbtext)
アトリビュートを取得した段階では (0.0, 0.0, 0.0)のように"("などが入ってるので今回は除いています。
UE側のBPでペーストボタンを押したときの関数はこちら
https://blueprintue.com/blueprint/glstzzx_/
https://blueprintue.com/blueprint/m0zew05r/
Mayaが右手Yupの座標系に対してUEは左手Zupの座標系なのでどちらかのコードで修正してあげましょう。今回はペースト側のUE側で変換しています。
まとめ
今回はMaya→UEへのコピペですがUE→MayaへのコピペだったりBlenderなどの他ソフトでの対応も同じノリでできると思います。
応用するとUEシーンの再現等もできると思いますが、メッシュの参照をどう持たせるかなど考えることが増えていきます。