# Blender 5.2 낮밤 사이클 예제 (min-inter.co.kr 위키) # 사용법(Windows): Blender > Scripting 작업 공간 > 새 텍스트 > 이 코드 붙여넣기 > Run Script(Alt+P) # 주의: 장면의 모든 오브젝트를 지우고 새로 만든다. 새 파일에서 실행할 것. # 명령줄 렌더 예: "C:\Program Files\Blender Foundation\Blender 5.2\blender.exe" -b -P daycycle.py -a import bpy, math from mathutils import Vector scene = bpy.context.scene scene.frame_start, scene.frame_end = 1, 288 scene.render.fps = 24 # 1) 간단한 원형 경기장(기둥 40개 + 바닥) for o in list(bpy.data.objects): bpy.data.objects.remove(o, do_unlink=True) stone = bpy.data.materials.new("Stone") stone.use_nodes = True stone.node_tree.nodes["Principled BSDF"].inputs["Base Color"].default_value = (0.62, 0.52, 0.40, 1) bpy.ops.mesh.primitive_plane_add(size=400) bpy.context.object.data.materials.append(stone) for i in range(40): a = 2 * math.pi * i / 40 bpy.ops.mesh.primitive_cube_add(location=(40 * math.cos(a), 30 * math.sin(a), 8)) c = bpy.context.object c.scale = (2, 2, 8) c.rotation_euler.z = a c.data.materials.append(stone) # 2) 하늘: 월드에 Sky Texture(다중 산란) world = scene.world or bpy.data.worlds.new("World") scene.world = world world.use_nodes = True nt = world.node_tree nt.nodes.clear() sky = nt.nodes.new("ShaderNodeTexSky") sky.sky_type = "MULTIPLE_SCATTERING" # 5.x 이름. 'NISHITA'는 없음 sky.sun_disc = False # 직사광은 태양 램프가 맡는다 bg = nt.nodes.new("ShaderNodeBackground") out = nt.nodes.new("ShaderNodeOutputWorld") nt.links.new(sky.outputs["Color"], bg.inputs["Color"]) nt.links.new(bg.outputs["Background"], out.inputs["Surface"]) # 3) 태양 램프 sun_data = bpy.data.lights.new("Sun", type="SUN") sun = bpy.data.objects.new("Sun", sun_data) scene.collection.objects.link(sun) # 달: 두 번째 SUN 램프, 회전 고정, 세기만 키프레임 moon_data = bpy.data.lights.new("Moon", type="SUN") moon_data.color = (0.62, 0.74, 1.0) moon = bpy.data.objects.new("Moon", moon_data) scene.collection.objects.link(moon) moon.rotation_euler = (math.radians(58), 0, math.radians(108)) # 4) 카메라 cam = bpy.data.objects.new("Cam", bpy.data.cameras.new("Cam")) scene.collection.objects.link(cam) cam.location = (110, -90, 35) cam.rotation_euler = (Vector((0, 0, 6)) - cam.location).to_track_quat("-Z", "Y").to_euler() scene.camera = cam def point_sun(elev_deg, azim_deg): """태양 방향 벡터를 만들고, 램프의 -Z축이 그 반대(빛이 오는 방향)로 향하게 맞춘다.""" e, a = math.radians(elev_deg), math.radians(azim_deg) to_sun = Vector((math.cos(e) * math.cos(a), math.cos(e) * math.sin(a), math.sin(e))) sun.rotation_euler = (-to_sun).to_track_quat("-Z", "Y").to_euler() sky.sun_elevation = e sky.sun_rotation = a # 프레임, 태양 고도, 방위, 태양 세기, 달 세기, 하늘 세기, 노출 keys = [ (1, 9, 18, 4.0, 0.0, 0.25, -2.5), # 아침 (48, 62, -28, 5.0, 0.0, 0.30, -3.0), # 한낮 (96, 16, -80, 4.0, 0.0, 0.25, -2.5), # 저녁 (144, 4, 48, 3.0, 0.0, 0.25, -2.0), # 석양 (192, -8, 20, 0.0, 0.1, 0.30, 1.0), # 블루아워 (240, -20, 20, 0.0, 0.25, 0.10, 1.0), # 달빛 밤 ] for f, elev, azim, energy, moon_e, sky_s, exposure in keys: point_sun(elev, azim) sun_data.energy = energy moon_data.energy = moon_e bg.inputs["Strength"].default_value = sky_s scene.view_settings.exposure = exposure bg.inputs["Strength"].keyframe_insert("default_value", frame=f) moon_data.keyframe_insert("energy", frame=f) sun.keyframe_insert("rotation_euler", frame=f) sun_data.keyframe_insert("energy", frame=f) sky.keyframe_insert("sun_elevation", frame=f) sky.keyframe_insert("sun_rotation", frame=f) scene.view_settings.keyframe_insert("exposure", frame=f) # 5) 렌더 설정 (EEVEE, 1920x1080, MP4) scene.render.engine = "BLENDER_EEVEE" scene.render.resolution_x, scene.render.resolution_y = 1920, 1080 scene.view_settings.view_transform = "AgX" scene.render.image_settings.media_type = "VIDEO" scene.render.ffmpeg.format = "MPEG4" scene.render.ffmpeg.codec = "H264" scene.render.filepath = "//daycycle_"