keyshot脚本开发-python脚本-渲染图片-渲染视频-控制方式

Posted 插件开发

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了keyshot脚本开发-python脚本-渲染图片-渲染视频-控制方式相关的知识,希望对你有一定的参考价值。

文章目录


  在keyshot中,可以通过脚本实现许多常用功能,从而释放其强大的自动化和批量处理性能。预定义的脚本在脚本窗口的脚本选项卡里可以找到,包含用于批量渲染的易用脚本和编码视频等,结合其完整功能创建和保存自定义脚本,包括相机控制、照明预设、材质和材质模板、环境、背景、渲染(图像、动画和VR),以及打开/保存/导入文件。本文整理至互联网,方便读者学习,如有侵权,请联系,第一时间删除。

1.脚本使用方法

1.1 实时脚本控制台

1.2 脚本库中的脚本

1.3 命令行方法

  在命令行上运行KeyShot:keyshot.exe(打开的可选文件)-script <python脚本文件>(可选的脚本参数…)

2.帮助函数

  在窗口>脚本控制台,打开脚本控制台界面,如下图所示:


  输入help(lux.pause)命令查找帮助,或者输入网址查找帮助https://media.keyshot.com/scripting/doc/9.3/index.html

3.常用脚本功能

3.1 导入文件

  使用脚本导入模型很容易。

>>> lux.importFile("/path/to/your/file.obj")

  在这种情况下,我们导入了OBJ文件。
  默认情况下,不会显示带有导入选项的对话框,但是可以使用showOpts选项来完成:

>>> lux.importFile("/path/to/your/file.obj",showOpts = True)

  要进行更高级的导入,可以使用opts选项提供Python字典。一个示例可能是禁用对地面的捕捉,而不在导入时调整环境和相机外观:

>>> opts = lux.getImportOptions()
>>> opts["snap_to_ground"] = False
>>> opts["adjust_environment"] = False
>>> opts["adjust_camera_look_at"] = False
>>> lux.importFile("/path/to/your/file.obj", opts = opts)

  在更新几何时,您将需要在导入之前设置以下选项:

>>> opts["update_mode"] = True
>>> opts["merge"] = True
>>> opts["new_import"] = False

3.2 渲染图片

  假设您已经加载了BIP文件或导入了一些几何图形,并且想要使用脚本渲染到图像,请执行以下操作:

>>> lux.renderImage("/path/to/save/image.png", width = 1200, height = 1000)

  在这种情况下,我们将图像渲染为尺寸为1200x1000像素的PNG文件到“ /path/to/save/image.png”。请注意,图像的格式由文件扩展名确定。与导入一样,可以使用opts选项传递高级选项。例如,可以设置最长10秒的渲染时间:

>>> opts = lux.getRenderOptions()
>>> opts.setMaxTimeRendering(10)
>>> lux.renderImage("/path/to/save/image.png", width = 1200, height = 1000, opts = opts)

  另一个示例是使用具有64个样本,8个线程和64个射线反弹的高级渲染方法进行渲染:

>>> opts = lux.getRenderOptions()
>>> opts.setAdvancedRendering(64)
>>> opts.setThreads(8)
>>> opts.setRayBounces(64)
>>> lux.renderImage("/path/to/save/image.png", width = 1200, height = 1000, opts = opts)

3.3 取消脚本

  通常,您不能取消脚本,但是可以执行某些操作,例如导入文件或渲染图像,动画或XR。在这些情况下取消表示取消关联的对话框,例如渲染输出窗口或导入进度对话框。

  可取消的操作是:
  lux.importFile()
  lux.renderImage()
  lux.renderFrames()
  lux.renderAnimation()
  lux.renderXR()
  lux.encodeVideo()
  只需检查返回值以查看它是否为False,从而被取消或失败。特别是如果您使用的是循环结构,则可以执行以下操作:

>>> frames = 10
>>> for frame in range(1, frames + 1):
        lux.setAnimationFrame(frame)
        if not lux.renderImage("/path/to/output..png".format(frame)):
            break

