大多数浏览器和
Developer App 均支持流媒体播放。
-
使用 USD
通用场景描述 (USD) 能够可靠地描述 3D 场景,让工程师和艺术家可以在创意工作流程中开展密切协作。了解 USD 的强大功能,并探索它出色的可扩展性。更深入地了解如何创建 USD 素材资源,并了解如何提供用于 ARKit 和 RealityKit 的 usdz 内容。
资源
相关视频
WWDC21
WWDC20
WWDC19
-
下载
大家下午好 欢迎来到我们的讲演 Working with USD(使用 USD) 很高兴来到这儿 我叫 Denis Kovacs 一会 Chloe Moore 会加入讲演 去年 我们介绍了 iOS 上的 AR Quick Look 这是在设备上 探索 AR 中 3D 内容的最简单方法
比如 你可以查看 你想购买的产品的模型 你可以把它放在 自己所处的地方 感受它的真实大小
当你移动设备时 模型牢牢锁定在你周围
你可以感受到 在自己家里 实物看起来是什么样子的 因为模型的制作 是依据你所处地的照明情况的
发光材料 比如 这盏灯上的抛光铬 甚至可以反射你的环境
AR 就是很好玩 它真的非常直观 可以用来探索 3D 内容 并与之互动
在这些所有的 AR 体验背后 是一个文件格式 USDZ 我们去年将其引入平台
USDZ 支持已经 和我们的 App 和框架融为一体 所以你可以通过 信息和邮箱 把你的 AR 体验分享给朋友 你可以在 AR 里体验交互新闻 新闻内容焕然一新 你或许还可以用一种全新的方式体验 web 通过 Safari 直接将它们带入 AR
你可以借用 USDZ 搭建自己的 App
USDZ 背后的技术是 USD 这就是我们这次讲演的主题
这是我们今天的议程 首先 我们要看一下 USD 是什么 然后我们会讨论一些工作流 这些工作流 和创建 转化 USDZ 有关 最后 我们会帮你形成 使用 USD 的思维直觉
我们开始会介绍一些要素 它们对于大部分 3D 文件格式来说都很常见 最后我们会介绍 USD 一些独有的功能 首先 什么是 USD
USD 的全称是 Universal Scene Description
它是一个 3D 文件格式 通过 Python 绑定支持 C++ 库 是由 Pixar 开发的 这个库可以读写 USD 文件 它有一个非常好用的创作引擎 当然远不止这些 这个库的重点是速度 可扩展性 以及合作 这是 USD 的三个扩展文件 一个是纯文字版本 USDA 它的设计初衷 是让读写 尽可能简单 第二个是二进制版本 USDC 优点是尽可能高效读写 第三个是 USD 它既可以是纯文本也可以是二进制 你可以在这些文件格式中 来回转换
这个是 USDZ 我们先来仔细讲解一下这个格式 什么是 USDZ USDZ 是 USD 的分发格式 它包含一个 3D 场景的所有数据 打包在单个压缩文件中
它是为共享而优化的 是 AR Quick Look 的基础 iOS macOS 和 tvOS 都支持 USDZ 如果剖析一下 USDZ 文件 就可以看到 它是一个未压缩 zip 存档 为了最有效的内存映射 内含的所有文件 都对齐 64 位边界
这是 USDZ 存档 包含的两种文件类型场景描述 以 USDA USD 或 USDC 甚至 USDZ 格式归档 所以你有嵌套存档 以及一套纹理 目前是 PNG 或 JPEG 格式
我们粗略比较一下 目前那些文件格式 基础的 最基础的格式是 obj 包含一个简单的 3D 模型
材料支持有限 没有动画 这些是一批与之不同的 更现代的文件格式 它们通常包含多个模型 可以布局在一个场景图中 它们支持不同的 材料描述和动画
USD支持所有的这些 但是它的附加优点是 可扩展 Pixar 为更大的电影场景 发明了这个格式 它还支持多人合作 让很多美术师 在一个场景一起工作 同时又不会干扰彼此工作
USDZ 是一个存档包 也承袭了大部分这些功能
接下来 我们看一下工作流 我们可以把这些分为两类 转换已有素材 和创建新素材 我们先从转换已有素材开始
想象一下你有这个的素材 是一些其他的格式 可能是 FBX 或 gltf 想要将它们 转换为USDZ 应用到 App 或 AR Quick Look 上去
今天我们介绍了一个 新命令行工具 叫作 USDZconvert 它超越了去年的 Xcode converter 让你可以转换 更多的文件格式 比如 FBX 和 gltf 它还可以执行素材验证 所以你可以确信 生成的 USDZ 文件 没有问题 而且它搭建在 Python 上 所以不受平台限制 在 macOS 的其他平台上 将这个转换器 和你的现有内容流程相结合 就会比较简单
这里有几个样本案例 比如说你有一个 gltf 文件 你可以用 USDZconvert 把这个文件转换为 USDZ 格式 你可以看到 它之后执行了素材验证
如果你想知道 所有的命令行选项 你可以使用这个 -h 你也可以直接从命令行 提供丰富的材料描述 尤其对于 obj 这种 没有丰富材料定义的文件格式 这就非常方便
Usdzconvert只是其中一部分 我们对开发者提供了更大的包 这个包还包括 为 macOS 预编译的二进制 USD 库 还有一些其他东西 比如 USD 命令行工具 比如 Usdcat 它可以将你的 USDZ 文件 输出为纯文本 Usdtree 可以用来查看 模型层次的高级结构
USDchecker 是 USDZ 素材的验证器 我们还有一个小脚本 叫作 固定容量 去年 如果你提供透明材料的模型 给 AR Quick Look 那些材料在 iOS 13 里 是看起来是不透明的 用脚本来解决这个问题 为了演示一下这些 我想邀请 Chloe 到台上来 谢谢你 Denis 正如之前所见 我们提供了预编译的 USD Python 库 可以在这里下载
我已经下载并解压了
USD 文件夹包括 预编译的 USD Python 库 和一系列命令行工具 比如 Pixar 提供的 USDtree 和 USDcat
USDZconvert 文件夹包含 USDZconvert 工具 和解决不透明的工具
我们还提供了 USD 命令 它可以为你设置一些环境变量 当你双击时 它打开了一个 终端窗口
我们先从 USDZconvert 开始 如果你只是单纯运行 USDZconvert 它就输出我们的参数
现在想象你有某个 gltf 文件 需要转换
你可以用你的文件名 简单地运行 USDZconvert 现在 我们来看一下生成素材
生成到文件 包含所有的材料和动画
这儿我们也可以看到 USDZconvert 执行了附加的素材验证
接下来 比如说 你有某个没有材料的 obj 文件 就像这个四面体模型
你可以用附加参数 简单地添加材料 比如 常量颜色
这里你可以看到 材料被应用了
要看你模型的高级结构 你可以使用 USDtree
这里是材料和网格
要看模型的 纯文本文本形式 你可以使用 USDcat
还有另一种通用情况 这儿有个 obj 文件 还有很多材料纹理
把纹理分配给材料很简单 就像分配常量一样
USDZ 文件是一个未压缩的 zip 存档 所以查看其内容的快捷方法是 用 zip info 这里我们可以看到一个 USDZ 存档 包含 USDZ 文件和以上所有的纹理
这里你可以看到所有的材料纹理 应用到模型上 所以 总的来说 用 USDZconvert 将已有素材转换为 USDZ 会很简单 还有一套其他的工具 它们会帮你检查 生成素材
又轮到你了 Denis
谢谢你 Chloe
刚才就是转换部分 现在我们来看一下 如何从头开始创建 USDZ 文件
当然可以用你最爱的创作工具 创建你的素材 它有可能会导出了一个格式 比如 FBX 你可以接着用 我们刚才看到的 USDZconvert 将其转换为 USDZ
但是有越来越多的 内容创作 App 支持直接导出 USD
这使得结合内容创建步骤和 USD 流程 变得更加容易 转换步骤本来很复杂 因为有一些潜在的翻译过程 但是现在实现起来 变得简单多了
这里有两个内容创作工具 支持 USD 导出
这个是 Adobe 的 Substance Painter 它是个很好的工具 可以为你的 3D 对象 创作逼真的材料 它支持 USD 和 USDZ 导出 这个是 Autodesk Maya 最重要的 3D 模型和动画工具之一 它支持 USD 和 USDZ 输出 只需一个由 Pixar 编写并负责的插件 正如我们所见 很多这些 App 甚至支持直接导出 USDZ 进一步简化了 USDZ 创作步骤 因为有 USD 的 Python 绑定 你也可以创建 自定义 Python 流程 为你的内容定做流程
接下来 我们要让从 SceneKit 导出 USDZ 变得很简单 你要做的只是 像以前一样创建或下载 SCNScene 当你准备好 导出 USDZ 时 你只需一个 API 调用 写入 并确保文件扩展是 USDZ
实际上 我们也已经将 USDZ 导出 结合到 Xcode 的 SceneKit Editor 中 所以你可以通过命令直接导出 也可以通过一个 用户界面来实现 这就是工作流部分
现在我们看一下 USD 的功能 在介绍中 我们已经提到 有一个很大的功能集 这次讲演时间有限 甚至都不可能提到所有的功能
但是这里有几个重点概念 比较好理解 所以先讲解这些
我们会介绍四个概念 文件结构 场景图
网格数据 和材料 USD 的一个主要区别特征是 它的纯文本格式 是可读取 可理解的
所以格式就没有那么神秘 更加透明 发生错误时 你可以更快确定 哪儿错了 为什么错了
我首先介绍一下文件结构
它是 USDA 文件的一个片段 首先你会注意到 它包含的这些嵌套容器 在 USD 中 它们被称为 Prim
这些 Prim 包含属性 属性存储着真实数据 这里有一套元数据 关联到到文件级 Prim 级 或属性级 因为是嵌套结构 所以可以通过对象路径 访问每个对象 在这种情况下 “cube”这个 Prim 被嵌套在一个简单网格下 所以它的路径变成了 /simpleMesh/cube
你也可以用点标记 来为它附加属性
我们已经看过了基本的文件结构 接下来我们来看一下 如何使用它来存储场景数据 场景图定义对象层级
改变父类会影响它的子类 在这个例子中 我们有一个立方体 立方体是球体的父对象 如果你移动立方体 球体也会跟着移动 如果你移动球体 立方体不动 通过 USD 的嵌套 Prim 结构 场景图变得易于存储 你可以看到外层父 Prim 和两个子 Prim 立方体和球体 你也可以看到 这里有其他的 Prim 比如 材料 或者 并不属于场景图的动画
这就是场景图部分 现在我们来看一下网格数据 网格数据大致分为两类 第一类是网格属性 比如 位置 法线 和纹理坐标
第二类是网格连接 比如 每面的顶点数 或者哪些顶点索引属于这面 来看一个 四面体的简单例子 我们以一组点开始 四面体的四个点 每个面包含三个顶点 所以有四个三角 每个面我们也存储了 顶点索引 接下来存储法线 在这种情况下 我们选择 存储每个面的法线 所以是四条法线 每个面的属性 用 USD 的语言来说 就是统一 所以元数据设置为“uniform”
存储文本坐标也是这样的 它们被分为 索引 网格属性 索引是每面的 每个顶点的 用 USD 的语言来说是 “faceVarying” 最后我们要确保这个四面体 是一个多边形 而不是一个细分曲面 我们一会会回到这一点上 现在我们已经看过了场景图 网格数据 接下来看一下材料是如何被定义的
USD 的材料定义很丰富 用于输出电影画质的素材 对于真实的实时渲染 有一个更小的子集 叫作 UsdPreviewSurface 这是个基于实物材料的描述 支持两个数据流 金属粗糙度 和镜面粗糙度 这里我们会集中介绍 金属粗糙度 举个例子 我们刚才在 Chloe 的演示中 看到的留声机 我们先指定常量白色 接着 我们设置法线 最后遮蔽贴图 展现细节
接下来 我们提高它的金属度 它就会变得亮闪闪
我们再加一个粗糙度贴图 让对象的一些部分变暗 最后我们设置漫射色 和金属纹理 通过这五种纹理 这个网格最终变得 美观 逼真 我们来看一下 在 USD 中 它是如何被描述的 USD 用的是着色节点图 有分离的着色节点 彼此相关 UsdPreviewSurface 有一个非常简单的 着色节点图结构 只有 4 种节点类型
主着色节点 定义所有的 PBR 属性 刚才我们已经看到了其中五个
纹理采样器告诉你 要用哪个纹理 网格属性读取器 负责纹理坐标之类的属性 还有 UV 转换节点 让你可以改变或者旋转纹理坐标 我们来看一个最简单的例子 几个常量的例子 网格属性的常量
这里 你可以看到 主着色节点的表面输出 和材料表面输出是相连的
在 USD 中看起来是这样的 我们有外嵌套材料 Prim 里面包含主着色节点 Prim 着色节点输出和 材料的输出是相连的 用的是我们已经看过的对象路径
接下来 我们看一个 稍复杂一点的纹理的例子 这个纹理被指定给 diffuseColor 通道 我们需要一个网格属性读取器 来处理纹理坐标 也就是前面这个红色节点 我们想要应用的纹理样本 这是个橘色的 包含 diffuseColor 属性的 主 PBR 着色节点
在 USD 中看起来是这样的 我们再次有了外层的材料 Prim 和三个着色节点 输出和下一个着色节点的 一些输入相连 好 这就是 USD 的重点部分 我们刚才介绍的这些概念 都在“samples”文件夹里 我们用很少的样本脚本 这样你就可以 创建了场景图 网格数据 材料 和网格组 所以你可以分配 多个材料到单一网格 甚至是动画 用于变换动画 蒙皮和骨骼动画的动画
我们已经介绍了 USD 的基本结构 我们现在来看一下 它区别于其他格式的主要优点
可扩展性 复杂场景 静物构图 多人合作
对于可扩展性 我们会介绍细分曲面
合作方面 我们会介绍创作引擎 我们从细分曲面开始
细分曲面在表现曲面这方面 并不高效
相反 多边形表面描述 才趋近真正的曲面 这个趋近基于一些假设 比如 什么算是比较趋近 你想要成品和实物 有多么相似 与此相反 细分曲面描述真实的表面 所以你可以做一个动态细分 比如根据到相机的距离 用小的多边形 找到一个比较趋近真实物体的形状
细分曲面 同样适合动画内容 我们在过去的年里 一直使用细分曲面 比如 用它做 动话表情或拟我表情 在左手边你可以看到 用细分控制网格做出的 多边形表面是什么样子的 可以看出来 线条很美 从内存占用角度来说 这个表现堪称出色
右手边是 最后的细分表面 可以看到很漂亮的细节
细分曲面的 工业标准是 OpenSubdiv 也是 Pixar 开发的 为提供最适合我们平台的 金属着色器 我们和一直和 Pixar 密切合作 所以 GPU 发展得非常快 OpenSubdiv 是 Scenekit 里 细分曲面的基础 当然 USD 能很好地支持细分曲面 也适用于 OpenSubdiv
实际上 USD 既可以描述多边形网格数据 也可以描述细分曲面数据
它还可以特定于细分 支持细分特定属性 比如折痕或角
细分曲面这部分就结束了 它可以出色有效地 存储高质量表面 现在我们来看一下创作引擎
创作引擎一个 非常有用的创作工具 可以让美术师们有效合作 我们来看一个 引用的例子 我们再次拿出这个场景图 父节点下有两个子对象 只要那两个对象是不同的 这就是一个 有效的展示 但是如果你的场景图中 有一个对象的多个副本 怎么办 那么这个嵌套场景图结构 会变得没有效率 因为它会存储重复数据
大多数文件格式 都会分离重复数据 而存储引用 并且也使用支持集 但是不止如此
它还在这个 嵌套场景图 Prim 结构中 创建虚拟对象 每个虚拟对象 都有自己独立的对象路径 你就可以进入并重写它的内容 它的一些属性 比如 在这种情况下 我重写第二个球体的 材料颜色为黄色 又不会改变第一个球体的材料
你还可以把整个子树 从你的场景图中去除 USD 将所有这些编辑 存储为对原始数据的有效重写 现在我们看一下 这对美术师工作流有什么影响 这是 macOS Catalina 里的 访达
你可以看到这里 macOS 可以快速查看渲染场景的 USD 文件 现在假设我是一个布局美术师 将所有的这些对象 布局到场景中 同时还有一个美术师 负责渲染 其中一些对象 比如 这个椅子 这个美术师用这个椅子 替换了之前的那个
现在 如果你回到布局文件 你可以看到 这些对象已经自动被替换 文件没有改变 只是带入了引用 实际上 我可以自己编辑 比如 在不影响 其他美术师的文件的同时 改变颜色 这就分离了 我们的工作流
这就是对 USD 支持的 所有新美术师工作流的 简单讲解
在“samples”文件夹里 我们还有两个例子 比这些 USD 功能更高级
折痕的细分曲面 和重写引用
总结一下 我们已经 大致介绍了场景描述 它是一个文件类型 一个有用的库 用来编辑 所有展现 3D 内容的方式
我们介绍了用来创建素材 和将其转换为 USDZ 的工作流 我们介绍了一个新的工具 usdzconvert 它可以将 .obj .gltf .fbx 和其他文件格式 转换为 USDZ 你可以从我们的网站 下载这些 Python USDX 工具 包括 usdzconvert 一个预编译的 USD 库 和一些样本脚本
如果你想要了解更多信息 请查看讲演页面 明天下午 3 点我们还会有一个 USD 和 USDZ 的实验室 你还可以看一下 周五上午 9 点的《Advances in AR Quick Look》 谢谢 [掌声]
-
-
正在查找特定内容?在上方输入一个主题,就能直接跳转到相应的精彩内容。
提交你查询的内容时出现错误。请检查互联网连接,然后再试一次。