大多数浏览器和
Developer App 均支持流媒体播放。
-
掌握 USD 基础知识
学习 Pixar 通用场景描述 (USD) 的基础知识,了解它将如何帮助您构建出色的 3D 素材和工作流程。我们将介绍 USD 背后的核心概念,探索如何将该格式集成到您的内容创建管道。我们还将分享如何利用 USD 的功能,借助复合来创建灵活的通用素材。
资源
- ASWF USD Working Group
- Creating a 3D application with Hydra rendering
- Introduction to Universal Scene Description (USD)
- USDZ schemas for AR
相关视频
WWDC23
WWDC22
WWDC21
-
下载
♪ 柔和乐器演奏的嘻哈音乐 ♪ ♪ 您好 欢迎来到 WWDC 我是 Kacey 您可能已经见到过“通用场景描述” 或者简称为 USD 您可能已经在增强现实中 与 USD 文件进行了交互 您也可能已经有将资产 从其他格式转换为 USD 的经验 但是 USD 文件里究竟有什么呢? USD 是一项 具有独特功能的重要技术 就让我们一起揭开它的神秘面纱 来探讨 USD 的基本原理吧 我们将了解 USD 是什么 介绍一些基础的 USD 概念 学习如何用 USD 构建场景 并了解 USD 的文件格式 首先 什么是 USD? USD 由 Pixar 动画工作室开发 帮助工作室创作出 那些深受我们喜爱的精彩电影 它也在影视、娱乐 和其他行业中有着广泛应用 它被设计为可扩展的 并且正在迅速作为一种 具备协作性的关键工作流技术崛起 它是一个建立在数十年 电影行业制作经验基础上的开源项目 并且越来越多地被用于游戏 模拟、增强现实、制造业和电子商务 USD 有三个核心要素 场景描述规范、API 和渲染系统 您的 App 使用 API 与 USD 进行交互 渲染系统为使用不同 渲染器进行场景可视化提供支持 Apple 有多种多样的 USD 渲染系统 请查看“探讨 USD 工具与渲染”讲座 了解更多信息 在今天的讲座中 我们将集中了解场景描述规范 它说明了如何描述场景数据 如何组织这些数据 以及如何用文件格式来对其进行表述 究其本质 这些 USD 文件中包含了 描述场景应有外观的数据 渲染 App 解译这些数据 并在屏幕上生成图像 比如说 在去年的 WWDC 讲座中 我们创建了这个 USD 场景 并用 Octane 对它进行了渲染 现在让我们深入探讨基本概念 并了解渲染背后的数据 为了简单起见 我们将使用文本 USD 表述 USD 有很多很酷的功能 我们都想一一谈到 但因为时间有限 我们将集中讲解您在使用 USD 时 可能最常遇到的必要功能 比如舞台、基元和层级 它们只是其中的几个例子 让我们从舞台开始 想象一下 我们正在剧院观看戏剧 作为观众 我们观察着舞台上 演员的表演 留意环境 灯光和道具 这很好地类比了舞台 在 USD 中运作的方式 一个舞台就是一个场景图表 或者数据结构 用于以分等级的方式 在所有场景元素集中之处 对图像信息进行组织 一个舞台是单个或多个层级的组合 它们通常是包含场景信息的文件 一般来说舞台是由基元组成的 基元是场景的主要容器对象 基元可以通过包含其他基元 来创建场景元素的层级结构 我们来看一个例子 左侧是一个示例 USD 分层 在右侧 我们可以看到舞台的 预览视觉表述 我们可以看到两个基元 一个球体和一个立方体 每个基元都有特定的类型 来定义它在舞台中代表什么 构成一个舞台的基元类型有很多 比如网格、灯光和材质 在这个例子当中 球体基元有一个 名为 Sphere 的类型 立方体基元有一个 名为 Cube 的类型 这提出了一个很好的问题 USD 怎么知道这些 基元类型代表的含义呢? USD 是通过使用模式来了解的 模式是用于定义基元 在舞台上角色的结构化数据 它们为常见的场景概念提供意义 比如几何、材料等等 在这个例子中 这就是一个球体的模式定义 它定义了每个球体都有半径 和边界框范围 使用现有的模式 USD 为您提供了丰富的 内置类型基础 用于描述您的场景 自定义模式使您 能够进一步扩展 USD 您可以提供自己的模式 来表述您的自定义数据 用于您自己的案例和工作流程中 模式不需要具备视觉表述 它们可以只是您想在舞台上 以结构化且有意义的方式 保有的数据 举例来说 我在这里创建了一个 名为“WWDC”的新模式 它定义了一个含有标题和 相关年份的基元 这个名为“WWDC22”的基元 就使用了该模式 它已将年份设定为 2022 年 并将标题设为“调用代码” 年份和标题被称作 基元的“属性” 基元可以有各种各样的属性 每种属性都由类型和值构成 属性也可以带有创建的默认值 这样它们就不必在使用此 模式的基元中进行明确定义 回到我们的 Sphere 模式 您可以看到我们是如何为 半径和范围属性定义默认值的 这一层级中有一个 单独的 Sphere 基元 由于未设置 Radius 属性 它就从 Sphere 模式中衍生出值 默认半径为 1 我们当然也可以明确地设置半径属性 球体看起来和之前一样 因为设置值与模式中 默认设置的值“1”匹配 现在让我们添加第二个球体 并将半径设置为 0.5 我们可以看到 它确实只有另一个球体的 一半那么大 属性、基元和舞台也可以包含元数据 元数据是可以为场景中某些部分 提供辅助数据的信息的键值对 元数据在它适用的级别中设置 影响整个舞台的元数据 和其中的所有基元 都设置在舞台这一级 特定于单个基元的元数据 则设置在基元上 属性也可以含有元数据 比如说 这是典型的舞台元数据 metersPerUnit 定义场景的比例单位 upAxis 定义 X、 Y 或 Z 轴中哪一个 是对场景中相机而言朝上的方向 doc 字符串存储有用的文档 用于工作流的跟踪 现在我们已经定义了基础信息 就可以开始使用 USD 了 让我们看看仅使用这些概念 是怎么做出煎饼的场景的 在这个层级中 我们创建了名为 Pancakes 的转换基元 再添加一个名为 Blueberry_01 的转换基元 它是 Pancakes 基元的子基元 在 Blueberry_01 基元中 我们加入了 Mesh 基元 Mesh 基元中保存着蓝莓的几何形状 并将其与材料绑定 让我们通过添加其他基元 完成剩余资产的构建 这是我们仅使用基本概念 完成的煎饼场景
基础知识可以让您走得很远 但在以生产为中心的项目中 我们需要与许多不同的团队成员 和组织进行协作 USD 有很多可以满足这一需求的功能 通过“组合”来实现 组合使通过不同场景描述单元 创建舞台成为可能 它允许在实现协作和 快速迭代的场景中 有效地重复使用 3D 元素 我们将讨论最常见的组合类型 分层、引用、有效负载和变体集 不过 让我们用有趣 一点的方式来探讨吧 想玩国际象棋吗? 就让我们来构建 一套国际象棋的场景吧 在场景中 我们将在目录层级中使用资产目录 它指的是我们的棋子 然后我们将这些棋子在布局层中 排列在棋盘上 得到最终结果 结果可以通过 ChessSet 层级查看 首先要制作我们的棋子 在国际象棋中 有六类主要的棋子 士兵、城堡、主教 骑士、王后和国王 我们将使用这些 通过 Object Capture 创建的资产 来构建一套完整的国际象棋 让我们先使用一个 USD 概念 来把棋子带入舞台 这就是引用 引用是指一个舞台 中的基元引用另一个 在同一舞台或不同层级的基元 而无需复制数据 这有助于最大限度地减少数据重复 并允许不同的人和 App 分别更新数据 让我们将士兵棋子资产引用到场景中 在目录层级中 我们定义了一个名为 Pawn 的基元 到目前为止它还没有任何数据 所以我们的舞台仍然是空的 接下来 我们要添加 对 Pawn.usda 层级的引用 这会将士兵棋子资产引入 我们可以在目录层级看到它 但 USD 是怎么知道 应该从您引用的 文件中带入哪个基元呢? 我们可以使用 defaultPrim 元数据指定这个基元 defaultPrim 元数据在舞台上定义 并指定在另一舞台使用此场景时 应该引用哪个基元 我们建议始终 为 USD 资产创建 defaultPrim 让我们检查一下士兵棋子资产 确保创建了 defaultPrim 我们可以在资产的舞台这一级 看到 defaultPrim 元数据 很好 在其他情况下 如果没有创建 defaultPrim 或者您想引用一个 与 defaultPrim 不同的基元 您可以在引用层级明确指定 基元的路径 在等级结构中的任何位置均可 USD 中的路径 用于标识舞台上的元素 基元路径是基元的唯一标识符 举例来说 在这个舞台中 我们可以看到三个基元 “世界”基元的基元路径为 /World “士兵”和“骑士”基元 被认为是“世界”的子基元 因此 通往“士兵” 的 路径将是 /World/Pawn 而通往“骑士”的路径 则是 /World/Knight 有了这个概念后 我们可以明确 基元路径设置到 我们引用中的 Pawn 基元 对于较大的场景 一次性加载 所有场景信息可能代价过高 因此 USD 允许使用一种 名为“有效负载”的引用类型 对将场景描述搬上舞台的 动作进行延迟加载 在引用大型数据集时推荐使用 有效负载 例如复杂的几何图形 或其他表示道具和角色的 大型场景图
由于我们会将这些 资产引用转换为有效负载 所以可以选择延迟加载棋子 如果我们选择不加载有效负载 则场景在最初打开时显示为空 一旦启用了加载有效负载 就可以重新看到我们的棋子 现在我们的场景中有了棋子 现在可以开始把它们排列在棋盘上 我们可以使用 USD 的 分层概念 在另一个层级上完成 通过分层 层级可以堆叠起来 原理类似于流行的图像编辑软件 例如 Photoshop 和 Affinity Photo 位于一个层级上方 另一个层级中的基元 被视为更强 可以添加或覆盖 较低层级中的数据 正如您所看到的 棋子目前的位置都是错误的 但是不用担心 我们可以使用分层 对其他层级进行非破坏性修改 这非常适合在无需编辑 目录层级的情况下 将棋子移动到正确的位置 让我们来看看这应该如何完成 首先创建一个 名为 ChessSet 的新舞台 它将是我们最后的场景 在层级的顶部 它包含了一个 名为“子层级”的元数据 现在我们将棋子与目录层级一起引入 接下来 我们新建一个层级 Layout.usda 用来移动棋子 这个布局层级将包含 棋子的位置信息 让我们开始覆盖棋子在场景中的位置 我们先从 Pawn_01 开始 我们通过更改士兵棋子资产的 平移属性 来修改它的位置 让我们来看看这将如何更新场景 这是没有布局层级的国际象棋盘 所以士兵棋子仍在它原来的位置上 一旦我们添加了布局层级 士兵棋子就被移动到了 它在棋盘上的预期位置 让我们对其他棋子进行同样的操作 将它们移动到正确的位置上
我们摆放其他棋子的方法 和摆放士兵棋子一样 这里我们移动了 Pawn_02 然后是 Pawn_03 以此类推 我们完成了对布局层级的更改 将棋子放置在了正确的位置上
我们的国际象棋已经完成了半套 我们使用层级将 资产与目录层级一起引入 并通过布局层级的覆盖将它们 放置在棋盘上
剩下的就是为对手方 设置棋子 需要注意的是对手的棋子 颜色不同 无需重新制作一套新的资产 我们可以使用另一个 USD 概念 “变体集”来更新我们的棋子资产 变体集允许舞台上的 离散替代物进行动态交换 变体集中包含的变体 可以是不同的材料、几何形状、 以及一切 可以用 USD 表述的东西 在舞台上进行不同变体之间的切换 是非破坏性的 我们将设置变体集 在棋子的不同材料之间进行切换 在“士兵”资产中 我们添加名为“color”的变量集 这样就可以在士兵棋子的 不同颜色之间进行切换 现在我们将两个变体添加到变体集 Dark 使用深色材质 Light 使用浅色材质 最后 我们设置默认变体来指定 将士兵棋子加载到 舞台上时具体使用哪一个 现在 我们回到目录层级 所有的棋子都已经摆好了 但它们都使用了浅色材料 那是因为默认变体 设置为浅色材质 让我们将其中一个棋子的变体 更改为深色材料 我们将变体设置为 Dark 我们可以看到对方阵营中的一个棋子 现在变成了深色 让我们也将更改应用于其他棋子 我们的这套国际象棋终于完成了
我们还可以使用另一个 USD 概念来优化我们的场景 场景图实例化 场景图实例化允许我们 在舞台上多次重复使用场景图的局部 用于表述任何包含 不止一种元素的物件 例如树叶、家具 还有我们案例中的棋子 使用场景图实例化 将同时为您的 App 提供内存和性能的提升 要使用场景图实例化 我们可以在基元或场景图的局部 指定实例元数据 所有实例化的基元都可以 共享同一个场景图 让我们在场景中 添加对基元实例化的支持 在目录文件中 我们将 元数据 instanceable 添加到棋子基元 并将值设置为真 通过添加此元数据 USD 现在将把这些资产 看作共享相同数据的 潜在可实例化基元 而不再去为每个基元复制数据 我们的国际象棋盘看起来还是一样 但现在 它的性能和 内存效率都提高了 这样一来 我们的 这套国际象棋就完成了! 它看起来很棒 我们也练习了 各种 USD 功能的使用
分层、引用、有效负载和变体集 只是 USD 定义的几个组合类型 USD 对场景图的创建 有特定的强度顺序 以确保一致的场景表述 有关组合的更多信息 和首字母缩写为 LIVRPS 的命令 您都可以在 Pixar 的 USD 文档中进一步了解 在今天的讲座中 我们探讨了 USD 文件中的内容 现在让我们来谈谈文件本身 以及它们出现在磁盘上的方式 USD 文件的类型有以下几种 包含可读 ASCII 文本的 USD 文件 使用 .usda 扩展名 在今天的讲座中 我们一直在使用这些文件 更紧凑、更高效的二进制表述 是箱格式 扩展名为 .usdc 您可能还会看到 使用 .usd 扩展名的文件 它们既可以是 ASCII 文本 也可能是二进制箱文件 最后 USD 还有一个打包格式 可以将多个 USD 文件 和相关的辅助文件 比如纹理 囊括在 一个未压缩的 zip 存档中 使用 .usdz 扩展名 今天我们了解了 USD 的基本概念 舞台、层级、基元 模式、属性和元数据 我们使用这些概念 来构建了一套国际象棋 并使用了引用、有效负载、默认基元 基元路径、分层和实例化 最后 我们讨论了 不同的 USD 文件格式 .usda, .usdc .usd 和 .usdz 我们鼓励您 通过 Pixar 的 USD 文档 更深入地了解这些概念 并在您的 App 中 充分利用 USD 的功能 谢谢! ♪
-
-
正在查找特定内容?在上方输入一个主题,就能直接跳转到相应的精彩内容。
提交你查询的内容时出现错误。请检查互联网连接,然后再试一次。