本教程的目的是介绍基本的 Omniverse Replicator 功能,例如使用一些预定义的 3D 资产创建一个简单的场景,应用随机化,然后将生成的图像写入磁盘以进行进一步处理。
要运行脚本,请按照设置脚本编辑器中的设置说明进行操作。
首先,让我们在 USD 文件中使用 rep.new_layer()
创建一个新的 USD 层,用于放置和随机化资产。 现在让我们在场景中的所需位置创建一个相机。 这将启用为其生成帧的视口。 为了做到这一点,相机以首选分辨率连接到渲染器。 在这种情况下,我们使用分辨率为 1024x1024 的默认渲染器。
import omni.replicator.core as rep
with rep.new_layer():
camera = rep.create.camera(position=(0, 0, 1000))
render_product = rep.create.render_product(camera, (1024, 1024))
现在,让我们为我们的简单场景创建基本的 3D 形状。 用户还可以携带他们可能已经创建的任何自定义 3D 对象。 教程在完全开发的场景中使用复制器演示了将用户生成的资产引入场景中的过程。 请注意,在创建资产时,我们使用标志semantics
添加语义。 这些语义标签被添加到 3D 形状,并在为数据生成注释时使用。
torus = rep.create.torus(semantics=[('class', 'torus')] , position=(0, -200 , 100))
sphere = rep.create.sphere(semantics=[('class', 'sphere')], position=(0, 100, 100))
cube = rep.create.cube(semantics=[('class', 'cube')], position=(100, -200 , 100))
我们创建了一个相机,将其连接到渲染器,引入了 3D 资产。 此时,我们已准备好定义具有指定分布的随机化器(在本例中为均匀随机)。 在本教程中,我们随机化场景中这些资产的位置和比例。
请注意,这些随机化是在每个帧事件中触发的。 在此示例中,我们生成 10 个随机化的帧。
with rep.trigger.on_frame(num_frames=10):
with rep.create.group([torus, sphere, cube]):
rep.modify.pose(
position=rep.distribution.uniform((-100, -100, -100), (200, 200, 200)),
scale=rep.distribution.uniform(0.1, 2))
最后,为每个帧生成的数据然后写入磁盘。 为此,Replicator 提供了一个默认的 Writer,可以像本例中演示的那样使用。 除了默认编写器,用户还可以创建自己的自定义编写器。 这在后续教程之一中进行了演示。
在下面的代码中,默认的 Writer 被初始化并附加到渲染器以生成带有 2D 边界框的图像和注释的输出。 请注意,用户可以指定特定的输出目录供编写器使用。
writer = rep.WriterRegistry.get("OmniWriter")
writer.initialize(run_id=1, output_dir="_output", rgb=True, bounding_box_2d_tight=True)
writer.attach([render_product])
注意
如果您没有修改 output_dir
,在 linux 中,数据将位于 HOME/_output
或安装代码的文件夹中。 在 Windows 中,由于权限,它可能会失败。 确保将 _output
文件夹修改为有效的内容。
下面是可以直接复制到脚本编辑器的整个脚本。
import omni.replicator.core as rep
with rep.new_layer():
camera = rep.create.camera(position=(0, 0, 1000))
render_product = rep.create.render_product(camera, (1024, 1024))
torus = rep.create.torus(semantics=[('class', 'torus')] , position=(0, -200 , 100))
sphere = rep.create.sphere(semantics=[('class', 'sphere')], position=(0, 100, 100))
cube = rep.create.cube(semantics=[('class', 'cube')], position=(100, -200 , 100) )
with rep.trigger.on_frame(num_frames=10):
with rep.create.group([torus, sphere, cube]):
rep.modify.pose(
position=rep.distribution.uniform((-100, -100, -100), (200, 200, 200)),
scale=rep.distribution.uniform(0.1, 2))
# Initialize and attach writer
writer = rep.WriterRegistry.get("BasicWriter")
writer.initialize( output_dir="_output", rgb=True, bounding_box_2d_tight=True)
writer.attach([render_product])
rep.orchestrator.preview()
单击脚本编辑器窗口底部的运行 (Ctrl + Enter) 按钮。 这将创建运行工作负载所需的所有必要节点。 最后一行 rep.orchestrator.preview()
运行图形一次,供您预览输出。
要运行完整的生成或另一个预览,请单击 Replicator 左上角的 → Run 以启动数据生成过程,如运行和预览 Replicator 所示。 生成的数据存储在指定的输出目录中。
注意
如果你没有修改 output_dir
,在 linux 中,数据将在 HOME/_output
中。 在 Windows 中,由于权限,它可能会失败。 确保将 _output
文件夹修改为有效的内容。