MAYAからのテクスチャ制御
2011/5/10
Tag: maya,photoshop,PIL,python,script,win32com
はじめまして。 MAYA背景チームのATDをさせてもらっている conie lee と申します。
今回は、テクスチャ(イメージ)の制御について投稿させて頂きたいと思います。
・ テクスチャの再ロード
・ イメージのサイズ
・ win32comからPhotoshopの制御
・ PIL
■ テクスチャの再ロード (Fileノード)
一番よく使う機能の1つは、fileノードのReload機能でしょう。
イメージ編集ツール(Photoshopなど)で修正したファイルをmayaのview port上に反映させるために使いますが、
大きなマップになるとテクスチャの数が2~300枚以上になる場合もあります。
Hypershadeからfileノードを探し、Reloadする作業は時間が掛かります。
こんな時、以下のscriptを実行すると、すべてのテクスチャをReloadしてくれます。
import maya.cmds as cmds texList = cmds.ls(type = "file") for i in range(len(texList)): getPath = cmds.getAttr(texList[i] + '.fileTextureName') cmds.setAttr( texList[i] + '.fileTextureName', getPath ,type = "string")
このままじゃ効率が悪いので、基準になる時間を設定して更新されたファイルだけReloadすればいいでしょう。
■ テクスチャのサイズ
Mayaで使うテクスチャのサイズが2のべき乗じゃない場合、
mayaのview port上でテクスチャがぼけて表示されたり、
ゲームの実機上ではUVが伸びて見える原因になったりします。
サイズをチェックしたい場合、
cmds.getAttr('fileノード名.outSize')
を使えばサイズをゲットすることができます。
テクスチャのサイズをmayaにimportする前に知りたい場合、以下の方法があります。
import maya.OpenMaya as M import maya.cmds as cmds getPath = cmds.fileDialog(dm = "*.tga") w = M.uIntPtr() h = M.uIntPtr() img = M.MImage() img.readFromFile(getPath) img.getSize(w, h) print w.value() print h.value()
■ win32comからPhotoshopの制御
今回のメインテーマになるwin32comを利用したPhotoshopの制御です。
■ 1. インストール
・ python2.6.x のインストーラをダウンロードしてインストールします。
・ pywin32-216.win-amd64-py2.6(win32comが入ったモジュール) をダウンロードしてインストールします。
■ 2. 準備
python command windowを開きます。
import win32com.client ps = win32com.client.Dispatch("Photoshop.Application")
Window用Photoshop場合、Java SciprtとVisual Basic言語でphotoshopを制御することができます。
win32comから制御する場合は、Visual Basic Script を使います。
photoshopがインストールされている pathには scriptsガイドがあるので参照してくたざい。
例) C:\Program Files (x86)\Adobe\Adobe Photoshop CS2\スクリプティングガイド
VisualBasic Reference Guide.pdf
このファイルの中には photoshopの object と constantのリストが含まれています。
■ 3. 実行
● 3-1 新規ファイル作成
doc = ps.Documents doc.Add(256,256)
これで、新規ファイルが作成されます。
サイズを確認して見ましょう。
幅256、高さ256を入力したのに違うサイズに作成されました。
人によっては合ってるかもしれませんが、これはUnitの問題です。
unitをpixelに変更しましょう。
# constant を Queryする場合の例 ps.Preferences.RulerUnits
ps.Preferences.RulerUnits をqueryすると 4とreturnしました。
VisualBasic Reference Guide.pdfを確認しましょう。
# constant を Editする場合の例 ps.Preferences.RulerUnits = 1
unitが mmになっていたのでpixelに変更しました。
これでもう一回実行すると
doc.Add(256,256)
● 3-2 現在、選択しているDocumentsの制御
actDoc = ps.ActiveDocument
現在選択されているObjectをケットします。
# イメージを複製したい場合 actDoc = ps.ActiveDocument actDoc.Duplicate() # (イメージ > 複製 と同じ)
# イメージを反転したい場合 actDoc = ps.ActiveDocument actDoc.FlipCanvas(1) # horiznotal (イメージ > カンバスの回転 > カンバスを左右に反転 と同じ) actDoc.FlipCanvas(2) # vertical (イメージ > カンバスの回転 > カンバスを上下に反転 と同じ)
actDoc.FlipCanvas(Parameter Type)ように
methodの引数がconstantの場合整数を入れます。
● 3-3 Filter 適用する方法
actDoc = ps.ActiveDocument actDoc.ActiveLayer.ApplyGaussianBlur(2) # フィルタ > ぼかし > ばかし(ガウス) と同じ
■ 4. Mayaで実行
mayaからwin32comを実行する一番簡単な方法は、
PythonがインストールされているPath\Lib\site-packages\
の下にあるファイルをまるっと
MayaがインストールされているPath\Python\lib\site-packages\
へコピーすることです。
※pywin32以外のモジュールをコピーしてしまう可能性も大いにあるので、pythonモジュールをしっかり整理しておきたい方は、周りに居るpython&システムに詳しい方に聞いて下さいね!
ちなみに、pywin32をインストールしたマシンであればこれだけで動くのですが、違うマシンでも動かしたい場合は別途dllにもパスを通す必要があります。(コピー後であれば、MayaがインストールされているPath\Python\lib\site-packages\pywin32_system32 をwindowsのシステムパスへ追加する)
また、私がうまくいった環境は以下になります。
・window7 x64
・maya2011 x64
・python2.6.4 amd64
・pywin32-216.win-amd64-py2.6
python, win32com, mayaのバージョンがうまく合わずに動かない場合も多々あるので、試される方は気をつけてください。
※動かなくても当方で責任を取る事は出来ませんので、周りに居るpython&システムに詳しい方に聞いて下さいね!
■ Python Imaging Library(PIL)
最後に、他にイメージを制御するmoudleの中にはPILがあります。
Photoshopにはない機能もあるので使って見てください。
たとえば、Photoshop のRGBColor objectには Alpha情報がないです。
この時はPILを使えばいいです。
import PIL.Image import maya.cmds as cmds getPath = cmds.fileDialog(dm = "*.tga") im = PIL.Image.open(getPath) getColor = im.getdata()[0]
getColor = im.getdata()[index]
を利用すれば他のpixelカラー情報も得ることができます。
このイメージはテクスチャのサイズごとに Polygon Plane を Subdivisionし、
Faceごとに Vertex Colorを適用した例です。
赤丸部分では、Vertex Color alphaを使ってplaneが透明になるように処理しています。
以上、MAYAからのテクスチャ制御でした。
-conie-
コメント
コメントフォーム