木を生やす(1)
木を生やしたい。
木を生やすには、次の2つの項目がある。
- 木を生やす場所を決める。
- 生やす木の形を決めて、実際にブロックを設置する。
木を生やす場所を決めるのは、またの機会にして、今回は木の形を決めて実際にブロックを設置する方を考える。
適切な高さ
適切な高さを見るために、1〜4個の木のブロックを積み上げてみた。
4個くらいの高さが無いと「木」として感じられない。
そのまま11個重ねる(/python setblocks.py 0 0 0 0 10 0 17
)と、1個のブロックの太さとの木としてはこれくらいが限界かな?
斧が届くのはここ(Y=6のブロック)まで。だいたいゲーム内で出てくるのも8くらいまでだと感じる。しかも、そこまで高い木は太さも4あるし。
結論
だいたい4〜8くらいが妥当。
葉の形
多分、木の高さに合わせて、葉の形も決まってくる。
まずは高さ4の木
幹4に葉3x3x3を中心3のところに配置してみた。
ちょっと葉がボリューム不足?
葉3x4x3にしてみた。
ちょっと面長?
葉の真ん中に5x2x5を追加。 こんもりし過ぎ。
角を削ってみる。 まぁ、ありそうだけど、もう1つ高さが欲しくなる。
あと、葉がみっちり詰まっている感じがするので、setblocksで隙間が空く(0.7くらい?)バージョンが欲しい。
バランス的には最初のが一番いいか。
高さ6の木
幹6葉5x5x5の木
右上の角が欠けているのは、勝手に欠け始めた。 隙間が空くバージョン+球形に設置できるといいなぁ。
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
まずは第1段として。
Pythonメモ
乱数はrandomをインポートして、random.random()で[0.0-1.0)の範囲で乱数を返す。
平方根はmathをインポートして、math.sqrt()で計算する。