🌐

blenderでピタゴラスの木を作る

2020/09/28に公開

ピタゴラスの木(Pythagoras tree)をblenderのTissueプラグインで作っている人がいたので、スクリプトで書いてみました。

画像はDEPTHを8でやってますが、実行時間かかるので、載せるコードは4にしておきます。
ひさびさに回転行列とか使って、いい勉強になりました。

import bpy
from math import radians, sqrt, cos, sin

DEPTH = 4

def rot(u, v, r):
    return cos(r) * u - sin(r) * v, sin(r) * u + cos(r) * v

def set_materials(depth):
    name = f"green{depth}"
    bpy.data.materials.new(name = name)
    mat = bpy.data.materials[name]
    mat.use_nodes = True
    node_tree = mat.node_tree
    mat_node = node_tree.nodes['Principled BSDF']
    mat_node.inputs['Base Color'].default_value = (0, 0.3 + depth/DEPTH, 0, 1)
    #mat_node.inputs['Metallic'].default_value = 1
    #mat_node.inputs['Specular'].default_value = 1

    bpy.ops.object.material_slot_add()
    bpy.context.object.active_material=mat

def tree(size, x, y, angle, depth):
    bpy.ops.mesh.primitive_cube_add(size=size, location=(x,y,0))
    bpy.ops.transform.rotate(value=radians(angle))
    set_materials(depth)
    
    if depth:
        nsize = size / sqrt(2)
        u, v = size/2, size
        r = radians(angle)
        xr, yr = rot(u, v, r)
        xl, yl = rot(-u, v, r)
        
        tree(
            nsize, 
            xr + x,
            yr + y,
            angle - 45, depth - 1
            )
            
        tree(
            nsize, 
            xl + x,
            yl + y,
            angle + 45, depth - 1
            )

tree(3, 0, 0, 0, DEPTH)

Discussion