前回はカラー3Dプリンターを作りました。今回はスキャナーを作ります。積み上げられているブロックの範囲を指定して、スキャン。スキャンしたデータを使って、好きな場所に3Dプリントするという流れでやっていきます。
まず、スキャンする相手ですが、前回作ったブタさんにします。
import mcpi.minecraft as minecraft import mcpi.block as block from mcpi.vec3 import Vec3 mc = minecraft.Minecraft() class Obj3D: def __init__(self, data, ink): self.data = data self.ink = ink def getData(self): return self.data def getInk(self): return self.ink def scan3D(start, dist): data = [] ink_inv={} for y in range(0, dist.y): plane=[] for z in range(0, dist.z): line=[] for x in range(0, dist.x): blk = mc.getBlockWithData(start.x + x, start.y + y, start.z + z) if not blk in ink_inv: ink_inv[blk] = len(ink_inv) line.append(ink_inv[blk]) plane.append(line) data.append(plane) ink = {v:k for k, v in ink_inv.items()} obj = Obj3D(data, ink) return obj 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]]) start = mc.player.getTilePos() obj = scan3D(start, Vec3(20, 20, 20))
こんな感じでブタさんをスキャンします。scan3Dではデータとインクの2つを戻したいので、クラスとしてObj3Dを作って、そのオブジェクトを戻しています。
ink = {v:k for k, v in ink_inv.items()}
はink_invのキーと値を入れ替えて、インクを作っています。
ポイントになるのが、主人公の向き(方角)です。F3を押して、eastになっていると読み込みやすいです。
読み取ったデータをprintしてみると、
[0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 3, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 2, 3, 3, 3, 0, 0, 0, 0, 0]
[0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 3, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 3, 3, 3, 3, 0, 0, 0, 0, 0]
[0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 3, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 2, 3, 3, 3, 0, 0, 0, 0, 0]
[0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 3, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 3, 3, 3, 3, 0, 0, 0, 0, 0]
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
[0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 3, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 2, 3, 3, 3, 0, 0, 0, 0, 0]
[0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 3, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 3, 3, 3, 3, 0, 0, 0, 0, 0]
[0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 3, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 2, 3, 3, 3, 0, 0, 0, 0, 0]
[0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 3, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 3, 3, 3, 3, 0, 0, 0, 0, 0]
この部分はブタさんの足のウラですね。
スキャンできているので、このデータをプリントしてみます。
無事にブタさんがコピーできました。続いて、自分で積んだブロックをスキャンしてみます。頑張って新しく羊さんを作っておきました。
ブタさんと同じようにスキャンしてプリントできるはずですが、スキャンした後、ブタさんのpigのようにファイルに出力してみます。では実行します。
見事に羊さんもコピーされました。ファイルはsheep.csvです。
- モノクロ3Dプリンター
- カラー3Dプリンター
- 3Dスキャナー
と作ってきました。これがあれば、csvで設計した形や、目の前の形をいつでもコピー(スキャンして、プリントすることができます。クリーパー(creeper.csv)などの敵キャラも形を作ってからコピーできますし、
氷原のような珍しい地形(バイオーム)を草原の中に持ってくることもできます。