ここのところノードの話ばかりだったので、今日はScriptの話にしてみました。
次のようなスクリプトを作ってみました。
以前、Twitterでちょこっとツイートしたのですが、
下の絵のように、2Dドット絵から3Dのドット風絵に変換するスクリプトです。
(あくまで、ドットをCubeに置き換えるだけで、凸凹させるのはできません。あしからず)
これは別途ダウンロードする必要があったりします。
maya2012の場合は”for Python 2.6″でよかったと記憶しています。
PILモジュールに関して、Degital FronttierさんのDF TALKにすこし載ってますので参考に。
以下が作成したスクリプトです。
必要な機能のみ搭載した状態で、実際に使うならエラー処理やら関数化やらすべきでしょうね。
つまり、あまり良いコードではないと。
でも、こんなのでも出来たよということで。
スクリプトの中身はこんな事をやってます。
①画像データを取得(tga)
②各ピクセルから使用している色をリスト化
③各色のマテリアルを作成(mia_material)
④polyCubeを作成、ピクセル位置に配置
⑤対応ピクセルの色情報からpolyCubeにマテリアルをアサイン
import PIL.Image
import maya.cmds as cmds
import pymel.core as pm
######################
#画像取得
######################
getPath = cmds.fileDialog(dm = "*.tga")
im = PIL.Image.open(getPath)
#画像のサイズを取得
getSize = im.size
######################
#使用カラー割り出し、リスト化
######################
a=[]
for i in range(getSize[0]*getSize[1]):
clr = im.getdata()[i]
a.append(clr)
#リストの重複を削除
matList = list(set(a))
######################
#マテリアル作成
######################
count=0
dic = {}
#角丸め用にmia_roundcornersノード作成
roundMat = pm.shadingNode('mia_roundcorners', asShader=True,n="pixel_roundcorners")
for i in matList:
matName = "mat_%04d" % count
mat = pm.shadingNode('mia_material_x_passes', asShader=True, n=matName)
mat.diffuse.set(i[0]/255.0, i[1]/255.0, i[2]/255.0)
count = count +1
dic[i] = mat
roundMat.outValue >> mat.overall_bump
#オブジェクト格納用の空グループ作成
gp = pm.group( em=True, name='pixel_GP' )
######################
#polyCube作成&配置
######################
#print getSize
for h in range(getSize[1]):
for w in range(getSize[0]):
id = getSize[0]*h+w
#アルファが0で無ければpolyCubeを作成
c = im.getdata()[id]
if len(c) == 4:
if c[3] != 0:
b = pm.polyCube()
b[0].tx.set(w)
b[0].ty.set(-h)
mat = dic
pm.select(b)
pm.hyperShade(assign=mat)
pm.parent( b, gp )
else:
b = pm.polyCube()
b[0].tx.set(w)
b[0].ty.set(-h)
mat = dic
pm.select(b)
pm.hyperShade(assign=mat)
pm.parent( b, gp )
ちなみにこのスクリプトの実行は自己責任ってことで、ヨロシク!
pixelが多いとCubeの生成に時間がかかります。(300×300とか多い部類。90000個のCubeだしね)
あと、このスクリプトで出来るのは真っ平らなpolyCubeの並びまでで、凸凹には対応していません。サンプルは手でいちいち移動させました。
最後は力業かよって感じですが、よい方法が思いつきませんでした。
さらにいえば、これをドット風に動かしたかったのですが、それも良い方法が思いつかなくて断念。
思いついたらサラッと、更新してるかもしれませんw
それにしてもpythonとpymelは便利ですね。もうMELには戻れませんねw
おまけ










是非maya2022版を作って欲しいです