通过Blender Python渲染和保存图像

46

我正在尝试通过Python脚本在Blender中渲染和保存多个图像。 我知道如何通过Blender GUI渲染和保存图像,但我希望通过我的脚本来完成所有操作,因为我正在使用一组嵌套循环并需要保存多个图像。 我能够渲染图像并且估计成功保存了图像。 但我不确定它保存到哪里,当我尝试编辑文件路径时,它会给出上下文错误。


3
这个问题在Blender交流社区会更合适。 - ComputerScientist
3个回答

54
下面的代码创建了一个“VR全景”(对象从不同角度拍摄的一系列图片)。
我最终得出了以下算法:
1. 创建或加载要拍照的对象(主题) 2. 缩放并添加一些漂亮的灯光(使对象可从所需方向看到);您可以通过渲染场景(使用F12键)检查照明。 3. 删除 创建一个"空"对象,并将其位置设置为主题的中心,旋转设置为身份(0,0,0)。 4. 将相机视图设置为起始位置(再次用渲染检查)。 5. 打开交互式Python shell(Shift+F4)。 6. 粘贴并运行脚本。
最后在"/Users/myusername/Pictures/VR"目录下会有一些围绕您的对象的图片 (由rotation_steps定义)。
def rotate_and_render(output_dir, output_file_pattern_string = 'render%d.jpg', rotation_steps = 32, rotation_angle = 360.0, subject = bpy.context.object):
  import os
  original_rotation = subject.rotation_euler
  for step in range(0, rotation_steps):
    subject.rotation_euler[2] = radians(step * (rotation_angle / rotation_steps))
    bpy.context.scene.render.filepath = os.path.join(output_dir, (output_file_pattern_string % step))
    bpy.ops.render.render(write_still = True)
  subject.rotation_euler = original_rotation

rotate_and_render('/Users/myusername/Pictures/VR', 'render%d.jpg')
你将需要选择你想要渲染的对象。或者你可以使用 Blender 的 Python API 在场景中找到该对象并将其作为 subject 参数传递给函数:
rotate_and_render('/Users/myusername/Pictures/VR', 'render%d.jpg', subject = bpy.data.objects["Cube"])

1
想知道为什么“write_still=True”非常重要,没有它你将不会保存图像。 - Sibbs Gambling
2
@SibbsGambling 我认为这是因为Blender还有一个选项可以渲染预览图像(就像按F12键时一样)。因此,将渲染保存为静态图像实际上是可选的。 - Samie Bencherif
1
过了一会儿,我几乎让它工作了。只有一个问题:所有生成的图像都是相同的 :-)。看起来像是这行代码“origin.rotation_euler[2] = radians(step * (rotation_angle / rotation_steps))”什么也没做。 - Rmz
需要这些:import os,import bpy,from math import radians。 - Gábor Horváth

13

类似这样的内容:

import bpy

bpy.context.scene.render.filepath = 'pathToOutputImage'
bpy.context.scene.render.resolution_x = w #perhaps set resolution in code
bpy.context.scene.render.resolution_y = h
bpy.ops.render.render()

16
如果在'render()'函数中没有将'write_still=True'作为参数使用,Blender在我的情况下不会创建图像。 - tobltobs

2

您需要完成以下操作。在for循环后第二行中的i是文件循环的循环索引。

我已验证此方法可在控制台和命令行中运行。渲染一个文件后不要忘记删除对象。(此处未给出删除命令,因为它不是通用的。如果该对象有链接,则需要在该命令中添加一些特定的参数)

for area in bpy.context.screen.areas:
    if area.type == 'VIEW_3D':
        area.spaces[0].viewport_shade = 'RENDERED'

bpy.context.scene.render.image_settings.file_format='JPEG'
bpy.context.scene.render.filepath = ".pic%0.2d.jpg"%i
bpy.ops.render.render(use_viewport = True, write_still=True)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接