パイクラおじさんの日記

MinecraftでPythonを勉強するおじさんの日記です。

木を生やす(1)

木を生やしたい。

木を生やすには、次の2つの項目がある。

  1. 木を生やす場所を決める。
  2. 生やす木の形を決めて、実際にブロックを設置する。

木を生やす場所を決めるのは、またの機会にして、今回は木の形を決めて実際にブロックを設置する方を考える。

適切な高さ

適切な高さを見るために、1〜4個の木のブロックを積み上げてみた。

f:id:pycra:20171007034310p:plainf:id:pycra:20171007034319p:plainf:id:pycra:20171007034331p:plainf:id:pycra:20171007034338p:plain

4個くらいの高さが無いと「木」として感じられない。

そのまま11個重ねる(/python setblocks.py 0 0 0 0 10 0 17)と、1個のブロックの太さとの木としてはこれくらいが限界かな?

f:id:pycra:20171007034429p:plain

斧が届くのはここ(Y=6のブロック)まで。だいたいゲーム内で出てくるのも8くらいまでだと感じる。しかも、そこまで高い木は太さも4あるし。 f:id:pycra:20171007034436p:plain

結論

だいたい4〜8くらいが妥当。

葉の形

多分、木の高さに合わせて、葉の形も決まってくる。

まずは高さ4の木

幹4に葉3x3x3を中心3のところに配置してみた。 f:id:pycra:20171007041444p:plain

ちょっと葉がボリューム不足?

葉3x4x3にしてみた。 f:id:pycra:20171007042032p:plain

ちょっと面長?

葉の真ん中に5x2x5を追加。 f:id:pycra:20171007042210p:plain こんもりし過ぎ。

角を削ってみる。 f:id:pycra:20171007042322p:plain まぁ、ありそうだけど、もう1つ高さが欲しくなる。

あと、葉がみっちり詰まっている感じがするので、setblocksで隙間が空く(0.7くらい?)バージョンが欲しい。

バランス的には最初のが一番いいか。

高さ6の木

幹6葉5x5x5の木 f:id:pycra:20171007043444p:plain

右上の角が欠けているのは、勝手に欠け始めた。 隙間が空くバージョン+球形に設置できるといいなぁ。

leaves.pyとして書いてみた。

# coding: utf-8

import mcpi.minecraft as minecraft
import mcpi.block as block
import math
import random
import sys

# ここからスタート

mc = minecraft.Minecraft()

if len(sys.argv) < 6:
    sys.exit("Usage: leaves x y z radius density")

x = float(sys.argv[1])
y = float(sys.argv[2])
z = float(sys.argv[3])
r = float(sys.argv[4])
d = float(sys.argv[5])

min_x = int(x - r)
max_x = int(x + r)
min_y = int(y - r)
max_y = int(y + r)
min_z = int(z - r)
max_z = int(z + r)

for dy in range(min_y, max_y+1):
    for dx in range(min_x, max_x+1):
        for dz in range(min_z, max_z+1):
            xx =  dx - x
            yy =  dy - y
            zz =  dz - z
            s = xx * xx + yy * yy + zz * zz
            if math.sqrt(s) <= r:
                block_id = mc.getBlock(dx, dy, dz)
                if block_id == block.AIR:
                    if random.random() < d:
                        mc.setBlock(dx, dy, dz, block.LEAVES)

結構、外側が欠けると美しくないのでdentisyには1.0を指定した。

/python setblocks 0 0 0 0 5 0 17
/python leaves 0 4 0 2.7 1.0

f:id:pycra:20171007051944p:plain

まずは第1段として。

Pythonメモ

乱数はrandomをインポートして、random.random()で[0.0-1.0)の範囲で乱数を返す。

平方根はmathをインポートして、math.sqrt()で計算する。