Скрипт для рендера всех кадров с keyframe. Делает панельку во вкладке Render.
import bpy import os def build_frame_set(context): current_frame = context.scene.frame_current frames = {current_frame} for action in bpy.data.actions: if action.users > 0 and not action.use_fake_user or\ action.users > 1 and action.use_fake_user: for fcurve in action.fcurves: for point in fcurve.keyframe_points: frame_nr = int(point.co[0]) if frame_nr > current_frame: frames.add(frame_nr) return frames def find_next_frame(context, frame_set, next_frame): next_frame += 1 last_frame = context.scene.frame_end while next_frame not in frame_set and next_frame <= last_frame: next_frame += 1 return next_frame if next_frame in frame_set else None def render_frame(context, frame_counter, path): context.scene.render.filepath = os.path.join(path, str(frame_counter).zfill(4)) bpy.ops.render.render(write_still=True) class RenderKeyframesOperator(bpy.types.Operator): """Tooltip""" bl_idname = "render.render_keyframes" bl_label = "Render keyframes only" @classmethod def poll(cls, context): return True def execute(self, context): current_frame = context.scene.frame_current render_path = context.scene.render.filepath next_frame = current_frame frame_set = build_frame_set(context) while True: bpy.context.scene.frame_set(next_frame) render_frame(context, next_frame, render_path) print("Frame {}".format(next_frame)) next_frame = find_next_frame(context, frame_set, next_frame) if next_frame is None: break # restore context.scene.render.filepath = render_path bpy.context.scene.frame_set(current_frame) return {'FINISHED'} class RenderKeyframePanel(bpy.types.Panel): """Creates a Panel with keyframe render button""" bl_label = "Render keyframes" bl_space_type = 'PROPERTIES' bl_region_type = 'WINDOW' bl_context = "render" def draw(self, context): layout = self.layout scene = context.scene row = layout.row(align=True) row.prop(scene, "frame_current") row.prop(scene, "frame_end") row = layout.row() row.scale_y = 2.0 row.operator("render.render_keyframes") def register(): bpy.utils.register_class(RenderKeyframesOperator) bpy.utils.register_class(RenderKeyframePanel) def unregister(): bpy.utils.unregister_class(RenderKeyframesOperator) bpy.utils.unregister_class(RenderKeyframePanel) if __name__ == "__main__": register()
Ууу, какой красивый код
ОтветитьУдалить