I need to make simple script for creating set of images to compile a 360 degrees panorama. So i need to render image - rotate camera - render image - rotate camera - render etc. I want to preview rendering images and here is a problem:
Render does not start for a second time.
Script renders first image, rotate camera and stops.
In console window i see:
render start
saved image
render finished
scene update
render start
and nothing more. No errors.
Script stops on
bpy.ops.render.render(‘INVOKE_DEFAULT’, write_still=True)
If i use
bpy.ops.render.render(write_still=True)
my code works correct but without preview.
Here is my code:
import bpy
from bpy import context
from bpy.app.handlers import persistent
@persistent
def onrenderfinished(scene):
print('render finished')
bpy.app.handlers.render_complete.remove(onrenderfinished)
bpy.app.handlers.render_cancel.remove(onrenderfinished)
sceneupdateposthadler = bpy.app.handlers.scene_update_post
if onsceneupdatepost not in sceneupdateposthadler:
sceneupdateposthadler.append(onsceneupdatepost)
return {'FINISHED'}
@persistent
def onsceneupdatepost(scene):
print('scene update')
bpy.app.handlers.scene_update_post.remove(onsceneupdatepost)
if Panorama360.CurrentPoint < len(Panorama360.TargetPoints):
Panorama360.CurrentPoint = Panorama360.CurrentPoint + 1
Panorama360.RenderToCurrentPoint(None)
else:
Panorama360.CurrentPoint = 0
return {'FINISHED'}
class Panorama360(bpy.types.Operator):
"""Panorama360"""
bl_idname = "render.panorama360"
bl_label = "Panorama360"
TargetPoints = []
CurrentPoint = 0
def execute(self, context):
bpy.ops.object.select_all(action='DESELECT')
PanoramaPointer = bpy.data.objects['PanoramaPointsSphere']
Panorama360.TargetPoints = [(PanoramaPointer.matrix_world * v.co) for v in PanoramaPointer.data.vertices]
Panorama360.RenderToCurrentPoint(None)
return {'FINISHED'}
def RenderToCurrentPoint(self):
CameraTarget = bpy.data.objects['CameraTarget']
CameraTarget.location = Panorama360.TargetPoints[Panorama360.CurrentPoint]
rendercompletehadler = bpy.app.handlers.render_complete
if onrenderfinished not in rendercompletehadler:
rendercompletehadler.append(onrenderfinished)
rendercancelhadler = bpy.app.handlers.render_cancel
if onrenderfinished not in rendercancelhadler:
rendercancelhadler.append(onrenderfinished)
print('render start')
bpy.data.scenes["Scene"].render.filepath = '//_%d.jpg' % Panorama360.CurrentPoint
# bpy.ops.render.render(write_still=True)
bpy.ops.render.render('INVOKE_DEFAULT', write_still=True)
return {'FINISHED'}