大多数浏览器和
Developer App 均支持流媒体播放。
-
升级 ARKit App, 纵享空间体验
了解如何为 VisionOS 带来你的 App 的 AR 体验。了解 ARKit 和 RealityKit 在空间计算方面的更新:我们将重点介绍来自 iPadOS 和 iOS 的概念和 API 的变化,并引导你观看包含更多详细信息的课程,帮助你为此平台带来 AR 体验。
资源
相关视频
WWDC23
-
下载
♪ 悦耳的器乐嘻哈 ♪ ♪ Omid Khalili: 大家好!我是 Omid Oliver 和我 是 ARKit 团队的工程师 很高兴能够跟大家一起回顾这些 熟悉的以及全新的概念 当你将 iOS AR App 加入到我们的新平台时 你都需要了解这些概念 ARKit 于 2017 年引入 iOS 通过它 我们引入了构建 增强现实 App 的 三个关键概念 通过世界追踪 ARKit 能够以 6 个自由度 跟踪你的设备在世界上 任何角落的位置 这样就能将虚拟内容与现实世界的 位置和方向对应起来 场景理解让你能拥有 对周围真实世界的洞察力 通过我们提供的几何和语义知识 你的内容可以获得智能放置 并与周围环境进行现实互动 最后 渲染引擎可以利用 ARKit 提供的 相机变换和内在因素 在捕获的图像上 正确注册并合成你的虚拟内容 最初 我们从一个 SceneKit 视图开始 使用 ARKit 的相机变换 并在 iOS 上渲染 3D 内容 然后 我们引入了 RealityKit 为能够进行高度逼真的 基于物理的渲染 以及与环境进行精确的 物体模拟的引擎奠定基础 为了实现空间计算 ARKit 和 RealityKit 已经发展成熟 并深度集成到操作系统中 例如 ARKit 的跟踪和场景理解 现在作为系统服务运行 支持从窗口位置 到空间音频的所有内容 系统承担了 曾经属于 App 的职责 相机穿透和用户手部抠图 现在已内置 因此你的 App 可以 免费使用这些功能 另一个内置功能是 ARKit 的世界地图 已改为由系统服务持续提供 所以 你的 App 不需要再做这项工作了 我们相信 这将能减少你的工作量 让你专注于为这个平台 构建最好的 App 和内容 下面我将通过一个示例 演示上述功能 并介绍平台加入的新功能 例如 现在 ARKit 为你的 App 提供了手部跟踪 让用户伸手就能 直接与虚拟内容进行交互 这些虚拟内容又同时可以 与其周围环境进行交互 为充分利用这个新平台 提供的所有新功能 和沉浸式体验 你需要更新基于 iOS ARKit 的体验 在空间计算方面 这是重新构思 你的 App 和 AR 体验的良好机会 作为过渡的一部分 你将会用到 我们引入的 ARKit 和 RealityKit 的熟悉概念 我们将介绍这些概念 是如何传承下来的、 是如何演变的 以及如何使用这些概念 让我们开始吧! 首先 我们将探索 一些用于呈现 App 的 空间计算的新方法 并介绍可用的新内容工具 接下来 我们将讨论 RealityKit 这是一款用于渲染 并与内容交互的引擎 我们将看到通过 RealityView 你的 App 将如何利用空间计算 这与 iOS 上的 ARView 类似 然后 我们会讨论 App 将内容带入 用户周围环境的不同方式 光线投射是许多 iOS App 用来放置内容的技术 我们将通过一个示例 展示如何通过 ARKit 数据和 RealityKit 的结合 来实现空间计算的光线投射 最后 我们将回顾 ARKit 的更新 并了解使用 iOS 中的 熟悉概念的新方法 现在 我们开始准备迁移 你的空间计算体验 有了空间计算 你就可以将 iOS AR 体验 扩展到窗口之外 这个平台提供了展示 App 的新方式 当你将的 iOS 体验迁移过来时 相信你会喜欢这些方式的 这是我们的 Hello World 示例 App 中的一个例子 现在 你可以 在你周围的任何地方显示 UI 包括窗口和三维内容 默认情况下 这个平台上的 App 会启动到共享空间 在共享空间中 App 会并排排列在一起 与并排存放多个 App 的 Mac 桌面很像 在共享空间中 你的 App 可以 打开一个或多个窗口 来显示内容 此外 你的 App 可以创建一个 三维容积 例如 你现在可以在一个窗口中 显示可用的桌游列表 在另一个窗口中显示规则 并在该三维容积中打开所选游戏 游戏可以在打开 Safari 浏览器窗口的同时 进行游玩并阅读游戏攻略 添加到窗口和容积的内容 应保持在其可容纳范围内 以便与其他 App 共享空间 在某些情况下 你可能 希望 App 能够更好地 控制体验中的沉浸程度 比如 要玩一个与你的房间 互动的游戏 为此 你的 App 可以 打开一个专用的 Full Space 其中只显示 App 的窗口、 容积和 3D 对象 进入一个 Full Space 后 你的 App 就可以访问更多的功能 使用 RealityKit 的锚实体 可以定位并将物体连接到周围环境 比如桌子、地板 甚至手掌或手腕等手部位置 锚实体无需用户许可即可工作 ARKit 数据则不同 你的 App 只能在 Full Space 中 访问此类数据 在获得许可的情况下 ARKit 将提供 关于现实世界表面、场景几何 和手部骨骼追踪的数据 从而扩展 App 的现实物理 和自然交互的能力 窗口、容积和空间 都是 SwiftUI 场景类型 关于这些内容 还有 很多东西等着你去了解 对于初学者 你可以观看 此处提到的两个讲座 接下来 让我们回顾一下 要将内容引入空间计算 需准备的主要步骤 iOS 上令人难忘的 AR 体验 始于出色的 3D 内容 这个平台上的空间体验也是如此 当涉及到 3D 内容时 最好依赖于 通用场景描述 (简称 USD) 等开放标准 USD 是经过投产验证的 范围涵盖制作单一资源的创作者 以及制作 AAA 游戏 和电影的大型工作室 Apple 很早就开始使用 USD 2017 年就已将其 添加到我们的平台 并自此不断增加支持 如今 USD 已成为 空间计算 3D 内容的核心 准备好 USD 资源后 你就可以将其导入到 我们的新开发工具 Reality Composer Pro 开始制作、编辑和预览 3D 内容 如果你在 iOS 上为 3D 内容 使用自定义材料 那么 你需要使用新工具内的 Shader Graph 重新构建相关资源 你还可以直接通过 UI 来编辑 RealityKit 组件 最后 你可以直接将 Reality Composer Pro 项目 导入到 Xcode 中 这样 你就能轻松地 将所有的 USD 资源、材料 和自定义组件打包到 你的 Xcode 项目中 我们还提供了一些不错的讲座 可以帮助你进一步了解 Reality Composer Pro 以及如何构建你自己的 空间计算自定义材料 现在 我们已经了解了 呈现 App 的不同方法 接下来 我们继续了解 在你将原有经验迁移过来时 RealityView 能够提供的各种功能 我们刚刚看到了空间计算 如何让 App 在你的空间中显示内容 它与 iOS 的关键区别之一是 不同元素并排显示的方式 请注意 3D 内容 和 2D 元素是如何 同时呈现和运作的 由于来自 iOS 你可以使用 熟悉的框架来创建这些内容 你还可以使用 SwiftUI 来构建最好的 2D UI 并获取类似 iOS 上的系统手势事件 可以使用 RealityKit 来渲染 3D 内容 从而获得空间体验 同时与这两者交互的方法是 借助 RealityView 这是为满足空间计算的独特需求 我们正在引入的一种 新的 SwiftUI 视图 RealityView 真正将 SwiftUI 和 RealityKit 结合起来 让你能够结合 2D 和 3D 元素 创造令人难忘的空间体验 你还可以使用 RealityView 来容纳所有 想要呈现和交互的实体 可以获取手势事件 并通过将其 连接到视图中实体来进行控制 通过访问 ARKit 的场景理解 你可以使用 RealityKit 的碰撞组件 来对用户周围的环境 甚至他们的手部 进行逼真的模拟 在我们了解如何使用 iOS 上的 RealityKit 之前 让我们快速回顾一下 如何使用 RealityKit 的 实体组件系统 (ECS) 在 Reality Kit 实体组件系统中 每个实体都是 3D 内容的容器 不同的组件被添加到一个实体中 用于定义其外观和行为 其中可以包括一个模型组件 用来定义实体的渲染方式; 还可包括一个碰撞组件 用于定义实体与其他实体碰撞的方式 等等各类组件 你还可以使用 RealityComposer Pro 来准备 RealityKit 组件 如碰撞组件 还可以将它们添加到你的实体中 系统包含操作具有所需组件的 实体的代码 例如 支持手势所需的系统 只对具有 CollisionComponent 和 InputTargetComponent 的 实体进行操作 RealityView 用于空间计算的许多概念 都是从 iOS 上的 ARView 继承而来 让我们看看这两者是如何结合的 这两个视图都是事件感知的容器 用于保存你希望 在 App 中显示的实体 你可以在视图中添加手势支持 从而启用选择并与实体交互 使用 SwiftUI 进行空间计算时 可以伸手点击或拖动你的实体 ARView 和 RealityView 都提供实体集合的服务 ARView 为此使用了一个 Scene 而 RealityView 有一个 用于添加实体的 Content 你可以向其中添加 AnchorEntity 让你能够将内容锚定到现实世界 在这两个平台上 你可以创建一个实体 来加载你的内容模型 并创建一个 AnchorEntity 来放置该实体 各平台之间的一个主要区别 是锚实体的行为 iOS 上的 ARView 使用 ARSession 你的 App 必须获得许可 才能运行锚实体工作 所需的场景理解算法 RealityView 正在使用系统服务 来启用锚实体 这意味着空间体验 无需获取权限 就可以将内容 锚定到周围环境中 使用此方法的 App 不会收到 底层场景理解数据 或转换数据 如果 App 没有 用于放置内容的转换数据 Oliver 将在后面的部分 讨论这个问题 正如我们所见 RealityKit 中 有许多来自 iOS 的熟悉概念 但也有一些空间计算方面的 全新功能 在这个新平台上 我们才刚刚触及了 RealityKit 强大功能 的冰山一角 若想了解更多 不如听听下面的内容吧 有请 Oliver 他将详细介绍 RealityView 以及如何从 iOS 中导入内容 Oliver Dunkley:谢谢你 Omid! 让我们继续探索将现有内容 导入空间计算的 不同方法 先从共享空间开始吧 我们可以向窗口或 容积中添加 3D 内容 并使用系统手势与之交互 要想打开你的资源 只需直接将其添加到 RealityView 的内容中 你可以通过创建一个实体 来容纳你的模型组件 并通过设置变换组件来进行定位 还可以设置手势支持 来修改转换组件 请注意 添加到视图内容中的所有实体 都存在于相对于 空间原点的相同空间中 并因此可以彼此交互 在共享空间里 内容无法锚定到你的周围环境 如果想将 App 转换到一个 Full Space 中 那就要想想该怎么做了 共享空间的一个关键区别是 App 现在可以额外锚定 用户周围的内容 将内容锚定在共享空间中 有两种办法 我们先来了解 在无需获取使用 App 内的 ARKit 数据的权限时 如何使用 RealityKit 的 AnchorEntity 来放置内容 RealityKit 的 AnchorEntity 让你可以指定系统查找的目标 并自动锚定你的内容 例如 要想将一个 3D 模型 放在你面前的桌面上 可以使用 RealityKit 的 AnchorEntity 将目标位置设置在桌面上 与 iOS 不同的是 AnchorEntity 可以在不提示 用户权限的情况下使用 这种方法不与你的 App 共享 AnchorEntity 的底层转换 可以保护用户的隐私 请注意:这意味着不同锚实体的 子实体彼此没有联系 对于 AnchorEntity 来说 你可以以手为目标 这开辟了一个全新且有趣的 交互机会领域 例如 你可以将内容 锚定到一个人的手掌上 并让内容随着他们的手而移动 这都是由系统完成的 你并不需要告诉 App 人手的实际位置 AnchorEntity 提供了一种快速、 尊重隐私的方式 让你的 App 将内容锚定到用户周围的环境 回到 Full Space 我们还可以利用 ARKit 来整合形成 用户对周围环境的系统知识体系 这让你能够 构建自己的自定义放置逻辑 让我们看看这是如何实现的 与 iOS 类似 你的 App 会接收 场景理解数据的锚定更新 你可以将这些锚点数据 集成到你的 App 逻辑中 从而实现各种奇妙的体验 例如 你可以使用平面的边界 来集中和分散内容 也可以使用平面及其分类 通过寻找两面墙和地板的交叉点 来确定房间的角落 决定放置内容的位置后 你就可以为 ARKit 添加 一个世界锚来进行追踪 并使用它来更新实体的转换组件 这不仅可以让你的内容 在底层世界地图更新时 保持锚定到现实世界 而且还提供了锚定持久性 我们会在稍后探讨这一点 所有添加到你的空间中的实体 可以相互交互 也可以 与周围环境进行交互 这一切之所以能实现 是因为场景理解锚点 是通过相对于空间原点的 转换来传递的 而使用 ARKit 功能 需要获取用户许可 刚刚我们介绍了如何将 ARKit 数据 集成到 App 逻辑中 从而启用更高级的功能 现在 我们已经介绍了 如何让 App 放置内容 接下来 我们来了解一下 如何引导放置 在 iOS 上 你可以使用光线投射 将 2D 输入转换为 3D 位置 但在这个新平台上 我们不再需要这个 2D-3D 桥了 因为我们可以用手 直接自然地进行互动 但光线投射依然强大 它让用户能够触及手臂之外的位置 设置光线投射的方法有很多种 从根本上说 你需要设置 RealityKit 的 碰撞组件来进行光线投射 碰撞组件也可以 由 ARKit 的网格锚点创建 以光线投射到用户周围的环境 让我们通过两个示例来了解 如何进行光线投射空间计算: 第一个是使用系统手势 第二个是使用手部数据 在获取位置后 我们可以放置一个 ARKit worldAnchor 以便让我们的内容保持锚定 来看看下面的示例 假设 App 的主要目的 是为建模者放置精美的 3D 资源 也许在这个特定的场景中 有人想使用我们的 App 在他们的工作台上放置一艘 用于某个建模项目的虚拟飞船 这就是我们想要放置飞船的工作台 我们从一个空的 RealityView 开始 ARKit 的场景理解 提供了网格锚点 我们将用它来代表周围环境 这些锚点提供了 我们可以使用的几何和语义信息 请记住 场景重建数据的网格 是作为一系列的块交付的 我们将创建一个实体 来代表这个网格块 我们将正确地使用网格锚点的转换 将这个实体放在一个完整空间中 然后 我们的实体需要一个碰撞组件 来进行测试 我们将使用 RealityKit 的 ShapeResources 方法 从 meshAnchor 为我们的实体 生成一个碰撞形状 然后 我们将添加支持命中测试的 正确放置实体 我们将为每个接收到的网格块 构建一个实体和碰撞组件 用于表示所有周围环境 随着场景重建的细化 我们可能会更新网格或删除块 我们也应该做好 对实体更新这些更改的准备 我们现在有了 代表周围环境的实体集合 所有这些实体都有碰撞组件 并且可以支持光线投射测试 我们先来探索一下 使用系统手势的光线投射 然后使用手部数据再次尝试 我们可以进行光线投射 并使用系统手势获得 放置飞船的位置 手势只能与同时具有 Collision 和 InputTarget 组件的实体交互 所以 我们为每个网格实体 都添加一个相关组件 通过在 RealityView 中添加 SpatialTapGesture 用户可以通过查看实体 和点击来进行光线投射 由此产生的事件在世界空间中 具有代表用户轻点时 所看地方的位置 如果不使用系统手势 还可以使用 ARKit 的手部锚点 来构建射线 让我们退一步 探索一下这个选项 要想知道用户指向哪里 我们需要先想办法表示一个人的手 ARKit 的新型手部锚点 正好能满足我们的需求 我们可以使用手指关节信息 来为我们的查询 构建射线的原点和方向 有了光线的来源和方向 我们就可以对场景中的实体 进行光线投射 产生的 CollisionCastHit 提供了被射中的实体 以及它的位置和表面法线 确定了放置内容的位置后 我们就可以为 ARKit 添加一个世界锚点 来持续跟踪这个位置 当世界地图被细化时 ARKit 将更新 这个世界锚点的转换 我们可以创建一个新实体 来写入飞船模型 并通过更新世界锚点 来设置它的转换 将其放置在用户想要的位置 最后 我们可以 将实体添加到内容中 以便在工作台上对其进行渲染 每当 ARKit 更新 添加的世界锚点时 我们都会更新船实体的 transform 组件 确保其与现实世界保持锚定 完成了! 我们用手指向周围的一个位置 并将内容放置在那里 光线投射不仅适用于放置内容 还适用于与内容交互 我们来看看 如何对虚拟飞船进行光线投射 RealityKit 的碰撞组件非常强大 我们只需要添加适当的 碰撞组件来让船实体参与碰撞 而 Reality Composer Pro 可以帮助我们做到这一点 启用飞船的碰撞组件 并根据最新的手部关节位置 构建新的光线后 我们可以再次进行光线投射 判断用户是指着船还是桌子 通过前面的示例可以看出 将 RealityKit 的强大功能 与 ARKit 的场景理解相结合 能够打造 真正令人惊叹的体验 我们来看看使用 ARKit 给空间计算带来了哪些变化 从根本上说 和在 iOS 上一样 ARKit 仍然通过运行会话 来接收锚点更新 但在这个新的平台上 你配置和运行会话、 接收锚点更新和保持世界锚点的方式 都已经发生了变化 一起看看吧! 在 iOS 上 ARKit 有不同的配置可供选择 每个配置都包含了 你的体验所必需的功能 例如 在这里 我们选择了 ARWorldTrackingConfiguration 并将为网格启用 sceneReconstruction 为平面启用 planeDetection 然后 我们就可以创建 ARSession 并使用选定的配置进行运行 在这个新平台上 ARKit 现在 为每个场景的理解功能 配置了一个数据提供端 手部追踪是 ARKit 提供的一项新功能 并且也拥有自己的数据提供者 每个数据提供者的初始化定式 都需要配置 该提供者实例所需的参数 现在 你不再需要 从预设的配置目录中进行选择 而是可以在大量选项中 选择 App 所需的提供者 例如 在这里 我们选择一个 SceneReconstructionProvider 来接收网格锚点 并选择一个 PlaneDetectionProvider 来接收平面锚点 我们创建提供者 并初始化我们希望接收的 网格分类和平面类型 然后 我们创建一个 ARKitSession 并通过实例化的提供者来运行它 现在 我们已经了解了 如何简化会话配置 下面介绍 这些新的数据提供者 将如何改变 App 实际接收 ARKit 数据的方式 在 iOS 上 单个委托 会接收锚点和帧的更新 锚点被聚合 并与 ARFrames 一起交付 以保持相机框架和锚点同步 App 负责显示相机的 像素缓冲区 并使用相机转换 来注册和渲染跟踪的虚拟内容 网格锚点 和平面锚点作为基础锚交付 这就需要你去区分它们 分清哪个是哪个 而在我们的新平台上 是由数据提供者负责锚点更新 这是我们之前配置的提供者 运行 ARKitSession 后 每个提供者都会立即开始 异步发布锚点更新 SceneReconstructionProvider 提供了 meshAnchor planeDetectionProvider 为我们提供了 PlaneAnchor 完全不需要人工辨别! 锚点更新一旦可用 就会立即进行 并且与其他数据提供者的更新解耦 值得注意的是 不再提供 ARFrame 空间计算 App 不需要通过帧或相机数据 来显示内容 因为这项工作 现在全部由系统自动完成 你不需要将锚点更新 打包到 ARFrame 中 ARKit 现在可以随时交付更新 减少反应时间 让你的 App 对周围环境中的更新快速做出反应 接下来 我们来了解一下 worldAnchor 的持久化 你一定会喜欢这些变化! 在光线投射示例中 我们使用世界锚点 来放置虚拟内容并将其锚定 到现实世界的位置 你的 App 可以持久化这些锚点 使其能够在设备返回相同环境时 自动再次接收它们 我们先快速回顾一下持久化 在 iOS 上的工作原理 在 iOS 上 App 负责处理 世界地图和锚点持久化 这包括请求 并保存 ARKit 的世界地图 与添加的锚点、 添加逻辑 以便在正确的时间 重新加载正确的世界地图 然后在接收之前的持久锚点 并继续 App 体验之前 等待重新定位完成 在这个新的平台上 系统在后台 持续地持久化世界地图 随着用户的移动 无缝地加载、卸载、 创建和重新定位到现有地图 你的 App 不再需要处理地图 系统现在会直接代你处理! 你只需专注于使用世界锚点 来持久化虚拟内容的位置 放置内容时 你将使用新的 WorldTrackingProvider 将 WorldAnchors 添加到世界地图 系统会自动为你保存这些内容 WorldTrackingProvider 将更新这些世界锚点的 跟踪状态和转换 你可以使用 WorldAnchor 标识符 来加载或卸载相应的虚拟内容 我们刚才重点介绍了你从 iOS 中 了解的 ARKit 原则有哪些更新 但还有更多内容值得探索! 要想配合代码示例 更深入的了解 我们建议你观看 “了解用于空间计算的 ARKit” 让我们来总结一下本次讲座的内容! 在本次讲座中 我们深入了解了 ARKit 和 RealityKit 的概念 是如何从 iOS 演变而来的、 你需要了解哪些改变 以及可以观看哪些讲座 来了解更多细节 这个平台承担了你的 iOS App 必须处理的许多任务 让你能够真正专注于使用 已经熟悉的框架和概念 来构建出色的内容和体验 我们无比期待看到你利用空间计算 和其他强大的功能来改进你的 App! 感谢你的观看! ♪
-
-
正在查找特定内容?在上方输入一个主题,就能直接跳转到相应的精彩内容。
提交你查询的内容时出现错误。请检查互联网连接,然后再试一次。