3Dカラープリンター

,,
3Dプリンターでものづくり(モノクロ)では、1種類のブロックだけを積み上げましたが、今度はいろんなブロックを使ってみます。3Dプリンターのカラー対応って感じです。では早速。プログラムはあまり変わりませんが、ディクショナリを使って、数字とブロックのつながりを決めています。0は何も置かない、1なら赤色の羊毛、2ならオレンジ色の羊毛。 [python] 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) [/python] 実際に置いてみると、こんな風に虹色になります。 次は2次元ですが、スマイルマークをきれいにしてみます。 [python] 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) [/python] 中身も色が塗られて、口も赤くなりました。3色使っています。 では最後に、これはどうなるでしょうか。pig.csvというファイルをダウンロードして、.pyと同じ場所に置いて下さい。 [python] 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) [/python] 豚さんです。ちょっと巨大過ぎますね。この豚が動いたりしたらもっと楽しいですが・・・、それはまた今度。

3Dプリンターでものづくり(モノクロ)

,,
金のなる木を植えるではプログラムでブロックの置き方を一個ずつ決めていましたが、もっと簡単に好きな形を作れるプログラミングをしてみます。簡単に言うと、配列と繰り返しを使います。 1,1,1,0,1,0,1 というような配列があったときに、1のところでブロックを置き、0のところでは置かない。次のようなプログラムになります。 [python] import mcpi.minecraft as minecraft import mcpi.block as block from mcpi.vec3 import Vec3 mc = minecraft.Minecraft() def print1D(start, data, blk): for x in range(0,len(data)): if data[x]: mc.setBlock(start.x + x, start.y, start.z, blk) dotline = [1,1,1,0,1,0,1] print1D(mc.player.getPos() + Vec3(1,0,0), dotline, block.WOOL_RED) [/python] これは線(1次元)でしたが、次のプログラミングでは面(2次元)になります。 [python] import mcpi.minecraft as minecraft import mcpi.block as block from mcpi.vec3 import Vec3 mc = minecraft.Minecraft() def print2D(start, data, blk): for z in range(0,len(data)): for x in range(0,len(data[z])): if data[z][x]: mc.setBlock(start.x + x, start.y, start.z + z, blk) smile = [ [0,0,0,1,1,1,1,1,0,0,0], [0,0,1,0,0,0,0,0,1,0,0], [0,1,0,0,0,0,0,0,0,1,0], [1,0,0,1,0,0,0,1,0,0,1], [1,0,0,1,0,0,0,1,0,0,1], [1,0,0,0,0,0,0,0,0,0,1], [1,0,0,0,0,0,0,0,0,0,1], [1,0,0,1,0,0,0,1,0,0,1], [0,1,0,0,1,1,1,0,0,1,0], [0,0,1,0,0,0,0,0,1,0,0], [0,0,0,1,1,1,1,1,0,0,0] ] print2D(mc.player.getPos() + Vec3(1,0,10), smile, block.WOOL_YELLOW) [/python] 配列を遠目で見てもスマイルマークかな?って見えますね。プログラムは実はあまり変わっていないことがわかります。さて、では次に3D:立体(3次元)にチャレンジしてみます。 [python] import mcpi.minecraft as minecraft import mcpi.block as block from mcpi.vec3 import Vec3 mc = minecraft.Minecraft() def print3D(start, data, blk): for y in range(0,len(data)): for z in range(0,len(data[y])): for x in range(0,len(data[z])): if data[y][z][x]: mc.setBlock(start.x + x, start.y + y, start.z + z, blk) tent = [ [ [1,1,1,1,1], [1,0,0,0,1], [1,0,0,0,1], [1,0,0,0,1], [1,1,0,1,1], ],[ [1,1,1,1,1], [1,0,0,0,1], [1,0,0,0,1], [1,0,0,0,1], [1,1,0,1,1], ],[ [0,0,0,0,0], [0,1,1,1,0], [0,1,0,1,0], [0,1,1,1,0], [0,0,0,0,0], ],[ [0,0,0,0,0], [0,0,0,0,0], [0,0,1,0,0], [0,0,0,0,0], [0,0,0,0,0], ] ] print3D(mc.player.getPos() + Vec3(1,0,20), tent, block.WOOL_WHITE) [/python] もう配列を見ても何ができるのか想像がつきませんね。テントのような形になります。これで、たった6行のプログラムで、どんな形でもブロックを積み上げて作ることができます。 最後に、配列をプログラムではなくて、ファイルから読み込ませてみます。こんなファイルをmt_tsukuba.csvという名前で置いておけば、 [python] import mcpi.minecraft as minecraft import mcpi.block as block from mcpi.vec3 import Vec3 mc = minecraft.Minecraft() import csv data = [] with open('mt_tsukuba.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, block.WOOL_GREEN) [/python] 茨城県のシンボル、つくば山です。小さいのであまりそれっぽく見えないですね。今度もっと大きく作ってみます。地形図を電子国土Web地理院地図から入手しました。それをExcelの背景画像に設定して、トレーシングペーパーのように高さを書いて作っています。 こんな感じの地道な作業。

金のなる木を植える

,,
面白いプログラミングをしてみます。 このコードを実行すると、 [python] import mcpi.minecraft as minecraft import mcpi.block as block from mcpi.vec3 import Vec3 mc = minecraft.Minecraft() pos = mc.player.getTilePos() + Vec3( 3, 0, 0 ) #1 mc.setBlock( pos, block.WOOD ) #2 mc.setBlock( pos + Vec3( 0, 1 , 0 ), block.WOOD ) #3 mc.setBlocks( pos + Vec3( -2, 2, -2 ), pos + Vec3( 2, 2, 2 ), block.LEAVES ) mc.setBlock( pos + Vec3( 0, 2, 0 ), block.WOOD ) #4 mc.setBlock( pos + Vec3( 0, 3, 0 ), block.WOOD ) #5 mc.setBlocks( pos + Vec3( -1, 4, -1 ), pos + Vec3( 1, 4, 1 ), block.LEAVES ) mc.setBlock( pos + Vec3( 0, 4, 0), block.WOOD ) #6 mc.setBlock( pos + Vec3( 0, 5, 0 ), block.LEAVES ) [/python] こんな感じで木を作ることができます。 setBlock(), setBlocks()でオークの原木、オークの葉を順番に置いています。 setBlocks()は2つの位置を指定して、直方体にブロックを置く関数です。 ブロックの種別を変えたらどうでしょう。オークの葉を金ブロックに変えると 他にもカボチャのなる木、TNTのなる木などなど。マグマのなる木は危険です。 せっかくなので、色々な木を作るコードを関数にまとめてみます。 関数にまとめると [python] import mcpi.minecraft as minecraft import mcpi.block as block from mcpi.vec3 import Vec3 mc = minecraft.Minecraft() def createTree( start, wood = block.WOOD, leaf = block.LEAVES ): mc.setBlock( start, wood ) mc.setBlock( start + Vec3( 0, 1, 0 ), wood ) mc.setBlocks( start + Vec3( -2 ,2, -2 ), start + Vec3( 2, 2, 2 ), leaf ) mc.setBlock( start + Vec3( 0, 2, 0 ), wood ) mc.setBlock( start + Vec3( 0, 3, 0 ), wood ) mc.setBlocks( start + Vec3( -1, 4, -1 ), start + Vec3( 1, 4, 1 ), leaf ) mc.setBlock( start + Vec3( 0, 4, 0 ), wood ) mc.setBlock( start + Vec3( 0, 5, 0 ), leaf ) createTree( mc.player.getPos() + Vec3( 1, 0, 1 ), block.WOOD, block.LEAVES ) createTree( mc.player.getPos() + Vec3( 10, 0, 1 ), block.WOOD, block.GOLD_BLOCK ) createTree( mc.player.getPos() + Vec3( 20, 0, 1 ), block.WOOD, block.TNT) createTree( mc.player.getPos() + Vec3( 30, 0, 1 ), block.WOOD, block.PUMPKIN_ACTIVE) createTree( mc.player.getPos() + Vec3( 40, 0, 1 ), block.WOOD, block.LAVA_STATIONARY) [/python] このように引数を変えるだけで色々な木(もう木じゃないけど)を簡単に作ることができるようになります。

マイクラ世界のブロックの話

,
マイクラの世界にはたくさんのブロックがあります。ブロックを操作するにはgetBlock()とsetBlock()を使います。 まずsetBlock()で主人公の足元に鉄ブロックを置いてみます。 [python] import mcpi.minecraft as minecraft mc = minecraft.Minecraft() import mcpi.block as block pos = mc.player.getTilePos() mc.setBlock( pos.x, pos.y - 1, pos.z, block.IRON_BLOCK ) [/python] このブロックの情報を取得してみます。 鉄ブロックの上に立って [python] import mcpi.minecraft as minecraft mc = minecraft.Minecraft() import mcpi.block as block pos = mc.player.getTilePos() blk = mc.getBlock( pos.x, pos.y - 1, pos.z ) mc.postToChat( blk ) [/python] getしたブロックをチャットすると42と表示されます。 草ブロックだと2、石ブロックだと1です。 こんな感じでマイクラ世界のブロックは数字で種類が決まっています。 これをブロックIDといいます。 こちらのサイトにブロックIDの一覧があります。 ちょっと多いですね。

マイクラ世界の座標の話

,,
マイクラ世界の位置は座標で決まります。主人公の位置を座標を使ってプログラミングしてみます。 このページに書かれていること ・マイクラ世界の位置はX、Y、Zの座標で決まる ・取得できる座標にはtilePosとposがある こんな感じで、Xが横方向、Yが高さ、Zが奥行きと考えるとわかりやすいです。 プログラミングで主人公を移動させてみましょう。 [python] import mcpi.minecraft as minecraft mc = minecraft.Minecraft() pos = mc.player.getTilePos() #主人公の今の座標 mc.player.setTilePos( pos.x + 10, pos.y, pos.z ) [/python] 高くジャンプさせるには [python] mc.player.setTilePos( pos.x, pos.y + 10, pos.z ) [/python] です。あまり高くしすぎるとサバイバルだと死んでしまいます。 座標にはtilePosとposがあります。 tilePosは整数で、何個目のブロックにいるかということです。 posは少数で、ブロック上の細かい位置までを含みます。 歩きならが座標を表示してみるとわかりやすいです。 [python] import mcpi.minecraft as minecraft mc = minecraft.Minecraft() tilePos = mc.player.getTilePos() pos = mc.player.getPos() mc.postToChat( 'tileX:' + str( tilePos.x ) + ', X:' + str( pos.x ) ) mc.postToChat( 'tileY:' + str( tilePos.y ) + ', Y:' + str( pos.y ) ) mc.postToChat( 'tileZ:' + str( tilePos.z ) + ', Z:' + str( pos.z ) ) [/python] あまり気にしなくても良いのですが、tilePosやposはマイクラでF3を押して出る座標と合いません。 気持ち悪くて一致させたい時には、マイクラのコマンドで /setworldspawn 0 0 0 と実行すれば一致させられます。

ハロー!マイクラ

,,
いよいよマイクラ世界をpythonでプログラミングします。 RaspberryJamModをインストールした時のpython-scripts.zipの中にあるmcpiフォルダが置いてある場所でプログラミングを始めます。

このページに書かれていること

・postTochat()でマイクラ世界にメッセージを送る ・おまじないのMinecraftオブジェクトで色々なことができる まずはマイクラの世界にあいさつします。 [python] import mcpi.minecraft as minecraft mc = minecraft.Minecraft() mc.postTochat('Hello World!') [/python] 最初の2行の [python] import mcpi.minecraft as minecraft mc = minecraft.Minecraft() [/python] はおまじないのようなものですが、とても大切です。このmcと名付けたMinecraftというオブジェクトを使って色々なことができます。 主人公のいる場所を表示させるには、おまじないに続けて、 [python] pos = mc.player.getTilePos() mc.postToChat( 'X:' + str( pos.x ) + ', Y:' + str( pos.y ) + ', Z:' + str( pos.z ) ) [/python] 主人公の下に鉄ブロックを置くには、 [python] import mcpi.block as block pos = mc.player.getTilePos() mc.setBlock( pos.x, pos.y - 1, pos.z, block.IRON_BLOCK ) [/python] setBlockをするときにpos.y - 1としないで、pos.yのままだと主人公にぶつかってしまいます。

PC版マイクラをPythonでプログラムする

,
PC版マイクラをプログラミングしてみたいと思います。 今回はクライアントMOD方式です。MODはマイクラの世界を拡張して新しい機能を付け足すものです。Pythonやスクラッチのプログラムを、同じパソコンの中のマイクラに対して実行します。 まずは準備を進めます(以下、Windows10での方法です)。クライアントMOD方式に必要なのはこの3つ。スクラッチはまた今度紹介します。 ・Minecraft ForgeRaspberry Jam ModPython 順番に準備します。

Minecraft Forgeをインストールする

Minecraft Forgeは色々なMODが動くために必要なものです。インストールの方法は、まいんくらふとにっきさんに詳しく書かれているので参考にしてください。今回はマイクラバージョン1.11.2に合わせたMinecraft Forgeをインストールします。

Raspberry Jam Modを入れる

Raspberry Jam Modのサイトにアクセスし、 上の方のreleasesをクリックします。最新のバージョン(2017/3/12時点では0.88.2)から、mods.zipとpython-scripts.zipをダウンロードします。 mods.zipは解凍するとマイクラバージョンごとのフォルダが出てきます。 1112のフォルダからRaspberryJamMod.jarをコピーして、先ほど、Minecraft Forgeをインストールしてできたmodsフォルダに置きます。 続いてpython-scripts.zipを解凍します。なにやらたくさんのファイルが出てきます。その中で、helloworld.pyを後で使いますので、確認しておいてください。 Raspberry Jam ModはこれでOKです。

Pythonをインストールする

最後にPythonをインストールします。Pythonは初めての人でも分かりやすいプログラミング言語の一つです。こちらのサイトを参考にしてみて下さい。

いよいよ動かしてみる

さて準備ができました。通常のマイクラランチャーを起動して、forgeのプロファイルを選んで起動します。 マイクラが起動したらMODを押して、 MODのリストにRaspberry Jam Modがいたら導入成功です。 マイクラの世界をスタートしたら、Eボタンを押して操作をパソコンに戻します。先ほど、確認したhelloworld.pyをダブルクリックしてください。そしてマイクラに戻ると・・・・ Hello world!と表示され、スティーブンの足元にダイヤモンド鉱石が生成されたら成功です! お疲れさまでした。

ラズパイでマイクラをプログラミングする

,
今回は、ラズパイの中で、マイクラをプログラミングで操作できるようにしてみます。 ラズパイのセットアップは完了している状態で始めます。ラズパイのセットアップについてはまた別な時に記事にします。 まず、ターミナルを起動します。 次にターミナルで以下のコマンドを入力します。 curl http://scratch2mcpi.github.io/install.sh | sh で、Enter。 なにやら始まるので、少し待って、この画面になったら完了。 すると、ラズパイのアイコンにこの2つがいるはずです。 これで準備は完了です。 では動かしてみます。まず最初にマイクラを起動します。 次にScratch2MCPIを起動します。この画面になったらOKです。

マイクラでプログラミングしてみる

,,,,,,
マイクラの世界で自由にプログラミングできたら! できます。 マイクラのエディションのようにいくつかの方法があります。 2018年9月15日更新
方法 エディション マイクラバージョン 必要なもの プログラミング言語
Minecraft Pi Minecraft Pi Edition Classicのような ラズパイ Scratch2MCPI スクラッチ Python
クライアントMOD方式 Java版(PC) 1.12 Minecraft Forge Raspberry Jam Mod mcpi-scratch スクラッチ Python
サーバーMOD方式 Java版(PC) 1.11.2 Spigot Raspberry Juice mcpi-scratch スクラッチ Python
コンピュータクラフト Java版(PC) 1.8.9 Minecraft Forge Computer Craft Lua
Microsoft MakeCode 統合版(BE) Education Edition 最新 CodeConnect MakeCodeブロック javascript
コマンドブロック 統合版(BE) Java版(PC) 最新 特になし オリジナル
[amazon_link asins='4058007133,4800711398,4800711657,1593276702,B076XNCRWV' template='ProductCarousel' store='kikushun-22' marketplace='JP' link_id='ce860320-80c2-11e8-85a4-65245cbc40a0'] マイクロソフトがWindows版にMakeCodeを提供したことでマイクラプログラミングの敷居がグンと下がりました。
  • セットアップが簡単で
  • マイクラのバージョンも新しく
  • プログラムできる要素が多い
一番オススメの方法です。 Minecraft Piを利用する方法はラズパイさえあれば、比較的簡単に始められます。 MOD方式は、プログラミングできる環境を作るのが少し大変です。クライアントMOD方式、サーバーMOD方式だと比較的新しいバージョンのマイクラで他のMODも共存させながらプログラミングが味わえます。 コンピュータークラフトも面白いです。Luaという聞きなれないプログラミング言語を使うことになりますが、親しみやすい簡単なスクリプト言語です。なによりマイクラの世界の中にコンピューターというブロックが出現し、マイクラの中でプログラミングできる楽しさがあります。 コマンドブロックもうまく組み合わせることでプログラミングできます。配布ワールドなどでよく使われている方法です。