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 即可,渲染的具体实现在脚本中完成
参考博客
- Blender脚本开发
- 在Blender 2.8使用Python编程(入门级)
- Blender下用Python实现模型文件导入、渲染和动画生成
- 在blend外部运行Blender python脚本
- 不启动Blender界面,使用Python脚本并渲染
以上是关于keyshot脚本开发-python脚本-渲染图片-渲染视频-控制方式的主要内容,如果未能解决你的问题,请参考以下文章
KeyShot 9 Pro for Mac(3D渲染和动画制作) 9.0.289