3Dプリンターでものづくり(モノクロ)では、1種類のブロックだけを積み上げましたが、今度はいろんなブロックを使ってみます。3Dプリンターのカラー対応って感じです。では早速。プログラムはあまり変わりませんが、ディクショナリを使って、数字とブロックのつながりを決めています。0は何も置かない、1なら赤色の羊毛、2ならオレンジ色の羊毛。
import mcpi.minecraft as minecraft import mcpi.block as block from mcpi.vec3 import Vec3 mc = minecraft.Minecraft() def print1D(start, data, inc): for x in range(0,len(data)): if data[x] != 0: mc.setBlock(start.x + x, start.y, start.z, inc[data[x]]) inc_rainbow = { 1:block.WOOL_RED, 2:block.WOOL_ORANGE, 3:block.WOOL_YELLOW, 4:block.WOOL_LIME, 5:block.WOOL_LIGHT_BLUE, 6:block.WOOL_BLUE, 7:block.WOOL_PURPLE } rainbow = [1, 2, 3, 4, 5, 6, 7] print1D(mc.player.getPos() + Vec3(1,0,0), rainbow, inc_rainbow)
実際に置いてみると、こんな風に虹色になります。
次は2次元ですが、スマイルマークをきれいにしてみます。
import mcpi.minecraft as minecraft import mcpi.block as block from mcpi.vec3 import Vec3 mc = minecraft.Minecraft() def print2D(start, data, inc): for z in range(0,len(data)): for x in range(0,len(data[z])): if data[z][x] != 0: mc.setBlock(start.x + x, start.y, start.z + z, inc[data[z][x]]) inc_smile = { 1:block.WOOL_YELLOW, 2:block.WOOL_BLACK, 3:block.WOOL_RED } smile_fill = [ [0,0,0,1,1,1,1,1,0,0,0], [0,0,1,1,1,1,1,1,1,0,0], [0,1,1,1,1,1,1,1,1,1,0], [1,1,1,2,1,1,1,2,1,1,1], [1,1,1,2,1,1,1,2,1,1,1], [1,1,1,1,1,1,1,1,1,1,1], [1,1,1,1,1,1,1,1,1,1,1], [1,1,1,3,3,3,3,3,1,1,1], [0,1,1,1,3,3,3,1,1,1,0], [0,0,1,1,1,1,1,1,1,0,0], [0,0,0,1,1,1,1,1,0,0,0] ] print2D(mc.player.getPos() + Vec3(1,0,10), smile_fill, inc_smile)
中身も色が塗られて、口も赤くなりました。3色使っています。
では最後に、これはどうなるでしょうか。pig.csvというファイルをダウンロードして、.pyと同じ場所に置いて下さい。
import mcpi.minecraft as minecraft import mcpi.block as block from mcpi.vec3 import Vec3 mc = minecraft.Minecraft() import csv def print3D(start, data, inc): for y in range(0,len(data)): for z in range(0,len(data[y])): for x in range(0,len(data[y][z])): if data[y][z][x] != 0: mc.setBlock(start.x + x, start.y + y, start.z + z, inc[data[y][z][x]]) inc_pig = {1:block.WOOL_PINK, 2:block.WOOL_BROWN, 3:block.WOOL_BLACK, 4:block.WOOL_WHITE, 5:block.WOOL_RED} data =[] with open('pig.csv', 'r') as f: file = csv.reader(f) plane = [] for line in file: if len(line) == 0: data.append(plane) plane = [] else: plane.append(line) data.append(plane) data_conved = [[[int(elm) for elm in l] for l in p] for p in data] print3D(mc.player.getPos() + Vec3(1,0,1), data_conved, inc_pig)
豚さんです。ちょっと巨大過ぎますね。この豚が動いたりしたらもっと楽しいですが・・・、それはまた今度。