"""A cut along the ship's centre line, looking to starboard (nothing is saved): blender -b --factory-startup --python section.py -- """ import sys import bpy from mathutils import Vector a = sys.argv[sys.argv.index("--") + 1:] import os OUT, X0, X1, Z0, Z1, PX = a[0], float(a[1]), float(a[2]), float(a[3]), float(a[4]), int(a[5]) OUT = os.path.abspath(OUT) # (Blender resolves a relative render path against a drive root) sc = bpy.context.scene for eng in ("BLENDER_EEVEE_NEXT", "BLENDER_EEVEE"): try: sc.render.engine = eng break except TypeError: pass cam_d = bpy.data.cameras.new("section") cam_d.type = "ORTHO" cam_d.ortho_scale = X1 - X0 cam_d.clip_start = 0.01 cam_d.clip_end = 40.0 cam = bpy.data.objects.new("section", cam_d) sc.collection.objects.link(cam) cam.location = ((X0 + X1) / 2.0, 0.02, (Z0 + Z1) / 2.0) cam.rotation_euler = Vector((0.0, -1.0, 0.0)).to_track_quat("-Z", "Y").to_euler() sc.camera = cam sc.render.resolution_x = PX sc.render.resolution_y = int(round(PX * (Z1 - Z0) / (X1 - X0))) sc.render.resolution_percentage = 100 sc.render.filepath = OUT sc.render.image_settings.file_format = "PNG" w = bpy.data.worlds.new("section") w.use_nodes = True w.node_tree.nodes["Background"].inputs["Color"].default_value = (0.75, 0.80, 0.86, 1.0) w.node_tree.nodes["Background"].inputs["Strength"].default_value = 1.6 sc.world = w # lamps off: the cut is shown in even light for o in sc.objects: if o.type == "LIGHT": o.hide_render = True if o.name.startswith(("MARKER | ",)): o.hide_render = True bpy.ops.render.render(write_still=True) print("[section] wrote", OUT, sc.render.resolution_x, sc.render.resolution_y)