# Usage: blender -b -P turn.py -- model.glb outprefix  -> outprefix_<view>.png
import bpy, sys, math, mathutils
argv=sys.argv[sys.argv.index("--")+1:]; src,out=argv[0],argv[1]
bpy.ops.wm.read_factory_settings(use_empty=True)
bpy.ops.import_scene.gltf(filepath=src)
for _o in list(bpy.context.scene.objects):
    if _o.type=="MESH" and _o.name.startswith("Icosphere"): bpy.data.objects.remove(_o)
meshes=[o for o in bpy.context.scene.objects if o.type=="MESH"]
import os as _os
bpy.context.scene.frame_set(int(_os.environ.get("FRAME","1")))
dg=bpy.context.evaluated_depsgraph_get(); pts=[]
for o in meshes:
    e=o.evaluated_get(dg); me=e.to_mesh(); pts+=[e.matrix_world@v.co for i,v in enumerate(me.vertices) if i%7==0]; e.to_mesh_clear()
mn=mathutils.Vector([min(p[i] for p in pts) for i in range(3)]); mx=mathutils.Vector([max(p[i] for p in pts) for i in range(3)])
ctr=(mn+mx)/2; R=(mx-mn).length/2
print("BBOX", tuple(round(v,3) for v in (mx-mn)))
sc=bpy.context.scene; import os; sc.frame_set(int(os.environ.get("FRAME","1"))); sc.render.engine="BLENDER_EEVEE"; sc.render.resolution_x=sc.render.resolution_y=400
w=bpy.data.worlds.new("w"); sc.world=w; w.use_nodes=True
bg=w.node_tree.nodes["Background"]; bg.inputs[0].default_value=(0.16,0.17,0.2,1); bg.inputs[1].default_value=1.4
sun=bpy.data.objects.new("sun",bpy.data.lights.new("sun","SUN")); sun.data.energy=2.5; sun.rotation_euler=(math.radians(35),0,math.radians(25)); sc.collection.objects.link(sun)
cam=bpy.data.objects.new("cam",bpy.data.cameras.new("cam")); sc.collection.objects.link(cam); sc.camera=cam
cam.data.type="ORTHO"; cam.data.ortho_scale=R*2.05
for name,yaw,pitch in [("front",0,8),("back",180,8),("side",90,8),("game",25,55),("top",0,88)]:
    y,p=math.radians(yaw),math.radians(pitch)
    d=mathutils.Vector((math.sin(y)*math.cos(p), -math.cos(y)*math.cos(p), math.sin(p)))
    cam.location=ctr+d*R*4
    cam.rotation_euler=(-d).to_track_quat("-Z","Y").to_euler()
    sc.render.filepath=f"{out}_{name}.png"; bpy.ops.render.render(write_still=True)
