@@ -217,7 +217,7 @@ <h2>Source</h2>
217217 blender --background --python gn_sdf_remesh.py -- --output r.png # also render the result
218218 blender --background --python gn_sdf_remesh.py -- --output r.png --engine cycles # GPU-less
219219"""</ span >
220- < span class ="k "> import</ span > bpy, sys, os, argparse
220+ < span class ="k "> import</ span > bpy, sys, os, math, argparse
221221
222222< span class ="k "> def</ span > get_eevee_engine_id():
223223 < span class ="k "> return</ span > < span class ="s "> 'BLENDER_EEVEE'</ span > < span class ="k "> if</ span > bpy.app.version >= (< span class ="n "> 5</ span > , < span class ="n "> 0</ span > , < span class ="n "> 0</ span > ) < span class ="k "> else</ span > < span class ="s "> 'BLENDER_EEVEE_NEXT'</ span >
@@ -267,25 +267,28 @@ <h2>Source</h2>
267267 bm.free()
268268 fmat = bpy.data.materials.new(< span class ="s "> "Studio"</ span > ); fmat.use_nodes = < span class ="k "> True</ span >
269269 fb = fmat.node_tree.nodes.get(< span class ="s "> 'Principled BSDF'</ span > )
270- fb.inputs[< span class ="s "> 'Base Color'</ span > ].default_value = (< span class ="n "> 0.055 </ span > , < span class ="n "> 0.06 </ span > , < span class ="n "> 0.07 </ span > , < span class ="n "> 1</ span > ) < span class ="c "> # dark graphite studio</ span >
271- fb.inputs[< span class ="s "> 'Roughness'</ span > ].default_value = < span class ="n "> 0.55 </ span >
270+ fb.inputs[< span class ="s "> 'Base Color'</ span > ].default_value = (< span class ="n "> 0.03 </ span > , < span class ="n "> 0.032 </ span > , < span class ="n "> 0.037 </ span > , < span class ="n "> 1</ span > ) < span class ="c "> # dark staged studio</ span >
271+ fb.inputs[< span class ="s "> 'Roughness'</ span > ].default_value = < span class ="n "> 0.7 </ span >
272272 fme.materials.append(fmat)
273273 floor = bpy.data.objects.new(< span class ="s "> "Floor"</ span > , fme); bpy.context.collection.objects.link(floor)
274274 wall = bpy.data.objects.new(< span class ="s "> "Wall"</ span > , fme.copy()); wall.location = (< span class ="n "> 0</ span > , < span class ="n "> 9.0</ span > , < span class ="n "> 0</ span > )
275275 wall.rotation_euler = (< span class ="n "> 1.5708</ span > , < span class ="n "> 0</ span > , < span class ="n "> 0</ span > ); bpy.context.collection.objects.link(wall)
276276 w = bpy.data.worlds.new(< span class ="s "> "W"</ span > ); w.use_nodes = < span class ="k "> True</ span >
277- w.node_tree.nodes[< span class ="s "> "Background"</ span > ].inputs[< span class ="n "> 0</ span > ].default_value = (< span class ="n "> 0.01 </ span > , < span class ="n "> 0.011 </ span > , < span class ="n "> 0.014 </ span > , < span class ="n "> 1</ span > ); sc.world = w
277+ w.node_tree.nodes[< span class ="s "> "Background"</ span > ].inputs[< span class ="n "> 0</ span > ].default_value = (< span class ="n "> 0.02 </ span > , < span class ="n "> 0.021 </ span > , < span class ="n "> 0.025 </ span > , < span class ="n "> 1</ span > ); sc.world = w
278278 aim = bpy.data.objects.new(< span class ="s "> "Aim"</ span > , < span class ="k "> None</ span > ); aim.location = (< span class ="n "> 0</ span > , < span class ="n "> 0</ span > , < span class ="n "> 0.55</ span > ); bpy.context.collection.objects.link(aim)
279279 cam = bpy.data.objects.new(< span class ="s "> "cam"</ span > , bpy.data.cameras.new(< span class ="s "> "cam"</ span > )); cam.location = (< span class ="n "> 0</ span > , -< span class ="n "> 6.5</ span > , < span class ="n "> 2.2</ span > )
280280 bpy.context.collection.objects.link(cam); sc.camera = cam
281281 c = cam.constraints.new(< span class ="s "> 'TRACK_TO'</ span > ); c.target = aim; c.track_axis = < span class ="s "> 'TRACK_NEGATIVE_Z'</ span > ; c.up_axis = < span class ="s "> 'UP_Y'</ span >
282- < span class ="c "> # key, cool fill, warm rim</ span >
283- < span class ="k "> for</ span > nm, loc, en, sz, col < span class ="k "> in</ span > [(< span class ="s "> "K"</ span > , (-< span class ="n "> 4</ span > , -< span class ="n "> 5</ span > , < span class ="n "> 7</ span > ), < span class ="n "> 1100</ span > , < span class ="n "> 5.0</ span > , (< span class ="n "> 1.0</ span > , < span class ="n "> 0.98</ span > , < span class ="n "> 0.95</ span > )),
284- (< span class ="s "> "F2"</ span > , (< span class ="n "> 5</ span > , -< span class ="n "> 4</ span > , < span class ="n "> 2</ span > ), < span class ="n "> 220</ span > , < span class ="n "> 7.0</ span > , (< span class ="n "> 0.85</ span > , < span class ="n "> 0.9</ span > , < span class ="n "> 1.0</ span > )),
285- (< span class ="s "> "R"</ span > , (< span class ="n "> 2.5</ span > , < span class ="n "> 6</ span > , < span class ="n "> 4</ span > ), < span class ="n "> 700</ span > , < span class ="n "> 3.0</ span > , (< span class ="n "> 1.0</ span > , < span class ="n "> 0.72</ span > , < span class ="n "> 0.45</ span > ))]:
282+ < span class ="c "> # shaped warm key, faint cool fill (docs/VISUAL-STYLE.md)</ span >
283+ < span class ="k "> for</ span > nm, loc, en, sz, col < span class ="k "> in</ span > [(< span class ="s "> "K"</ span > , (-< span class ="n "> 4</ span > , -< span class ="n "> 5</ span > , < span class ="n "> 7</ span > ), < span class ="n "> 650</ span > , < span class ="n "> 4.5</ span > , (< span class ="n "> 1.0</ span > , < span class ="n "> 0.96</ span > , < span class ="n "> 0.9</ span > )),
284+ (< span class ="s "> "F2"</ span > , (< span class ="n "> 5</ span > , -< span class ="n "> 4</ span > , < span class ="n "> 2</ span > ), < span class ="n "> 110</ span > , < span class ="n "> 7.0</ span > , (< span class ="n "> 0.75</ span > , < span class ="n "> 0.85</ span > , < span class ="n "> 1.0</ span > ))]:
286285 ld = bpy.data.lights.new(nm, < span class ="s "> 'AREA'</ span > ); ld.energy = en; ld.size = sz; ld.color = col
287286 lo = bpy.data.objects.new(nm, ld); lo.location = loc; bpy.context.collection.objects.link(lo)
288287 lc = lo.constraints.new(< span class ="s "> 'TRACK_TO'</ span > ); lc.target = aim; lc.track_axis = < span class ="s "> 'TRACK_NEGATIVE_Z'</ span > ; lc.up_axis = < span class ="s "> 'UP_Y'</ span >
288+ < span class ="c "> # warm wedge raking the back wall, aimed past the torus at the wall</ span >
289+ wd = bpy.data.lights.new(< span class ="s "> "Wedge"</ span > , < span class ="s "> 'AREA'</ span > ); wd.energy = < span class ="n "> 380</ span > ; wd.size = < span class ="n "> 6.0</ span > ; wd.color = (< span class ="n "> 1.0</ span > , < span class ="n "> 0.76</ span > , < span class ="n "> 0.5</ span > )
290+ wo = bpy.data.objects.new(< span class ="s "> "Wedge"</ span > , wd); wo.location = (< span class ="n "> 2.5</ span > , < span class ="n "> 5.5</ span > , < span class ="n "> 4.0</ span > )
291+ wo.rotation_euler = (math.radians(-< span class ="n "> 68</ span > ), < span class ="n "> 0</ span > , math.radians(< span class ="n "> 190</ span > )); bpy.context.collection.objects.link(wo)
289292 sc.render.engine = < span class ="s "> 'CYCLES'</ span > < span class ="k "> if</ span > engine == < span class ="s "> 'cycles'</ span > < span class ="k "> else</ span > get_eevee_engine_id()
290293 < span class ="k "> if</ span > sc.render.engine == < span class ="s "> 'CYCLES'</ span > :
291294 < span class ="k "> try</ span > : sc.cycles.samples = < span class ="n "> 32</ span >
@@ -295,6 +298,8 @@ <h2>Source</h2>
295298 < span class ="k "> except</ span > Exception: < span class ="k "> pass</ span >
296299 sc.render.resolution_x = < span class ="n "> 1280</ span > ; sc.render.resolution_y = < span class ="n "> 720</ span >
297300 sc.render.image_settings.file_format = < span class ="s "> 'PNG'</ span > ; sc.render.filepath = path
301+ < span class ="c "> # AgX would wash the crimson toward brick (docs/VISUAL-STYLE.md)</ span >
302+ sc.view_settings.view_transform = < span class ="s "> 'Standard'</ span >
298303 bpy.ops.render.render(write_still=< span class ="k "> True</ span > )
299304 < span class ="k "> return</ span > os.path.exists(path) < span class ="k "> and</ span > os.path.getsize(path) > < span class ="n "> 0</ span >
300305
0 commit comments