扩展 Omniverse:NVIDIA 元宇宙应用构建竞赛须知
2022-09-23 09:37
NVIDIA Omniverse Code 竞赛的截止日期已延长至北京时间 2022 年 9 月 10 日上午 8 点,希望能激励更多人一起塑造 Omniverse 的未来。
早期提交的作品中有许多令人惊叹的工具,涵盖了各种行业和工作流程。这些工具包括运动捕捉、对齐工具、真实设备的实时虚拟展示、太阳系研究可视化、分解图、照明管理、相机管理、电子表格连接和新的图元路径等。
此外也向大家介绍一些合作伙伴在这次比赛之前所构建的扩展程序,这些扩展程序可能会激发出更多的想法。比如 TAA 用于动态数字孪生的 Gemini 项目和 SyncTwin 的装配线优化工具。
非常高兴能够看到大家正在构建各种工具并且希望工具构建者能够尽早获得成功机会。
通用场景描述(USD)和构建扩展程序的常见问题
NVIDIA 希望能帮助创作者和开发者尽快入门。在研讨会与开发者交谈以及在 Omniverse 论坛和 Discord 频道中回答问题时,NVIDIA 发现了一些常见技术问题,因此在本篇文章内予以回复。如果您正在寻找“如何快速入门”方面的帮助,可以跳到第 6 条,直接查看快速入门资源列表。
1. 如何获得一个图元的局部和世界变换?
获取图元局部变换的最快方法是使用一个名为 get_local_transform_SRT() 的 omni.usd 函数。此方法会返回一个包含 xformable 缩放、旋转、旋转顺序和平移的元组,无论其上是否有任何变换操作,返回的元组的长度和顺序总是相同的。
import omni.usdstage = omni.usd.get_context().get_stage()cube_prim = stage.GetPrimAtPath("/World/Cube")
# Retrieves the local scale, rotation, rotation order, and translation from any primlocal_transform =
omni.usd.get_local_transform_SRT(cube_prim)scale = local_transform[0]rotation = local_transform[1]rotation_order = local_transform[2]translation = local_transform[3]
同时,使用 ComputeLocalToWorldTransform() 从一个对象中检索世界变换。
import omni.usdfrom pxr import Gfstage = omni.usd.get_context().get_stage()cube_prim = stage.GetPrimAtPath("/World/Cube")xform = UsdGeom.Xformable(cube_prim)
#Retrieve and save the world transforms into a matrix 4d
mtrx = xform.ComputeLocalToWorldTransform(0)#Extract translation values and rotation valuestranslation = mtrx.ExtractTranslation()rotation = mtrx.ExtractRotation()
scale = Gf.Vec3d(*(v.GetLength() for v in
mtrx.ExtractRotationMatrix()))
可以使用 ComputeLocalToWorldTransform,但对于多个图元来说可能不可行,在这种情况下,建议实例化并使用 UsdGeomXformCache 及其 GetLocalTransformation() 和 GetLocalToWorldTransform() 变体。
您可以在 GitHub 上的 scatter tool 样本中看到更多的示例。
2. 如何使用编程来创建一个图元?
您可以使用 omni kit commands 整合一个通用场景描述(USD)和套件 API 调用集合并利用撤消/重复系统。您可以制作自己的命令或使用所提供的命令。可以使用 CreateMeshPrimWithDefaultXform 创建一个图元。
import omni.kit.commands omni.kit.commands.execute(\'CreateMeshPrimWithDefaultXform\',prime_type="cube")
您可以在 GitHub 上的 spawn prims 和 scatter tool 样本中了解更多信息。
3. 我需要导入哪些内容?
如果要处理场景,您需要导入 omni.usd。此外,大多数脚本会涉及到 pxr (USD)的 Gf 和 UsdGeom 模块。UsdGeom 是 Xformable 的父类,而 Xformable 是 USD 中所有图元变换的基类。Gf 是一个包含数学和线性代数运算的类。这两个模块共同包含了大量常用函数和变量。
#Import the base omniverse module
import omni.usd
Import omni.ui as ui
from pxr import Gf, UsdGeom#get the usd context and usd stage
usd_context = omni.usd.get_context()stage = usd_context.get_stage()
参见 CSV 阅读器、scatter tool、spawn prims。
对于有用户界面的扩展程序,您还需要导入 omni.ext、omni.ui 和 omni.kit.commands。
import omni.ext
Import omni.ui as ui
Import omni.kit.commands
参见 UI Window、UI Scene 和 Reticle 等示例。
4. 如何让扩展程序出现在窗口菜单中?
当您创建一个扩展程序时,最好也把它添加到窗口菜单中,以便您的用户可以打开/关闭它。为此,请使用 add_item,然后使用 .show() 和 .hide() 进行切换。
# Note the "Window" part of the path that directs the new menu item to the "Window" menu.
self._menu_path = f"Window/{WINDOW_TITLE}"
self._window = None
self._menu = omni.kit.ui.get_editor_menu().add_item(
self._menu_path,
self._on_menu_click,
True)
完整的解决方案请参见完整的 menu 样本。
5. 如何向比赛提交作品?
NVIDIA 为参赛者完整地列出了提交作品所需要采取的步骤。
准备工作:
开发并测试您的扩展程序
更新您的 extension.tomlconfig 文件,可在 exts/[project}/config 中找到
更新您的扩展程序的 READme.md 和 CHANGELOG.md,可在 exts[project]/docs 中找到
更新您的扩展程序的图标 .png 和预览 .png 图片,这些都可以在 exts/[project]/data 中找到
发布:
将您的项目发布到 GitHub 上的公共库中
添加 omniverse-kit-extension Topic 到您的库,您的项目也将显示在此处
为您的项目发布一个版本
提交:
创建一个简短的视频展示您的扩展程序的功能
在比赛登陆页面完成提交
观看下方视频,了解作品提交流程。
6. 我如何获得帮助?我应该从哪里开始?
在 NVIDIA Omniverse Discord 上与 NVIDIA 以及众多社区成员交流,观看“Code with Me”分会直播以及 Dev Jams
在 10 分钟内构建自己的第一个扩展程序,并在 Omniverse 开发者资源中心了解概况
观看我们的 Twitch 和YouTube 频道,了解产品团队和社区的最新动态
尝试自定进度的实践编码研讨会并根据接下来您想要学习的内容使用
通过社区项目和 NVIDIA 样本学习
参见 python API 核心文档
了解通用场景描述(USD)和 USD 资源
参加开发者竞赛
您现在还有时间参加!#ExtendOmniverse 竞赛将在北京时间 9 月 10 日上午 8 点(太平洋夏令时 9 月 9 日下午 5 点)结束。
请您在 Omniverse Code 或 Omniverse Kit 创建一个属于以下类别的扩展程序:
布局和场景创作工具
场景修改器或操作器工具
Omni.ui 的使用
您可以通过分享您在 GitHub 上的代码链接、一张静态图片、一段简短的视频和一段描述来提交您的扩展程序。比赛将产生一名总冠军并在三个类别中各选出一名冠军。每位冠军都将获得一台 NVIDIA RTX™ GPU。
您准备构建什么样的扩展程序呢?