Загрузка данных


import bpy
import random
import math

bpy.ops.object.select_all(action='SELECT')
bpy.ops.object.delete(use_global=False)

def c_mat(color, em=0.0):
    m = bpy.data.materials.new("Material")
    m.use_nodes = True
    b = m.node_tree.nodes.get("Principled BSDF")
    b.inputs['Base Color'].default_value = color
    if em > 0:
        b.inputs['Emission Color'].default_value = color
        b.inputs['Emission Strength'].default_value = em
    return m

m_gr = c_mat((0.85, 0.88, 0.9, 1))
m_wd = c_mat((0.35, 0.2, 0.1, 1))
m_lv = c_mat((0.15, 0.35, 0.2, 1))
m_hs = c_mat((0.5, 0.15, 0.15, 1))
m_rf = c_mat((0.15, 0.15, 0.2, 1))
m_fr = c_mat((1.0, 0.3, 0.0, 1), 10.0)

bpy.ops.mesh.primitive_cylinder_add(radius=6, depth=0.8, location=(0, 0, 0))
bpy.context.active_object.data.materials.append(m_gr)

bpy.ops.mesh.primitive_cube_add(size=1, location=(-2, 2, 0.9))
h = bpy.context.active_object
h.scale = (2.2, 2.2, 1.4)
bpy.ops.object.transform_apply(scale=True)
h.data.materials.append(m_hs)

bpy.ops.mesh.primitive_cylinder_add(vertices=4, radius=1.8, depth=2.4, location=(-2, 2, 2.3), rotation=(math.radians(90), math.radians(45), 0))
bpy.context.active_object.data.materials.append(m_rf)

for i in range(6):
    rx = random.uniform(-4.5, 4.5)
    ry = random.uniform(-4.5, 4.5)
    if (-3.5 < rx < -0.5 and 0.5 < ry < 3.5) or (-0.5 < rx < 2.5 and -2.5 < ry < 0.5):
        continue
        
    bpy.ops.mesh.primitive_cylinder_add(radius=0.25, depth=1.5, location=(rx, ry, 1.1))
    bpy.context.active_object.data.materials.append(m_wd)
    
    bpy.ops.mesh.primitive_cone_add(radius1=1.2, depth=2.5, location=(rx, ry, 2.8))
    bpy.context.active_object.data.materials.append(m_lv)

for i in range(4):
    bpy.ops.mesh.primitive_cylinder_add(radius=0.1, depth=0.8, location=(1, -1, 0.45), rotation=(math.radians(90), random.uniform(0, 3.14), 0))
    bpy.context.active_object.data.materials.append(m_wd)

bpy.ops.mesh.primitive_ico_sphere_add(subdivisions=2, radius=0.35, location=(1, -1, 0.7))
bpy.context.active_object.data.materials.append(m_fr)

bpy.ops.object.light_add(type='POINT', location=(1, -1, 1.2))
pl = bpy.context.active_object.data
pl.energy = 400
pl.color = (1.0, 0.6, 0.2)

bpy.ops.object.light_add(type='SUN', location=(5, -5, 8), rotation=(0.7, 0, 0.5))
sl = bpy.context.active_object.data
sl.energy = 1.2
sl.color = (0.2, 0.35, 0.6)

bpy.ops.mesh.primitive_ico_sphere_add(subdivisions=1, radius=0.06, location=(0,0,-10))
s_obj = bpy.context.active_object
s_obj.data.materials.append(m_gr)

bpy.ops.mesh.primitive_plane_add(size=14, location=(0, 0, 8))
em = bpy.context.active_object
mod = em.modifiers.new("ParticleSystem", 'PARTICLE_SYSTEM')
ps = em.particle_systems[0].settings
ps.count = 1200
ps.frame_end = 250
ps.lifetime = 120
ps.render_type = 'OBJECT'
ps.instance_object = s_obj
ps.particle_size = 0.8
ps.size_random = 0.5
ps.normal_factor = 0.0
ps.effector_weights.gravity = 0.15
em.show_instancer_for_viewport = False
em.show_instancer_for_render = False

bpy.ops.object.camera_add(location=(11, -11, 7.5), rotation=(math.radians(60), 0, math.radians(45)))
bpy.context.scene.camera = bpy.context.active_object

bpy.ops.object.select_all(action='DESELECT')
bpy.context.view_layer.update()