3.4 相机操作

  在脚本中使用相机就像在Project→Camera中使用“相机”选项卡 :您可以创建相机,根据需要对其进行操作并保存。

>>> lux.newCamera("New")
True
>>> lux.setCameraLookAt(pt = (1, 1, 1)) # Example manipulation.
>>> lux.saveCamera()

  检查可用的摄像机:

>>> lux.getCameras()
['New', 'last_active', 'default']

  选择其他相机:

>>> lux.setCamera("default")

  删除刚创建的相机:

>>> lux.removeCamera("New")
True
>>> lux.getCameras()
['last_active', 'default']

  请注意,如果您删除活动的摄像机,它将选择“默认摄像机”。
  您还可以设置标准视图:

>>> lux.setStandardView(lux.VIEW_TOP)

  提供以下7种标准视图:
  lux.VIEW_FRONT
  lux.VIEW_BACK
  lux.VIEW_TOP
  lux.VIEW_BOTTOM
  lux.VIEW_LEFT
  lux.VIEW_RIGHT
  lux.VIEW_ISOMETRIC
  设置标准视图会操纵活动的摄像机,因此您可以为每个标准视图创建摄像机,但要记住要保存它们。

3.5 “自定义输入”对话框

  在脚本中,当需要多个输入时,最好显示一个对话框。为此,您可以使用lux.getInputDialog()。Luxion提供的脚本将使用此脚本。例如,如果我们要编写视频编码脚本,则以下对话框可能就足够了:

>>> values = [("folder", lux.DIALOG_FOLDER, "Folder with frames:", None), \\
              ("fmt", lux.DIALOG_TEXT, "Frame file format:", "frame.%d.jpg"), \\
              ("start", lux.DIALOG_INTEGER, "Start frame:", 1, (1, 4096)), \\
              ("end", lux.DIALOG_INTEGER, "End frame:", 10, (1, 4096)), \\
              ("fps", lux.DIALOG_INTEGER, "FPS:", 10, (1, 1024)), \\
              ("name", lux.DIALOG_TEXT, "Video name:", "video.mp4")]
>>> opts = lux.getInputDialog(title = "Encode Video", \\ # Shows the dialog.
                              desc = "Put a description here.", \\
                              values = values)
>>> opts
'end': 10, 'fps': 10, 'fmt': 'frame.%d.jpg', 'name': 'video.mp4', 'start': 1, 'folder': ''

  如果您单击“确定”而不更改任何值,那么您将获得上面的Python字典。每个键都与对话框中的值相关联。请注意,上面的“ \\”字符指示该行的继续,因此它不会拆分为多行,而是理解为一行。对于经常运行的脚本,让KeyShot记住再次显示对话框时的最后一个值很方便,这可以通过对id选项使用唯一值来实现:

>>> opts = lux.getInputDialog(title = "Encode Video", \\
                              desc = "Put a description here.", \\
                              values = values, \\
                              id = "something_unique_goes_here")

  如果其他脚本已经使用了唯一值,那么您将得到不想要的结果。但是,请记住,脚本每次都必须使用相同的唯一值来检索您的值。

3.6 访问场景节点

  可以通过lux.getSceneTree() 访问场景的元素,每个场景树节点的类型为lux.SceneNode。这非常有用,因为对于每个节点,您可以隐藏/显示,锁定/解锁,选择/取消选择,更改材质,应用变换,复制,移动等等。请尝试使用help(lux.SceneNode)了解更多信息。假设您要隐藏名称中包含“ Cord”的所有节点:

>>> root = lux.getSceneTree()
>>> for node in root.find(name = "Cord"):
        node.hide()

  另一个示例可能是您想要访问所有名为"Padding"的组,并选择所有名称为"Ear Pad"的子节点(在带有轮廓的场景中):

>>> for node in root.find(name = "Padding", types = lux.NODE_TYPE_GROUP):
        for ch in node.getChildren():
            if ch.getName() == "Ear Pad":
                ch.select()

  如果您隐藏了某些部分,只是想再次显示所有内容:

>>> root.show()

  请注意,根节点本身就是lux.SceneNode,因此可以在其上调用与子节点相同的功能。也可以更换材料。要模拟环境光遮挡,可以执行以下操作:

