了解如何在典型用例中自定义 VRED Core。
视频字幕:大家好,欢迎学习这一 VRED Core 教程。我是主持人 Christopher,今天将继续进行在上一个视频中开始介绍的 VRED Core 用例和使用 VRED Core 自动执行任务的教程。我将介绍如何构建用于渲染场景的工作流程、将文件转换为其他文件格式,以及使用一次处理多个文件的简单自动化脚本优化场景图形。
可以通过多种不同的方法为 VRED Core 编写自动化脚本,此外,还要考虑操作系统、用例以及许多其他因素。因此,并没有什么正确的脚本编写方法,只是有些方法很好,有些方法不那么好。
在本教程中,我将使用 Python 脚本自动执行 VRED Core 工作流程,但您也可以通过在 Windows 上使用批处理脚本、在 Linux 上使用共享脚本,或者完全不同的方法获得相同的结果。这只是为了让您了解可以执行的操作。
我使用的是 Visual Studio Code 环境,在系统上安装了 Python 运行时的情况下可以免费使用。按一下按钮,即可运行脚本,并且在终端中立即看到结果。
下面介绍第一个示例。我想将一个目录中的所有文件转换为另一种文件格式。在上一个教程中,我们了解了 -pre 和 -post 命令行选项,当我们从命令行启动 VRED 时,这些选项可为我们执行代码提供帮助。通过使用此参数,我们可以指示 VRED 加载文件,以及直接通过更改文件扩展名将其保存为其他文件格式。
在本示例中,我想进行更进一步的操作。我想自动将一个目录中的所有文件转换为另一种文件格式。首先创建一个新的 Python 文件,并定义用于配置脚本的变量。定义 VRED Core 可执行文件的路径,并定义源文件的文件扩展名以及用于查找它们的目录。此外,还定义目标文件的文件扩展名以及保存它们的目录。
请注意我在此处如何使用 Windows 启动路径,以及如何使用 r 关键字指示 Python 应该读取像此处定义的内容一样的字符串。否则,我们必须转义反斜杠。如果目标目录不存在,我还必须创建该目录。
之后,我们可以开始遍历源目录中的所有文件。我们只想处理具有正确扩展名的文件,我将提取不含扩展名的文件名,以构建文件路径来保存转换后的文件。然后,为源文件和目标文件构建文件路径。必须执行此操作,因为变量文件名仅包含文件名,而不包含整个路径。
此处必须小心处理文件路径,因为 VRED 在内部仅使用 Linux 样式的文件路径。但是,Python 函数 join 将返回 Windows 样式的文件路径。因此,在使用文件路径之前,必须将所有反斜杠替换为正斜杠。
最后,但同样重要的是,我们使用子进程函数 call 启动 VRED Core,并添加 -prepython 参数以转换文件。运行脚本时,源目录中的所有文件都将加载到 VRED 中,然后以另一种文件格式保存到目标目录中。
您可能已怀疑这不是通过 VRED Core 自动执行任务的最有效方式。这是因为,我们的脚本将为每个文件启动 VRED(这需要一些时间),处理文件,然后再次关闭 VRED。
这适合处理少量文件,但如果您想在短时间内处理许多文件,此脚本的开销就会太大。但不必担心,我们将在下一个示例中解决此问题。
我们来了解一下批处理渲染,更准确地说,了解如何在 VRED Pro 中自定义自动化渲染。您经常会面临一个问题,就是必须使用不同的视点和变量组合来渲染大量帧。在 VRED Pro 中,这非常简单,因为您可以使用渲染设置来指示 VRED 按您需要的顺序渲染变量集和视点的每个组合。
当然,我们希望您使用 Python 脚本在 VRED Core 中获得相同的结果。同样,先创建一个新的 Python 文件,同时我们要添加用于渲染视点和变量集的所有组合的代码。首先,我们定义几个变量来告诉脚本 VRED 文件所在位置、要使用的变量以及要渲染的视点。此外,还定义将用于生成新文件名的路径模板,以便整理渲染图像。
接下来,我们使用 load 函数加载 VRED 文件,然后开始遍历所有视点和变量集。这将在场景中逐个选择此特定状态,然后使用 createSnapshot 渲染图像。
在这里,我们采用之前定义的路径模板并提供视点和变量的名称,另外还设置渲染分辨率。此 Python 脚本将为我们渲染所有图像,但我们还是必须将该脚本导入到 VRED 中。
在上一个示例中,我们使用了 -pre Python 参数,整个脚本就像普通 Python 文件一样加载。有一些联机服务可以将文本或文件编码为 base64 格式,然后可以将得到的结果作为参数提供给 VRED。
这个由字母和数字组成的字符串就是刚刚编码的代码,因此 VRED 可以识别并将其作为实际 Python 代码进行读取。我们只需复制并粘贴 -pre Python 参数的 base64 字符串,整个脚本就像普通 Python 文件一样加载。有一些联机服务可以将文本或文件编码为 base64 格式,然后可以将得到的结果作为参数提供给 VRED。
此字符串的字母和数字就是刚刚编码的代码,因此 VRED 可以识别并将其作为实际 Python 代码进行读取。我们只需复制和粘贴 -prepython 参数的 base64 字符串,但在本示例中,我想介绍如何直接在 Python 脚本中对 VRED 脚本进行编码。
为此,我们必须使用三引号将 Python 代码块引起来,并将文本存储在变量中。三引号可确保代码块按此处编写情况逐行准确解释。该脚本必须是有效的 Python 脚本,因此空格和所有内容都必须正确,否则 VRED 尝试运行它时将会引发错误。
现在,我们可以在此行代码中使用变量将其内容编码为 base64。最后一行将使用参数 -prepython 并以编码的 Python 脚本作为输入来启动 VRED Core。我们只需在顶部添加一些缺少的导入项,然后就可以继续后续操作了。运行脚本需要一些时间,但最后我们应该会渲染场景的 9 个不同图像。
我们可以使用 base64 编码方法将整个 Python 脚本导入到 VRED Core 中,这是一个好方法,我们在本示例中就使用了此方法,但仍有一些缺点。主要缺点是 VRED Python 脚本与自动化 Python 脚本位于同一文件中。
如您所见,我们将 VRED 脚本置于引号中时,IDE 无法显示正常的 Python 语法亮显。这样,该脚本就难以阅读和维护,因此,我们将在下一个示例中对其进行进一步优化,下一个示例将介绍如何在场景几何体中自动进行优化。
现在,我们将需要两个 Python 文件,一个文件包含 VRED Python 脚本,另一个文件用于以此脚本作为输入来启动 VRED Core。在 VRED 脚本中,像数据转换示例中一样开始,并为包含未优化文件的目录和用于存放优化文件的目录定义变量。
当然,如果目录尚不存在,还必须创建该目录。我们遍历未优化的文件,创建源和目标文件路径,加载未优化的文件,然后应用优化。这些优化是在 VRED 的 Python API 1 的 vrOptimize 模块中定义的。您可以在线查找文档。
有许多优化可以应用,当然,根据您的几何体和用例,这些优化会有所不同。此处我选择的两个选项只是示例。最后,我们只需将文件保存到目标文件路径。处理完所有文件后,我们可以终止 VRED。与前面的示例一样,使用相同的 base64 编码方法直接将此脚本导入到 VRED 中。但这次我们从另一个 Python 脚本启动 VRED,以使其分开。
现在,在第二个 Python 文件中,我们定义 VRED Core 的路径,此外,还定义存储这两个文件的目录的路径。这可以通过此 Python 脚本的 file 属性来完成,此属性包含执行此脚本时使用的此脚本确切的完整路径。然后,我们打开刚刚创建且位于同一目录的 VRED 脚本文件,并读取其内容。接下来,我们可以像在前面的示例中一样,将文件内容编码为 base64 并启动 VRED。
将 VRED 脚本与自动化脚本分开的优势在于,您可以在其他工作流程中重用 VRED 脚本,并且可以充分利用在 IDE(例如 Visual Studio)中进行开发的优势,例如语法亮显。
在本示例中,您还可以看到我们只启动一次 VRED,然后在运行的 VRED 实例内处理所有文件,这种方法的效率比为要优化的每个文件启动 VRED 高得多。
您可以看到,有许多方法可以在 VRED 中自动执行脚本渲染或数据准备工作流程。这可以使用 Python 完成,但也可以使用其他脚本语言,例如批处理、Shell 或您喜欢的任何语言。这完全取决于您使用的任务、用例和开发环境。但基本原则始终相似。您可以使用 -prepython 和 -postpython 命令行参数将 Python 脚本注入到 VRED 中,由它为您完成处理。这些 Python 脚本可以使用 VRED 的 Python API 中定义的所有函数。
希望我介绍的这些内容有助于您初步了解如何为您的第一个自动化 VRED 工作流程编写脚本。今天就到这里。希望您喜欢本脚本教程,下次见。
下面是教程 4:如何在典型用例中自定义 VRED Core 视频随附的示例 Python 脚本。
要下载这些压缩文件,请单击此处。
import base64
import subprocess
import os
print("=[VRED Core Tutorial] Batch Data Conversion")
vredCorePath = r'D:\Programme\Autodesk\VREDCore-13.3\bin\WIN64\VREDCore.exe'
sourceExtension = 'vpb'
sourceDirectory = r'C:\VRED_Examples\vpb'
targetExtension = 'fbx'
targetDirectory = r'C:\VRED_Examples\fbx'
# Create target directory if it does not exist
if not os.path.exists(targetDirectory):
os.makedirs(targetDirectory)
# Iterate over files in source directory and process each filename
for filename in os.listdir(sourceDirectory):
# ... but only if the file extension matches
if filename.endswith(sourceExtension):
# Extract the file name without the extension
namePart = filename.split('.')[0]
print("=[VRED Core Tutorial] Data Conversion: {} from {} to {}".format(namePart, sourceExtension, targetExtension))
# Create paths for the source and the target file
# Replace windows backslashes with linux style forward slashes
sourcePath = os.path.join(sourceDirectory, filename).replace('\\','/')
targetPath = os.path.join(targetDirectory, '{}.{}'.format(namePart, targetExtension)).replace('\\','/')
# Start vred and process files
subprocess.call([vredCorePath, '-prepython=load("{}"); save("{}"); terminateVred()'.format(sourcePath, targetPath)])
print("=[VRED Core Tutorial] Finished Batch Data Conversion...")
import os
import base64
import subprocess
vredCorePath = r'D:\Programme\Autodesk\VREDCore-13.3\bin\WIN64\VREDCore.exe'
directory = os.path.dirname(__file__)
with open(os.path.join(directory, 'batch-data-optimization.py'), 'r') as file:
# Read file content
scriptContent = file.read()
# Convert python script to base64, in order to import it into VRED
base64EncodedScript = base64.b64encode(scriptContent.encode('UTF-8')).decode('UTF-8')
# Start VRED with prepython and the base64 encoded script as input
subprocess.call([vredCorePath, '-prepython={}'.format(base64EncodedScript)])
import os
print("=[VRED Core Tutorial] Batch Data Optimization")
sourceDirectory = 'C:/VRED_Examples/unoptimized'
targetDirectory = 'C:/VRED_Examples/optimzied'
# Create target directory if it does not exist
if not os.path.exists(targetDirectory):
os.makedirs(targetDirectory)
# Iterate over files in source directory and process each filename
for filename in os.listdir(sourceDirectory):
print("=[VRED Core Tutorial] Optimize file: {}".format(filename))
# Create paths for the source and the target file
# Replace windows backslashes with linux style forward slashes
sourcePath = os.path.join(sourceDirectory, filename).replace('\\\\','/')
targetPath = os.path.join(targetDirectory, filename).replace('\\\\','/')
# Load file in VRED
load(sourcePath)
# Optimize Geometry
removeTransformNodesWithNoChildren(findNode("Root"))
optimizeIndices(findNode("Root"))
# Save optimized file
save(targetPath)
# Close VRED instance
terminateVred()
import sys
import base64
import subprocess
vredCorePath = r'D:\Programme\Autodesk\VREDCore-17.2\bin\WIN64\VREDCore.exe'
batchRenderingScript = '''
vredSceneFile = r"C:/ProgramData/Autodesk/VREDPro-<internalVersion>/examples/Automotive_Genesis.vpb"
variants = ("Black Metallic", "Blue Fire Metallic", "Silver Dark Metallic")
viewpoints = ("Home", "Left-Back", "Viewpoint")
pathTemplate = r"C:/VRED_Examples/batch_rendering/variant_{viewpoint}_{variant}.png"
print("=[VRED Core Tutorial] Load Source file...")
load(vredSceneFile)
print("=[VRED Core Tutorial] Iterate viewpoints and variants...")
for viewpointName in viewpoints:
vp = vrCameraService.getViewpoint(viewpointName)
if not vp.isNull():
vp.activate()
for variantName in variants:
print("=[VRED Core Tutorial] Rendering {}, {}".format(viewpointName, variantName))
vrVariants.selectVariantSet(variantName)
createSnapshot(pathTemplate.format(viewpoint=viewpointName, variant=variantName), 1920, 1080)
print("End")
'''
# Convert python script to base64, in order to import it into VRED
base64EncodedScript = base64.b64encode(batchRenderingScript.encode('UTF-8')).decode('UTF-8')
# Start VRED with prepython and the base64 encoded script as input
subprocess.call([vredCorePath, '-prepython={}'.format(base64EncodedScript)])