No More Retake

3DCG屋さん向けTips&Referenceサイト

メニュー

「2D dot」 To 「3D dot」 Scripts

ここのところノードの話ばかりだったので、今日はScriptの話にしてみました。

次のようなスクリプトを作ってみました。
以前、Twitterでちょこっとツイートしたのですが、
下の絵のように、2Dドット絵から3Dのドット風絵に変換するスクリプトです。
(あくまで、ドットをCubeに置き換えるだけで、凸凹させるのはできません。あしからず)

試しにレンダリングすると・・・
もっとつくってみた。
調子に乗って、さらに作ってみた。ピクセルってたら彼かな、と。
えーと、スクリプトね。
画像を制御するモジュールとしてPIL(Python Imageing Library)というモジュールを使用しました。

これは別途ダウンロードする必要があったりします。
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

おまけ

関連記事

  1. 2013.10.14

    toxik:[Blur]
  2. 2013.08.05

    toxik:はじめに
  3. 2014.06.08

    toxik:[Link Image]
  4. 2014.01.13

    toxik:[Freeze]
  5. 2013.10.07

    toxik:[sRGB]

コメントをお待ちしております

このサイトについて

3DCG Tipsサイト。Houdiniの記事が多めです。

RSS

follow us in feedly

アンケート

あなたはプロのCG屋さんですか?

View Results

Loading ... Loading ...

言語切り替え

  • English (United States)
  • 日本語

Archives

  • 2016 (33)
  • 2015 (64)
  • 2014 (54)
  • 2013 (60)
  • 2012 (54)

スポンサードリンク