>>> lux.setEnvironmentImage("All White.hdr")
>>> for node in root.find(""):
        node.setMaterial("Matte White")

  一个技巧是使用lux.SceneNode.find(“”)来查找所有内容。可以将节点移动到其他组,就像通过拖放操作在场景树中一样。在下面的代码中,我们找到"Headphone#1"组,并将所有使用带有"Padding"材料的节点移动到该组。

>>> grp = root.find(name = "Headphone #1")[0] # Take first node of set.
>>> for node in root.find(mat = "Padding"):
        node.moveToGroup(grp)
True

3.7 转换场景节点

  节点可以通过脚本进行平移,缩放,旋转等。通过使用luxmath.Matrix类型的4x4转换矩阵是可能的。有两种转换方式:相对转换或绝对转换。相对变换意味着将变换局部应用,即在现有变换链中最后相乘。这意味着,如果相对平移(1,0,0),那么它将仅根据节点的位置沿x轴移动一个节点。相反,绝对变换的链接方式不同,并且绝对平移(1,0,0)会将节点始终定位在(1,0,0)。进行变换时,将单位矩阵(对角线为1s)用作基本矩阵很重要。它是通过以下方式获得的:

>>> M = luxmath.Matrix().makeIdentity()
>>> print(M.dump())
| 1.00  0.00  0.00  0.00 |
| 0.00  1.00  0.00  0.00 |
| 0.00  0.00  1.00  0.00 |
| 0.00  0.00  0.00  1.00 |

  用(5,0,1)转换节点:

>>> M = luxmath.Matrix().makeIdentity().translate(luxmath.Vector((5, 0, 3)))
>>> node.applyTransform(M)
>>> print(M.dump()) # Let's have a look at the matrix.
| 1.00  0.00  0.00  0.00 |
| 0.00  1.00  0.00  0.00 |
| 0.00  0.00  1.00  0.00 |
| 5.00  0.00  3.00  1.00 |

  如果要进行绝对位置调整,请执行以下操作:

>>> M = luxmath.Matrix().makeIdentity().translate(luxmath.Vector((5, 0, 3)))
>>> node.applyTransform(M, absolute = True)

  注意,只有对象节点可以应用绝对变换!
  有关可能进行哪些转换的更多信息,请参阅luxmath.Matrix的文档。
  合理的脚本代码可以有效的提高工作效率,减少重复劳动。

4.作者答疑


  如有疑问,请留言。

blender学习笔记:python脚本使用与离线渲染

blender学习笔记:python脚本使用与离线渲染

blender版本是3.0,下载链接:https://www.blender.org/download/


常用API

官方API文档: https://docs.blender.org/api/current/index.html
BlenderPython API中文版:BlenderPython API

STL模型导入

官方API说明:
https://docs.blender.org/api/current/bpy.ops.import_mesh.html

# 导入teethup.stl模型
bpy.ops.import_mesh.stl(filepath="/home/zzy/blender-3.0.0-linux-x64/scripts/teethup.stl")

图片导入

blender中直接插入图片是作为参考图,不能渲染,因此需要先加入一张平面,然后设置图片材质
参考博文:blender python为物体添加材质

# 新建一个平面
bpy.ops.mesh.primitive_cube_add()

# 添加颜色材质
bpy.data.materials.new('mat')
mat = bpy.data.materials['mat']
bpy.data.objects["Plane"].data.materials.append(bpy.data.materials['mat'])
mat.use_nodes = True
r = 1
g = 0
b = 0
a = 1
bpy.data.materials['mat'].node_tree.nodes["Principled BSDF"].inputs[0].default_value=(r, g, b, a)

# 添加图片材质
bpy.data.materials.new('mat')
mat = bpy.data.materials['mat']
bpy.data.objects["Plane"].data.materials.append(bpy.data.materials['mat'])
mat.use_nodes = True
matnodes = mat.node_tree.nodes
#新建图片节点
tex = matnodes.new('ShaderNodeTexImage')
tex.image = bpy.data.images.load(filepath = "/home/zzy/blender-3.0.0-linux-x64/scripts/material/img1.jpg")  
disp=bpy.data.materials['mat'].node_tree.nodes["Principled BSDF"].inputs['Base Color']
mat.node_tree.links.new(disp, tex.outputs[0])

