Minecraft PI EDでBITMAP地上絵

Minecraft Pi Edition

『機動戦士ガンダムユニコーン RE:0096』(2016)
前作は見てなくて初めてのユニコーンになります。ガンダムって面白いですよね。
面白い要素は人それぞれでしょうけど、私の場合は、ロボットが変形するのか、しないのか、です。

ガンダムユニコーンというぐらいだから、ガンダムが一角獣に変形するのを期待していました。いや待てよ、それってトランスフォーマーだよなぁ、と思いつつ、変形を想像しながら本作を見始めました。

敵が自分より強いと急に激おこ。なんか勝手に変形する仕組みらしいシステムで現れた姿は、残念ながら一角獣ではありませんでした。

しかーし、一角獣ではないけれど、私の期待を良い意味で裏切ってくれたんです。
なんと、頭部の角が2つに割れたんです。
私の人生のどこを切り取って探してもまったく経験のない、絶対に割れるはずのないものが割れたので驚愕、変な声をあげてしまいましたよ。

一本の角が2つに割れると、当然のようにいつものガンダムの顔になり、アニメ内のキャラクター達までも私と同じく驚愕し、そうしてようやく、ガンダムだと認識しているようでした。

今気づいたんですか! アンパンマン如く目が節穴

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

今回は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

コメント

タイトルとURLをコピーしました