Minecraft PI EDでBITMAP地上絵

mcpi-geoglyph
(ネオジオン風 地上絵)

『機動戦士ガンダムユニコーン RE:0096』。前作は見てなくて初めてのユニコーンになります。面白い要素は人それぞれでしょうけど、私の場合は、ロボットが変形するのか、しないのか、です。ガンダムユニコーンというぐらいだから、ガンダムが一角獣に変形するのを期待していました。いや待てよ、それってトランスフォーマーだよなぁ、と思いつつ、変形を想像しながら本作を見始めました。敵が強いと自動的に変形する仕組みらしいシステムで変形したのは、残念ながら一角獣ではありませんでした。しかし、私の期待を良い意味で裏切ってくれました。なんと、頭部の角が2つに割れたんです。私の頭の中では絶対に割れるはずのないものが割れたので驚愕しました。一本の角が2つに割れると、当然いつものガンダムの顔になり、アニメ内のキャラクター達も驚愕し、そこでようやく、ガンダムだと認識しているようでした。今気づいたんですか!

今回はMinecraft PI EDで地上絵を描きます。

GIMPでポスタライゼーションしたひまわりの画像(64×64)を使います。
gimp-sunflower64x64

ちなみに、ポスタライゼーションは、このメニューで。
gimp-poster

加工後の画像は色の組み合わせが少なくなり、以下のように9種類ほどになります。

~$ od -tx1 -An -j54 -vw3 blog/lic/img/himawari-pos.bmp | sort | uniq
 00 80 00
 00 80 80
 00 80 ff
 00 ff 80
 00 ff ff
 80 80 00
 80 80 80
 80 ff 80
 80 ff ff
~$ 

地上絵は色鮮やかに描きたいです。ブロックの色で近い色を探したいので、色の豊富なWOOLから選ぶことにします。
Minecraft PI EDで色付きのWOOLを生成するには、やはりsetBlockを使います。WOOLのブロックIDは35です。

setBlock(x, y, z, ブロックID, 色番号)

しかし、どの色がどの色番号か分かりません。実際にブロックを並べて確認することにしました。WOOLを並べるスクリプトはこれです。

~$ cat wool.py
import minecraft
mc=minecraft.Minecraft.create()

mc.setBlocks(-60,0,-60, 60,60,60, 0)

for i in range(0,128):
	x=i%10
	z=i/10
	mc.setBlock(x,0,z, 35, i)

上記スクリプトを実行すると、このように色番号順でブロックが並びます。
mcpi-wool-0-127

同じ色の繰り返しのようです。
mcpi-wool-color-withnumber

それぞれの色をMinecraft PIのWOOLの色から近い色を選択します。かなり適当に選んでいます。

mcpi-wool-pattern

色がある程度固まったらスクリプトのベースとするファイルを作成します。スクリプトをスクリプトを使って書くのでメタスクリプトですね。

~$ hexdump -s54 -ve '3/1 "%02x" "\n"' himawari-pos64.bmp |
 sort | uniq | xargs printf "dt['%s']\n" | tee colordata.txt
dt={}
dt['008000']
dt['008080']
dt['0080ff']
dt['00ff00']
dt['00ff80']
dt['00ffff']
dt['808000']
dt['808080']
dt['80ff80']
dt['80ffff']
~$ 

使用する色データを並べて、pasteで各配列(Dictionary)に代入します。

~$ echo 13 13 12 1 13 4 5 5 5 13 | tr ' ' '\n' | paste -d= colordata.txt -
dt['008000']=13
dt['008080']=13
dt['0080ff']=12
dt['00ff00']=1
dt['00ff80']=13
dt['00ffff']=4
dt['808000']=5
dt['808080']=5
dt['80ff80']=5
dt['80ffff']=13
~$ 

上記の色データ設定を組み込んだスクリプトがこれです。

~$ cat t.py
import minecraft,sys
mc=minecraft.Minecraft.create()
dt={}
dt['008000']=13
dt['008080']=13
dt['0080ff']=12
dt['00ff00']=1
dt['00ff80']=13
dt['00ffff']=4
dt['808000']=5
dt['808080']=5
dt['80ff80']=5
dt['80ffff']=13

cnt=0
for line in sys.stdin:
  z=cnt/64
  x=cnt%64
  mc.setBlock(x,0,-z, 35,dt[line.rstip()])
  cnt=cnt+1

~$ 

生成されたスクリプトt.pyを実行すると、ひまわり地上絵が出現します。

hexdump -s54 -ve '3/1 "%02X" "\n"' himawari-pos64.bmp | python t.py

mcpi-ground-picture

Leave a Reply

Your email address will not be published. Required fields are marked *

CAPTCHA