物体选择

官方API说明:
https://docs.blender.org/api/current/bpy.ops.object.html

#为了选定某个物体操作,所以先不要选择所有物体
bpy.ops.object.select_all(action='DESELECT')
#通过select_pattern命令来按照物体命名查找选定物体,支持通配符*模糊匹配
bpy.ops.object.select_pattern(pattern="Cube", case_sensitive=False, extend=True)

参考博客:blender 2.8 python bpy 编写脚本操作物体

物体位置变换

官方API说明:
https://docs.blender.org/api/current/bpy.ops.transform.html

# set location
bpy.data.objects["teethup"].location = (0,0,0)
# set scale
bpy.data.objects["teethup"].scale = (1,1,1)
# set rotation
bpy.data.objects["teethup"].rotation_euler = (-1.57, 0, 3.14)
# or
bpy.ops.object.select_all(action='DESELECT')
bpy.data.objects["teethup"].select_set(True)
bpy.ops.transform.rotate(value=0, orient_axis='X', orient_type='GLOBAL')
bpy.ops.transform.rotate(value=1.57, orient_axis='Y', orient_type='GLOBAL')
bpy.ops.transform.rotate(value=3.14, orient_axis='Z', orient_type='GLOBAL')

一步到位(使用旋转矩阵设置rotation):

bpy.ops.object.select_all(action='DESELECT')
bpy.ops.object.select_pattern(pattern="teethup", case_sensitive=False, extend=True)
bpy.ops.transform.translate(value=(0, 0, 0), orient_type='GLOBAL', orient_matrix=((1, 0, 0), (0, 1, 0), (0, 0, 1)), 
                                                           orient_matrix_type='GLOBAL', constraint_axis=(False, True, False), mirror=True,
                                                            use_proportional_edit=False, proportional_edit_falloff='SMOOTH', proportional_size=1,     
                                                            use_proportional_connected=False, use_proportional_projected=False, release_confirm=True)

摄像头设置

选中摄像头,设置location

bpy.ops.object.select_all(action='DESELECT')
bpy.data.objects["Camera"].select_set(True)
bpy.data.objects["Camera"].location = (0,0,30)

渲染并保存为图片

官方API说明:
https://docs.blender.org/api/current/bpy.ops.render.html

bpy.data.scenes["Scene"].render.image_settings.file_format = 'PNG'
bpy.data.scenes["Scene"].render.filepath = "/home/zzy/blender-3.0.0-linux-x64/scripts/output/output1.png"
bpy.data.scenes["Scene"].render.film_transparent = True
bpy.ops.render.render( write_still=True )

离线渲染

blender.exe -b -P blendertest.py -o blenderout/ -f 0 (命令区分大小写)
上述命令的含义是:
(-b)后台运行blender并在结束后关闭
(-P blendertest.py)运行脚本blendertest.py,效果和带界面启动后运行脚本相同
(-o blenderout/)输出到blenderout文件夹
(-f 0)取第一帧,输出默认是png格式

实际只需要输入 ./blender -b -P stl_render.py 即可,渲染的具体实现在脚本中完成

参考博客

  1. Blender脚本开发
  2. 在Blender 2.8使用Python编程(入门级)
  3. Blender下用Python实现模型文件导入、渲染和动画生成
  4. 在blend外部运行Blender python脚本
  5. 不启动Blender界面,使用Python脚本并渲染

以上是关于keyshot脚本开发-python脚本-渲染图片-渲染视频-控制方式的主要内容,如果未能解决你的问题,请参考以下文章

blender学习笔记:python脚本使用与离线渲染

blender学习笔记:python脚本使用与离线渲染

keyshot重置坐标轴

KeyShot 9 Pro for Mac(3D渲染和动画制作) 9.0.289

3D渲染和动画制作|KeyShot 9 Pro for Mac中文版下载安装

blender学习笔记:python脚本的使用