大多数浏览器和
Developer App 均支持流媒体播放。
-
探索 USD 工具和渲染
了解工具方面的最新改进,以帮助您生成、检查和转换通用场景描述 (USD) 素材。我们将介绍这些工具的更新,并帮助您将它们集成到您的内容创建管道。我们还将探索 USD Hydra 渲染功能,说明如何将其集成到您自己的 App。要进一步了解 USD,请观看 WWDC22 的“掌握 USD 基础知识”。
资源
- ASWF USD Working Group
- Creating a 3D application with Hydra rendering
- Introduction to Universal Scene Description (USD)
- USDZ schemas for AR
相关视频
WWDC22
WWDC21
WWDC20
-
下载
Stella: 大家好 欢迎参加今年的 WWDC 我是 Stella Alex: 我是 Alex Stella 和我一起在 Apple 进行了很多和 USD 有关的工作 今天 我们将和您一起探索 USD 工具的新升级和渲染 开始吧 Stella
Stella: USD是一种基础技术 它随着与内容创造工具的 不断发展和深入融合 使创造 asset 和内容的方式越来越多 为游戏 AR 电影和网页进行渲染 所有这些技术都以 USD 为中心 今天 我们将专注于生态的 两个部分 工具和渲染 让我们从 USD 工具的更新开始吧
然后 我们将向您展示 AR 快速查看里新的照明 如何使您的 asset 看起来更棒 深入探索 USD 渲染 最后 我们会向您展示 如何集成 Hydra
让我们先从 Apple 生态的 USD 工具开始吧
我们将谈及 USDZTools Reality Converter 然后跟进可以帮助您 创建 USDZ 内容的 额外的工具和框架
USDZ Tools 是一个 包含必要的命令行 USD Python 工具 以帮助您生成 验证 和检查 USDZ 文件的包 该包还包括一个 名为 uszconvert 的转换器 它可以把其他主要的 3D 文件格式 创建为 USDZ 文件
Python 脚本为自动化和 成批处理提供了强大的工具 此外 它们是您探索 USD 及学习如何使用 API 的 很好的方式 今年 我们将为您带来支持 Python 3 和 Apple 芯片的产品 我们还升级了 USD 版本 便于您使用 新的 USD 功能和性能改进
除此之外 我们还为 usdzconvert 添加了很棒的新功能 您现在可以使用 useObjMtl 标记 将有纹理的 OBJ 文件 转换为 USDZ 了 我们还为 GLTF 文件 添加了对点和线的支持 为 FBX 文件添加了 对动画的场景时间的支持 要想展示全部 usdzconvert 选项 及自定义您的转换方式 只要在终端键入 “usdzconvert --help” 即可
这会为您显示所有可用的 usdzconvert 选项 如添加版权信息
或为您的 3D 模型提供 diffuseColor 或 normalMap 以及更多 此外 如果您更倾向于在您的 工作流中使用 UI 编辑器
而非使用命令行 我们也有用 USDZ 工具搭建的 Reality Converter 并能提供和 usdzconvert 一样的功能 不过是在编辑窗口中展现 使在 MacOS 上转换 查看及自定义 USD 内容更加方便
只需导入常见的 3D 文件格式 如 OBJ 或 GLTF 或 FBX 即可查看转换后的 USDZ 结果 近几年 我们还优化了 UI 以简化您的工作流 您可以选择材质来查看更多信息
用您自己的纹理自定义材料性质
添加版权或编辑文件元数据
以及选择经典或新光照 这一点我们之后会在讲座中 详细讲到
您甚至可以通过内置选项 预览您的 USDZ 对象 在各种照明条件下的情况 并相应地调整曝光
在 asset 方面 我们添加了一个新功能 让您选择纹理质量 同时导出一个 USDZ 文件 默认情况下 纹理会被导出为 原始 未压缩的大小 但是 如果您倾向于 减小您的 USDZ 文件大小 您现在可以选择压缩纹理到 JPEG 格式
在本例中 我们使用对象捕获 以高分辨率扫描了
这个棋子 为了减少文件大小 而不丢失网格细节 我们使用了 RealityConverter 导出带有压缩纹理的模型 视觉上的差异很难被注意到 而我们得到了缩小了 80% 的文件
下面是更令人兴奋的消息 RealityConverter 现在可以自动修复 您的 USD asset 的问题了 它将纠正不匹配的属性和连接类型 修复具有多个顶级 prim 和一个缺失的默认 prim 的 stage 更新已弃用的属性 并添加缺失的 stage 元数据 我们还添加了通用二进制支持 所以现在它在 Apple 芯片上原生运行
现在 如果您想从头 开始创建 3D 模型呢
去年 我们推出了 Object Capture 作为 macOS 上的 RealityKit API 它提供了一种创新的方式 来创建 USDZ asset 然后 您就可以使用 Reality Composer 构成一个具有多个 asset 的场景 今年 我们为您带来了 RoomPlan API 它可以让您创建 您房间的参数化 3D 扫描 我强烈推荐您去看看这三个讲座 这些技术一起运作 使所有人都比以往任何时候 更容易创造沉浸式的 AR 体验 我们今天介绍的 所有这些工具都可以在 Apple 开发者网站上的 AR Creation Tools 页面上下载 快去看看吧 接下来 让我们看看 AR 快速查看的新照明吧 AR 快速查看是 iOS 上内置的 系统范围的 AR 查看器 它允许您在物理空间中 如桌子 墙壁或地板上 放置 3D USDZ 对象 并通过简单的触摸手势与它们交互 您甚至可以用 Reality Composer 制作交互式场景 并将它们保存到 USDZ 文件中 这样您就可以用 iMessage 邮件 备忘录 和其它方式与他人分享 我们不断努力使 AR 快速查看 渲染更逼真 今年 我们在 AR 快速查看中引入了 改进照明 它更明亮 有增强的对比度 和改善过的形状定义 会使您的 asset 看起来更好
下面是一个 AirPods Pro 在物体模式下的 经典和新照明的例子 AirPods Pro 在两种照明条件下 看起来都很棒 您会注意到新的照明选项 提供了更明亮的颜色 更高的对比度和更多的亮点
现在让我们把 AirPods Max 放在桌子上 用新的灯光在 AR 模式下 查看它 很惊人 不是吗
所以您该如何在 asset 中 应用新的照明呢 这很简单 您只需要通过在您的 USDZ 文件中 设置新的 preferredIblVersion 元数据 来选择最适合您的内容的照明
在这里 我们已经将 preferredIblVersion 的值设置为 2 这将指示 AR 快速查看 使用新的照明系统
让我们从更细节处理解它 preferredIBLVersion 元数据 可以包含 0 1 和 2 的值
当 asset 的 preferredIblVersion 设置为 0 时 将使用系统默认照明 如果设置为 1 它将继续使用经典照明
如果值为 2 将会使用新照明
这意味着您也可以轻松地 将您的当前 asset 更新到 新的照明 我们建议您做出明确的选择 并在所有 asset 中 设置此元数据 为此 您可以使用带有 preferrediblversion 标志的 usdzconvert 例如 下面是如何使用标志 将消防栓 OBJ 文件转换为 用新照明的 USDZ 或者您可以使用 Reality Converter 它现在默认使用新照明 但是如果您想使用经典照明 在属性面板中有一个新的选项
在这里 我们能预览经典和 新照明下的 AirPods Max asset
这提供了一种比较差异的简单方法
通过点击照明图标 应用的照明也会 被突出显示 供您参考
最后 对于没有此元数据的 asset AR 快速查看将根据文件的 日期-时间戳自动确定照明版本
如果该 asset 是在 2022 年 7 月 1 日 之后创建的 它将使用新照明
更早的 asset 将继续使用经典照明 这样它们的外观就不会改变
现在 我会把话题交给 Alex 聊一聊 USD 渲染 谢谢您 Stella 我们今天已经看到了很多 渲染过的 USD 现在 我们将探索是什么 使 USD 渲染和 Hydra 成为了 您 3D 内容创建途径的 一个绝佳选择 以及您该如何将它 集成到您自己的 App 中
首先 让我们后退一步 总体讨论一下渲染
渲染器会将 3D 模型 相机和灯光的集合作为输入 并使用它们生成图像 渲染器有许多 它们中的每一个 都是为特定目的而构建的 并针对不同的用例进行了优化
有些渲染器是为 实时 App 设计的 比如渲染游戏中的角色 或 AR 场景 另一些则需要更长的时间 但能产生更逼真的图像 例如 为好莱坞电影制作视觉效果
所有渲染器都会对其功能做出选择 并且都是独一无二的
Apple 平台上 也存在针对不同用例的 不同 USD 渲染器 我们在 developer.apple.com 上 添加了关于这些 不同渲染器的文档 它将帮助您理解它们之间的差异 解释它们支持哪些 USD 功能 并为您提供如何编写最适合您的 USD 的指导
Apple 平台上的渲染器之一 是 RealityKit 它具有逼真的渲染系统 为交互式增强现实体验进行了优化 并被用于 AR 快速查看 它是 USDZ 文件的主要渲染器 在 macOS 上使用 USD 渲染的 另一个选择是皮克斯的开源渲染器 Storm 它针对生产级 asset 进行优化设计 被用于大型场景的实时预览
这是一种很好的技术 可以让您在内容创建途径中 可视化和迭代 asset Storm 使用了一种叫做 Hydra 的技术 Hydra 是 USD 开源项目的核心方面 接下来 让我们来了解一下 Hydra 和 Storm 之间的联系 我们从之前的这个图表开始 这里 我们使用 Storm 作为渲染器
输入通常被称为 “场景图” Storm 会生成它的渲染预览
但是 如果您想使用不同的渲染器 生成相同场景的逼真图像呢
这正是 Hydra 存在的意义 Hydra 并没有将场景与渲染器 紧密耦合 而是充当了 场景与渲染器之间的抽象层 将数据从场景传输到渲染器
这允许您在任何时候 根据您的需要 轻松切换渲染器 而不需要改变您的场景图 例如 您可以使用 Storm 和皮克斯的 RenderMan
在您的内容创建途径中 您可以使用 Storm 快速渲染 快速迭代 然后在准备好后 切换到 RenderMan 来生成最终的图像 对场景图也是如此 您对 Hydra 的输入可以是 USD 场景图 也可以是不同的
这允许您在多个 App 中 使用相同的渲染器 即使每个 App 都有自己完全不同的场景图 连接 Hydra 与场景图 和渲染器的接口 被称为委托 场景图通过场景委托 连接到 Hydra 渲染器通过渲染委托 连接到 Hydra 这就是您的 Hydra Foundry's Nuke 13 已经在用 Hydra 渲染视口了 这使 macOS 上的 Nuke 设计师 有更高质的体验 并与用 Nuke 的 3D 系统的设计师 有互动体验
这是通过使用 Hydra 与自定义场景委托 和 Metal-accelerated Storm 实现的
我们要很高兴地告诉大家 我们已经与皮克斯动画工作室合作 公开发行 Metal accelerated Storm 的开源版本 您可以在 USD 22.05 中使用它 现在我们已经看到了 Hydra 的力量 让我们看一个有着 USD 场景图 用 Storm 作为渲染器的 典型用例的 Hydra 示例 App 它将让您能开始使用 Hydra 构建内容创建工具 和 3D 工作流 App 我们的示例 App HydraPlayer 非常简单但功能强大 它用 Storm 渲染了一个 USD 文件 让我们能在它周围移动相机
我们很高兴能让 HydraPlayer 成为一个公共样本项目 让您马上开始使用 它可以在会话资源中找到 并在自述文件中提供了完整的说明
我鼓励开发者现在暂停这个视频 下载这个项目 然后跟着我们一起看
在您的 Xcode 项目中 您会发现 4 个类 AppDelegate 相机 渲染器 和 View Controller AppDelegate 基本上 就是您的根对象 会管理与系统的交互 相机类是 USD 场景摄像机的 一个简单表示 以便于转换用户输入 渲染器类将处理我们 与 USD 和 Hydra 的所有交互
最后 ViewController 会处理我们的用户输入 在我们构建 启动 HydraPlayer 之前 有三件事要做
准备环境 在搭载 Apple 芯片的 Mac 上使用 Rosetta 以及下载并构建 USD & Hydra 那么就让我们开始吧
首先 我们要准备开发环境 确保您已经安装了 Xcode Python 和 CMake
现在 让我们打开一个终端 来进行其他两个步骤
如果您使用的是搭载 Apple 芯片的 Mac 那么您需要在 Rosetta 下运行 而 USD 正在过渡到完全支持 arm64 为此 使用 arch 命令
一旦您的环境准备好了 我们就必须下载 USD 和 Hydra 源代码 两者都在同一个 GitHub 存储库 PixarAnimationStudios/USD 中 现在我们有了代码 就可以构建它了 USD 自带一个方便的 Python 构建脚本 我们添加标志 “generator Xcode” 和 “no-python” 并指定我们想要安装 USD 的位置 让我们把它放在源代码 “USDInstall” 旁边 一旦 USD 完成建设 我们就准备好建立 HydraPlayer 了 让我们再次回到这个图表 并使用它来确定 HydraPlayer 的 关键部分 以详细检查 我们要看看如何加载 3D 模型 如何设置相机 以及设置场景灯光 然后我们将学习 如何得到我们的场景图传到 Storm 最后 如何制作一个应用窗口的图像
所以让我们从由 USD 加载我们的 3D 模型开始 在 ViewController 的 viewDidAppear 中 当视图第一次出现时 我们要用一个 NSOpenPanel 创建一个文件选择器
一旦选择了一个文件 渲染器就可以开始 设置我们的场景并加载 USD 文件
使用 USD API 加载文件非常简单 我们只需在文件路径上打开 USD 阶段
就是这样 我们的文件加载完成了
接下来 我们要设置相机 在我们的代码中 这很直接 我们首先要在 setupCamera 中 创建一个新的场景摄像机
然后 我们要根据场景 计算世界的大小和中心 接下来 移动我们的相机 至一个良好的距离 然后聚焦在中心 这样 我们的相机 就能捕捉到整个场景
太好了 现在我们的相机就设置好了 接下来 灯光 我们让它保持简单 创建一个简单的环境光 并将它的位置设置成与相机匹配 就这样 这样 我们就有了 有着3D 模型 相机和灯光的完整场景 现在我们可以把场景交给 Storm 了 首先 我们需要初始化渲染引擎 在这里 我们创建了一个新的 UsdImagingGLEngine 它是 Storm 的类名 这里最重要的参数是 rootPath 它将引擎指向我们 包含 3D 模型的 USD stage 要深入了解其他参数和 UsdImagingGLEngine 请查看皮克斯的 USD API 文档
接下来 要在引擎中设置 我们的摄像机 并设置光线设置 最后 我们要通过设置渲染参数 来定义我们想要 Storm 渲染的方式 例如 当我们想要 渲染一个透明的背景 以便渲染后的图像 与我们应用的配色方案好好配合时 这对于带有动画的场景很重要 因为这也是我们指定时间代码的地方
现在我们准备好渲染图像了
我们已经完成了所有必要的设置 因此渲染命令只有一行代码 我们获得结果并将其显示在窗口中 然后就完成了 我们正在渲染 USD 玩具飞机 实际上 我们在渲染的 不仅仅是一个飞机 HydraPlayer 可以轻松地 用数千万个三角形 渲染数千个动画 asset
如果您还没有这么做 请查看本讲座的资源 下载示例项目 并享受进一步探索它的乐趣
我们一起探索了 Apple 的 USD 工具的更新 它们使这些工具更强大 也使您的 asset 看起来更棒 Stella: 我们了解了 Hydra 的功能 并浏览了 HydraPlayer 示例项目 看到了如何将其集成到 自己的 App 中
要了解更多关于 USD 的重要概念 请查看讲座 “Understand USD fundamentals”
谢谢
-
-
3:00 - Phyton usdconvert --help
% python usdzconvert --help usdzconvert 0.66 usage: usdzconvert inputFile [outputFile] [-h] [-version] [-f file] [-v] [-path path[+path2[...]]] [-url url] [-copyright copyright] [-copytextures] [-metersPerUnit value] // ... [-diffuseColor r,g,b] [-diffuseColor <file> fr,fg,fb] [-normal x,y,z] [-normal <file> fx,fy,fz] // ...
-
9:00 - choosing lighting in usda metadata
// asset.usda #usda 1.0 ( customLayerData = { dictionary Apple = { int preferredIblVersion = 2 } } )
-
17:50 - Build USD + Hydra
// Rosetta % arch -x86_64 /bin/zsh // Download source code % git clone https://github.com/PixarAnimationStudios/USD.git // Build USD + Hydra % python3 USD/build_scripts/build_usd.py --generator Xcode --no-python USDInstall
-
18:54 - Load USD ViewController
// AAPLViewController.mm - (void)viewDidAppear { NSOpenPanel* panel = [NSOpenPanel openPanel]; panel.allowedContentTypes = @[UTTypeUSD, UTTypeUSDZ]; [panel beginWithCompletionHandler:^(NSModalResponse result) { if (result == NSModalResponseOK) { NSURL* url = panel.URLs[0]; [self->_renderer setupScene:[url path]]; } }]; } // AAPLRenderer.mm - (bool)loadStage:(NSString*)filePath { _stage = UsdStage::Open([filePath UTF8String]); // ... }
-
19:30 - Create Scene Camera
// AAPLRenderer.mm - (void)setupCamera { _viewCamera = [[AAPLCamera alloc] initWithRenderer:self]; [self calculateWorldCenterAndSize]; [_viewCamera setDistance:_worldSize]; [_viewCamera setFocus:_worldCenter]; }
-
19:54 - Create Scene Light
// AAPLRenderer.mm GlfSimpleLight computeCameraLight(const GfMatrix4d& cameraTransform) { GlfSimpleLight light; light.SetPosition(GfVec4f(cameraPosition[0], cameraPosition[1], cameraPosition[2], 1)); return light; }
-
20:17 - transport to storm
// AAPLRenderer.mm - (void)initializeEngine { _engine.reset(new UsdImagingGLEngine(_stage->GetPseudoRoot().GetPath(), excludedPaths, SdfPathVector(), SdfPath::AbsoluteRootPath(), driver)); } // AAPLRenderer.mm - (HgiTextureHandle)drawWithHydraAt:(double)timeCode viewSize:(CGSize)viewSize { _engine->SetCameraState(modelViewMatrix, projMatrix); _engine->SetLightingState(lights, _material, _sceneAmbient); UsdImagingGLRenderParams params; params.clearColor = GfVec4f(0.0f, 0.0f, 0.0f, 0.0f); params.frame = timeCode; // ... }
-
-
正在查找特定内容?在上方输入一个主题,就能直接跳转到相应的精彩内容。
提交你查询的内容时出现错误。请检查互联网连接,然后再试一次。