3Dスキャナとプリンターでなんでもコピー

ホーム / ツール紹介 / 3Dスキャナとプリンターでなんでもコピー

前回はカラー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です。

と作ってきました。これがあれば、csvで設計した形や、目の前の形をいつでもコピー(スキャンして、プリントすることができます。クリーパー(creeper.csv)などの敵キャラも形を作ってからコピーできますし、


氷原のような珍しい地形(バイオーム)を草原の中に持ってくることもできます。

Translate »