【问题标题】:rendering and saving images through Blender python通过 Blender python 渲染和保存图像
【发布时间】:2013-02-05 15:07:51
【问题描述】:

我正在尝试通过搅拌机中的 python 脚本渲染和保存多个图像。我知道如何通过 Blender GUI 渲染和保存图像,但我想通过我的脚本来完成这一切,因为我使用了一组嵌套循环并且需要保存多个图像。我能够渲染图像,我猜想在输出成功的情况下保存图像。但我不确定它保存到哪里,当我尝试编辑文件路径时,它会给我上下文不正确的错误。

【问题讨论】:

  • 这在 Blender 堆栈交换上会更好。

标签: python render save blender


【解决方案1】:

下面的代码创建了一个“VR全景图”(一个物体的一系列图片,从它周围的不同角度)

我最终得到了这个算法:

  1. 创建或加载您要拍摄的对象(主题
  2. 缩放它并添加一些漂亮的照明(以便从您想要的方向看到对象);您可以通过渲染场景来检查照明(使用 F12 键)
  3. 创建一个Empty 对象并将其位置设置为主体的中心,并将旋转设置为标识(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's Python API 在场景中查找对象并将其作为subject 参数传递给函数:

rotate_and_render('/Users/myusername/Pictures/VR', 'render%d.jpg', subject = bpy.data.objects["Cube"])

【讨论】:

  • 想知道为什么write_still=True 如此重要,以至于没有它就无法保存图像。
  • @SibbsGambling 我认为这是因为 Blender 还可以选择渲染预览图像(就像按 F12 时一样)。所以实际上将渲染保存为静止图像在某种程度上是可选的。
  • 经过一段时间后,我几乎让它工作了。只有一个问题:所有生成的图像都是相同的:-)。似乎“origin.rotation_euler[2] = radians(step * (rotation_angle / rotation_steps))”这一行什么也没做
【解决方案2】:

类似这样的:

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()

【讨论】:

  • 如果没有 'write_still=True' 作为 'render()' 函数的参数,搅拌器在我的情况下没有创建图像。
【解决方案3】:

您必须执行以下操作。 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)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-04-24
    • 2020-08-19
    • 2011-07-08
    • 2016-05-05
    • 2018-07-07
    • 2017-06-15
    • 1970-01-01
    • 2020-03-06
    相关资源
    最近更新 更多