[Minecraft] マイクラでPythonスクリプトを動かしてみよう!(Minescriptを使った3Dデータプロット編)

Minecraft

Minescriptを使って3Dデータをマイクラ上に表現することもできます。
フリーの3Dデータを使ったPythonプログラムを解説します。

Python実行環境準備

まずはこちらを参考に、マイクラ上でPythonスクリプトを実行できる環境を用意します。

3Dデータ取得

こちらを参考に「zaku.xyz」ファイルを準備しましょう。
zaku.xyz は%appdata%\.minecraft\minescriptフォルダに保存しておきます。

スクリプト作成

マイクラ上で実行するPythonスクリプトを作成していきます。

my_zaku.pyファイル作成

ここでは「my_zaku.py」というファイル名で作成します。
場所は%appdata%\.minecraft\minescriptフォルダに保存します。

スクリプト全体

作成するサンプルスクリプトは以下です。
コピー&ペーストで大丈夫ですので、まずはこちらをmy_zaku.pyに貼り付けて保存します。

import minescript
import os
import sys

if __name__ == '__main__':
    xyz_filename = sys.argv[1]
    
    dx = []
    dy = []
    dz = []
    xyz_filepath = os.path.join('minescript', xyz_filename)
    with open(xyz_filepath) as f:
        for line in f:
            (x, y, z) = line.split()
            dx.append(float(x))
            dy.append(float(y))
            dz.append(float(z))

    max_val = max(max(dx), max(dy), max(dz))

    poset = []
    for i in range(len(dx)):
        pox = dx[i] / max_val * 200.0
        poy = dy[i] / max_val * 200.0
        poz = dz[i] / max_val * 200.0
        poset.append((int(pox), int(poy), int(poz)))

    (px, py, pz) = minescript.player_position()
    blockpacker = minescript.BlockPacker()

    for pset in set(poset):
        blockpacker.setblock((int(px)+pset[0], int(py)+pset[1], int(pz)+pset[2]), "green_concrete")
   
    blockpacker.pack().write_world()

スクリプト解説

簡単にスクリプトを解説します。

    dx = []
    dy = []
    dz = []
    with open(xyz_filepath) as f:
        for line in f:
            (x, y, z) = line.split()
            dx.append(float(x))
            dy.append(float(y))
            dz.append(float(z))

    max_val = max(max(dx), max(dy), max(dz))

引数で渡したxyzファイルを読み込んで、dx/dy/dz配列に各要素を追加していきます。
dx/dy/dzから最も大きな値をmax_valに格納しておきます。

    poset = []
    for i in range(len(dx)):
        pox = dx[i] / max_val * 200.0
        poy = dy[i] / max_val * 200.0
        poz = dz[i] / max_val * 200.0
        poset.append((int(pox), int(poy), int(poz)))

Minecraft上にブロックを配置するにあたって、
xyzファイルに格納されている座標をMinecraft上の座標に変換します。
max_valを利用して、最大200x200x200の空間に3Dデータが収まるように計算しています。

    (px, py, pz) = minescript.player_position()
    blockpacker = minescript.BlockPacker()

    for pset in set(poset):
        blockpacker.setblock((int(px)+pset[0], int(py)+pset[1], int(pz)+pset[2]), "green_concrete")
   
    blockpacker.pack().write_world()

現在のプレイヤーの位置から、200x200x200の空間に3Dデータをプロットします。
今回はザクなので、緑色のコンクリート(green_concrete)ブロックで表現しています。

スクリプト実行

実際にマイクラ上で実行してみます。

ワールド上で実行

実行したいワールドを開いて、以下のコマンドを実行します。
引数に利用するxyzファイルである「zaku.xyz」を指定します。

\my_zaku zaku.xyz

実行結果

3Dデータがプロットされます。
なんとなくですがザクに見えるでしょうか。
点がブロック単体として表現されていますが、まずまずの再現度かと思います。

まとめ

マイクラ上でPythonを使えるようになって、3Dデータも表現できるのでは?…
と思って試してみた内容となります。
マイクラ x Python x 3Dデータ といった技術を組み合わせて新しいことを表現するのは楽しいですね。

コメント

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