原文链接
在 blender 中使用 python 生成角色动画(三)- 背景切换| 包包凯
正文
初衷
在虚拟内容生成中,我们有时候会需要在某些时刻更换背景图片, 比如 前 5 帧使用的是背景图1,后 5 帧使用的是背景图2。我们希望能够通过脚本自动进行操作,便于后续的后台自动化渲染。
实现
在 Blender 中,背景图的增加是通过 Compositing
的节点实现的。
我们要做的是通过 Python 脚本来实现节点树的生成。
代码如下:
import bpy
imgs = ["XXXX1","XXXX2"]
# 将图片导入到 blender
for img_path in imgs:
bpy.ops.image.open(filepath=img_path)
# 启用节点
bpy.context.scene.use_nodes = True
tree = bpy.context.scene.node_tree
# 将原有节点删除
for node in tree.nodes:
tree.nodes.remove(node)
# 添加所有节点并设置参数
rl_node = tree.nodes.new(type="CompositorNodeRLayers")
alpha_node = tree.nodes.new(type="CompositorNodeAlphaOver")
output_node = tree.nodes.new(type="CompositorNodeComposite")
image_node = tree.nodes.new(type="CompositorNodeImage")
# 设置背景图缩放大小为 1080P
scale_node = tree.nodes.new(type="CompositorNodeScale")
scale_node.inputs.get("X").default_value = 1920
scale_node.inputs.get("Y").default_value = 1080
scale_node.space = "ABSOLUTE"
# 对各个节点进行连接,注意 alpha 节点的两个输入都叫 `Image`,故只能通过索引来获取
links = tree.links
links.new(rl_node.outputs.get("Image"), alpha_node.inputs[2])
links.new(image_node.outputs.get("Image"), scale_node.inputs.get("Image"))
links.new(scale_node.outputs.get("Image"), alpha_node.inputs[1])
links.new(alpha_node.outputs.get("Image"), output_node.inputs.get("Image"))
# 设置渲染格式为 png
bpy.data.scenes["Scene"].render.image_settings.file_format = 'PNG'
# 渲染 2 帧,每帧使用不同的背景图
for i in range(2):
if i == 0:
image_node.image = bpy.data.images['1.png'] # 注意这里只需要设置文件名即可,不需要原始路径
elif i == 1:
image_node.image = bpy.data.images['2.png']
bpy.data.scenes["Scene"].frame_current = i
bpy.data.scenes["Scene"].render.filepath = '//%02d'%(i)
bpy.ops.render.render( write_still=True )
运行后,在 Compositing 窗口可以看到以下节点(实际上这些节点会堆在一起,我这里手动摆放了下便于查看):
- Compositing 节点树
结果
-
第一帧:
-
第二帧: