- 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中,可以通过脚本实现许多常用功能,从而释放其强大的自动化和批量处理性能。预定义的脚本在脚本窗口的脚本选项卡里可以找到,包含用于批量渲染的易用脚本和编码视频等,结合其完整功能创建和保存自定义脚本,包括相机控制、照明预设、材质和材质模板、环境、背景、渲染(图像、动画和VR),以及打开/保存/导入文件。本文整理至互联网,方便读者学习,如有侵权,请联系,第一时间删除。 1.脚本使用方法 1.1 实时脚本控制台 1.2 脚本库中的脚本 1.3 命令行方法
在命令行上运行KeyShot:keyshot.exe(打开的可选文件)-script
在窗口>脚本控制台,打开脚本控制台界面,如下图所示: 在这种情况下,我们将图像渲染为尺寸为1200x1000像素的PNG文件到“ /path/to/save/image.png”。请注意,图像的格式由文件扩展名确定。与导入一样,可以使用opts选项传递高级选项。例如,可以设置最长10秒的渲染时间: 另一个示例是使用具有64个样本,8个线程和64个射线反d的高级渲染方法进行渲染: 通常,您不能取消脚本,但是可以执行某些 *** 作,例如导入文件或渲染图像,动画或XR。在这些情况下取消表示取消关联的对话框,例如渲染输出窗口或导入进度对话框。 可取消的 *** 作是: 在脚本中使用相机就像在Project→Camera中使用“相机”选项卡 :您可以创建相机,根据需要对其进行 *** 作并保存。 检查可用的摄像机: 选择其他相机: 删除刚创建的相机: 请注意,如果您删除活动的摄像机,它将选择“默认摄像机”。 提供以下7种标准视图: 在脚本中,当需要多个输入时,最好显示一个对话框。为此,您可以使用lux.getInputDialog()。Luxion提供的脚本将使用此脚本。例如,如果我们要编写视频编码脚本,则以下对话框可能就足够了: 如果您单击“确定”而不更改任何值,那么您将获得上面的Python字典。每个键都与对话框中的值相关联。请注意,上面的“ \”字符指示该行的继续,因此它不会拆分为多行,而是理解为一行。对于经常运行的脚本,让KeyShot记住再次显示对话框时的最后一个值很方便,这可以通过对id选项使用唯一值来实现: 如果其他脚本已经使用了唯一值,那么您将得到不想要的结果。但是,请记住,脚本每次都必须使用相同的唯一值来检索您的值。 可以通过lux.getSceneTree() 访问场景的元素,每个场景树节点的类型为lux.SceneNode。这非常有用,因为对于每个节点,您可以隐藏/显示,锁定/解锁,选择/取消选择,更改材质,应用变换,复制,移动等等。请尝试使用help(lux.SceneNode)了解更多信息。假设您要隐藏名称中包含“ Cord”的所有节点: 另一个示例可能是您想要访问所有名为"Padding"的组,并选择所有名称为"Ear Pad"的子节点(在带有轮廓的场景中): 如果您隐藏了某些部分,只是想再次显示所有内容: 请注意,根节点本身就是lux.SceneNode,因此可以在其上调用与子节点相同的功能。也可以更换材料。要模拟环境光遮挡,可以执行以下 *** 作: 一个技巧是使用lux.SceneNode.find(“”)来查找所有内容。可以将节点移动到其他组,就像通过拖放 *** 作在场景树中一样。在下面的代码中,我们找到"Headphone#1"组,并将所有使用带有"Padding"材料的节点移动到该组。 节点可以通过脚本进行平移,缩放,旋转等。通过使用luxmath.Matrix类型的4x4转换矩阵是可能的。有两种转换方式:相对转换或绝对转换。相对变换意味着将变换局部应用,即在现有变换链中最后相乘。这意味着,如果相对平移(1,0,0),那么它将仅根据节点的位置沿x轴移动一个节点。相反,绝对变换的链接方式不同,并且绝对平移(1,0,0)会将节点始终定位在(1,0,0)。进行变换时,将单位矩阵(对角线为1s)用作基本矩阵很重要。它是通过以下方式获得的: 用(5,0,1)转换节点: 如果要进行绝对位置调整,请执行以下 *** 作: 注意,只有对象节点可以应用绝对变换! 如有疑问,请留言。 欢迎分享,转载请注明来源:内存溢出
输入help(lux.pause)命令查找帮助,或者输入网址查找帮助http://www.kaotop.com/file/tupian/20220421/image.png", width = 1200, height = 1000)
>>> opts = lux.getRenderOptions()
>>> opts.setMaxTimeRendering(10)
>>> lux.renderImage("/path/to/save/image.png", width = 1200, height = 1000, opts = opts)
3.3 取消脚本
>>> 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)
lux.importFile()
lux.renderImage()
lux.renderFrames()
lux.renderAnimation()
lux.renderXR()
lux.encodeVideo()
只需检查返回值以查看它是否为False,从而被取消或失败。特别是如果您使用的是循环结构,则可以执行以下 *** 作:
3.4 相机 *** 作
>>> frames = 10
>>> for frame in range(1, frames + 1):
lux.setAnimationFrame(frame)
if not lux.renderImage("/path/to/output.{}.png".format(frame)):
break
>>> 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)
lux.VIEW_FRONT
lux.VIEW_BACK
lux.VIEW_TOP
lux.VIEW_BOTTOM
lux.VIEW_LEFT
lux.VIEW_RIGHT
lux.VIEW_ISOMETRIC
设置标准视图会 *** 纵活动的摄像机,因此您可以为每个标准视图创建摄像机,但要记住要保存它们。>>> 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': ''}
>>> opts = lux.getInputDialog(title = "Encode Video", \
desc = "Put a description here.", \
values = values, \
id = "something_unique_goes_here")
>>> root = lux.getSceneTree()
>>> for node in root.find(name = "Cord"):
node.hide()
>>> 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.setEnvironmentImage("All White.hdr")
>>> for node in root.find(""):
node.setMaterial("Matte White")
3.7 转换场景节点
>>> grp = root.find(name = "Headphone #1")[0] # Take first node of set.
>>> for node in root.find(mat = "Padding"):
node.moveToGroup(grp)
True
>>> 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 |
>>> 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的文档。
合理的脚本代码可以有效的提高工作效率,减少重复劳动。
评论列表(0条)