Files
blender_envmap_stitcher/scenecapturescript.py
2026-01-17 19:47:57 -05:00

81 lines
2.3 KiB
Python

#!/usr/bin/env python3
import bpy
import os,sys,math
import numpy as np
"""
Rendering script for translating a blender scene into a full sky HDR image.
This script takes a series of screenshots at different camera angles, and outputs them to a directory
In this setup, the camera is adjusted to have a 50 degree field of view (so that the renders overlap slightly) and a square image output (equal aspect ratio)
"""
#X and Z camera angles for 50 degree fov screenshots to form a full-sky panorama
xorient = np.arange(-90,90,15)
zorient = np.arange(0,360,15)
#Unfortunately, this must be an absolute path in blender on Linux
# Output directory for which to output a series of screenshots
outdir = "/absolute/path/to/your/outdir"
def orient_camera(x,y,z):
"""_
orient_camera(x,y,z)
x,y,z - camera angles in degrees.
Called from within blender to orient the camera, assumed to be named "Camera"
"""
camera = bpy.data.objects["Camera"]
camera.rotation_mode = 'XYZ'
camera.rotation_euler[0] = x
camera.rotation_euler[1] = y
camera.rotation_euler[2] = z
#update scene to apply changes
bpy.context.view_layer.update()
return
def render(outdir = outdir, fname="tmp.png"):
"""
render(outdir, fname)
outdir - the output directory in which to place the rendered image
fname - the output filename for the rendered image
Called from within blender to render a still image at the given location
"""
fname = os.path.join(outdir,fname)
camera = bpy.data.objects["Camera"]
scene = bpy.context.scene
scene.render.filepath = fname
bpy.ops.render.render(write_still=True)
return
def main1():
"""
The main script.
Rotates the camera around and saves a series of named outputs
output names are scene_{x_angle_in_degrees}_{z_angle_in_degrees}
"""
for I in range(0,len(xorient)):
for J in range(0,len(zorient)):
xx = np.floor(xorient[I])
zz = np.floor(zorient[J])
fnout = "scene_{:d}_{:d}.png".format(int(xx),int(zz))
orient_camera((xorient[I]+90)*np.pi/180,0,zorient[J]*np.pi/180)
render(outdir=outdir,fname=fnout)
main1()