見出し画像

Sapling Tree Genで木をランダムに生成して配置するプログラム

Pythonとblenderでなんか作ろうと思って思いついたのが、
とりあえず木を並べようということでした。

blenderにはSapling Tree Genというアドオンがあるため、

まず、それを有効化する必要があります。

アドオン有効化やSapling Tree Genの基本的な使い方は「ほろほろりドットコム」さんのこちらの記事を参考にしてください。

私も参考にして制作しました。ありがとうございます。

アドオンの有効化を終えたら、
blenderの「Scripting」タブで空のpythonファイル(.py)を生成し、
以下のプログラムを打ちます。

import bpy
import random

#木を生成する関数
#bpy.ops.curve.tree_addの引数を変更すれば木の種類や葉を有無等を設定できます。
def tree_add_function(seed_num):
    bpy.ops.curve.tree_add(do_update=True, chooseSet='5', bevel=True, prune=False, showLeaves=True, useArm=False,
        seed=seed_num, handleType='0', levels=2, length=(0.8, 0.6, 0.5, 0.1), lengthV=(0, 0.1, 0, 0), taperCrown=0.5, branches=(0, 55, 10, 1), curveRes=(8, 5, 3, 1), curve=(0, -15, 0, 0), curveV=(20, 50, 75, 0), curveBack=(0, 0, 0, 0), baseSplits=3, segSplits=(0.1, 0.5, 0.2, 0), splitByLen=True, rMode='rotate', splitAngle=(18, 18, 22, 0), splitAngleV=(5, 5, 5, 0), scale=5, scaleV=2, attractUp=(3.5, -1.89984, 0, 0), attractOut=(0, 0.8, 0, 0), shape='7', shapeS='10', customShape=(0.5, 1, 0.3, 0.5), branchDist=1.5, nrings=0, baseSize=0.3, baseSize_s=0.16, splitHeight=0.2, splitBias=0.55, ratio=0.015, minRadius=0.0015, closeTip=False, rootFlare=1, autoTaper=True, taper=(1, 1, 1, 1), radiusTweak=(1, 1, 1, 1), ratioPower=1.2, downAngle=(0, 26.21, 52.56, 30), downAngleV=(0, 10, 10, 10), useOldDownAngle=True, useParentAngle=True, rotate=(99.5, 137.5, 137.5, 137.5), rotateV=(15, 0, 0, 0), scale0=1, scaleV0=0.1, pruneWidth=0.34, pruneBase=0.12, pruneWidthPeak=0.5, prunePowerHigh=0.5, prunePowerLow=0.001, pruneRatio=0.75, leaves=150, leafDownAngle=30, leafDownAngleV=-10, leafRotate=137.5, leafRotateV=15, leafScale=0.4, leafScaleX=0.2, leafScaleT=0.1, leafScaleV=0.15, leafShape='hex', bend=0, leafangle=-12, horzLeaves=True, leafDist='6', bevelRes=1, resU=4, armAnim=False, previewArm=False, leafAnim=False, frameRate=1, loopFrames=0, wind=1, gust=1, gustF=0.075, af1=1, af2=1, af3=4, makeMesh=False, armLevels=2, boneStep=(1, 1, 1, 1))

#木を配置する関数
def duplicate_move_and_rename(obj_name, x, y, z):
    for obj in bpy.data.objects:
        obj.select_set(False)
    original_obj = bpy.data.objects[obj_name]
    original_obj.location = (x,y,z)


tree_name = 'tree' #生成する木のオブジェクト名
range_num = 0 #tree.の後の数値
#番号を参照して、配置しているため、
#連続で実行した際に参照がずれないようにしています。
#処理が重すぎる且つ、一回のみの実行の場合このfor文は無くてもいいです。
for i in range(1,999):#「tree.999」が存在している場合は999を1000以上にしてください。
    for obj in bpy.data.objects:
        if obj.name == tree_name + '.' + str(i).zfill(3):
            if range_num <= i:
                range_num = i + 1


                
min_num = -10 #xy座標最小値
max_num = 10 #xy座標最大値

tree_num = 100 #生成する本数


tree_add_function(random.randint(1,1000)) #1本目の木を生成、引数はSapling Tree Genのシード値
if range_num == 0: #「tree.000」は「tree」であるため例外処理
    duplicate_move_and_rename(tree_name, random.uniform(min_num,max_num), 
        random.uniform(min_num,max_num), 0) #原点に生成したものをランダムに配置し直す処理   
    for i in range(range_num + 1 ,range_num+tree_num):
        tree_add_function(random.randint(1,1000)) #2本目以降の木を生成、引数はSapling Tree Genのシード値
        duplicate_move_and_rename(tree_name + '.'+ str(i).zfill(3), random.uniform(min_num,max_num), 
            random.uniform(min_num,max_num), 0) #原点に生成したものをランダムに配置し直す処理
else:
    duplicate_move_and_rename(tree_name + '.' + str(range_num).zfill(3), random.uniform(min_num,max_num), 
        random.uniform(min_num,max_num), 0) #原点に生成したものをランダムに配置し直す処理
    for i in range(range_num + 1 ,range_num+tree_num):
        tree_add_function(random.randint(1,1000)) #2本目以降の木を生成、引数はSapling Tree Genのシード値
        duplicate_move_and_rename(tree_name + '.'+ str(i).zfill(3), random.uniform(min_num,max_num), 
            random.uniform(min_num,max_num), 0) #原点に生成したものをランダムに配置し直す処理

下記を引用、参考にして作成しました。(投稿時に書き忘れて申し訳ないです。)

掲載プログラムの使用についてはこちら


そして、実行を押して、
数分待つと(処理時間短くできなくてすいません)
デフォルトの種類でランダムな形の木が複数本生成されます
(上記コードだと、原点を中心とする20m×20mの面内に木の幹が100本葉付きで生成されます。)
処理が重い場合は生成本数の数字を減らしてください。

私の実行した環境は、

blender バージョン 3.1.2
MacBook Pro (13-inch, M1, 2020) メモリ 16GB
macOS Monterey バージョン 12.6.2

です。

上記のコードで生成した時のblenderの画面が以下となります。

少し見辛いのでライトを入れるとこんな感じです。

それから壁紙制作をしましたが、丁度冬だったので、テクスチャなくても表現できる気がしたため、ここからライトや角度、生成し直す等して調整して完成したものがこちらです。

気に入った方は以下の私が運営するダウンロードサイトから4kでダウンロードできます。

BOOTHからなら480pから4kまでの解像度を選んでダウンロードすることができます。

ぜひ、ダウンロードして使っていただければと思います!

ここまで読んでいただき、ありがとうございます。
読者に、いいことがありますように( ˇωˇ人 )


この記事が気に入ったらサポートをしてみませんか?