Let's assume we have a simple scene with a rotating cube. I am looking for a Python way to put additional info in the right bottom corner (like rotation angle for example) on the rendered video that I have as a result. So I need to write the cube rotation angle on each frame or each keyframe.
I was trying to use something like this:
bpy.context.scene.render.stamp_note_text = str(cube_obj.rotation_euler[2])
but this cannot add metadata to each frame.
Here is my simple scene code.
import bpy
from math import radians, degrees, pi, cos
def clear_scene(fps=24):
for coll in bpy.data.collections:
if coll:
obs = [o for o in coll.objects]
while obs:
bpy.data.objects.remove(obs.pop())
bpy.data.collections.remove(coll)
for obj in bpy.data.objects:
bpy.data.objects.remove(obj)
for material in bpy.data.materials:
bpy.data.materials.remove(material, do_unlink=True)
bpy.context.scene.render.filepath = '/home/vkudak/test_cube'
bpy.context.scene.render.ffmpeg.format = 'MPEG4'
bpy.context.scene.render.image_settings.file_format = 'FFMPEG'
bpy.context.scene.render.ffmpeg.constant_rate_factor = 'LOWEST'
bpy.context.scene.render.resolution_x = 500
bpy.context.scene.render.resolution_y = 500
# 640×360 426x240
bpy.context.scene.render.ffmpeg.format = 'MPEG4'
bpy.context.scene.render.fps=fps
bpy.context.scene.use_gravity = False
bpy.data.worlds["World"].node_tree.nodes["Background"].inputs[0].default_value = (0, 0, 0, 1)
if __name__ == "__main__":
FPS = 5
clear_scene(fps=FPS)
bpy.ops.mesh.primitive_cube_add(size=2, enter_editmode=False, align='WORLD',
location=(0, 0, 0), scale=(1, 1, 1))
cube_obj = bpy.context.active_object
cube_obj.name = "Cube"
TIME = 60
times = list(range(0, TIME+1))
bpy.context.scene.frame_end = TIME*FPS
##### Create CAMERA
cam_data = bpy.data.cameras.new('camera')
cam = bpy.data.objects.new('camera', cam_data)
bpy.context.collection.objects.link(cam)
# add camera to scene
scene = bpy.context.scene
scene.camera=cam
cam.location=(7, -7, 5)
cam.data.lens=50
# tracking
cam_constraint = cam.constraints.new(type='TRACK_TO')
cam_constraint.target=cube_obj
# Add light
bpy.ops.object.light_add(type='POINT', radius=1, align='WORLD',
location=(6, 5, 2), scale=(1, 1, 1))
bpy.context.object.data.energy = 300
# period of self rotation
rot_period = 10
frame_num = 0
for t in times:
bpy.context.scene.frame_set(frame_num)
cube_obj.rotation_euler[2] += radians(360/rot_period) #sat_axis_rot
cube_obj.keyframe_insert(data_path="rotation_euler", index=2)
frame_num += FPS
# # Iterate over all the objects animation function curves
for fc in cube_obj.animation_data.action.fcurves:
fc.extrapolation = 'LINEAR' # Set extrapolation type
```