- 1.脚本使用方法
- 1.1 实时脚本控制台
- 1.2 脚本库中的脚本
- 1.3 命令行方法
- 2.帮助函数
- 3.常用脚本功能
- 3.1 导入文件
- 3.2 渲染图片
- 3.3 取消脚本
- 3.4 相机操作
- 3.5 “自定义输入”对话框
- 3.6 访问场景节点
- 3.7 转换场景节点
- 4.作者答疑
在命令行上运行KeyShot:keyshot.exe(打开的可选文件)-script (可选的脚本参数…)
2.帮助函数 在窗口>脚本控制台,打开脚本控制台界面,如下图所示:
输入help(lux.pause)命令查找帮助,或者输入网址查找帮助https://media.keyshot.com/scripting/doc/9.3/index.html
使用脚本导入模型很容易。
>>> 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.作者答疑如有疑问,请留言。