81 lines
2.3 KiB
Python
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() |