View in English

  • 打开菜单 关闭菜单
  • Apple Developer
搜索
关闭搜索
  • Apple Developer
  • 新闻
  • 探索
  • 设计
  • 开发
  • 分发
  • 支持
  • 账户
在“”范围内搜索。

快捷链接

5 快捷链接

视频

打开菜单 关闭菜单
  • 专题
  • 相关主题
  • 所有视频
  • 关于

返回 WWDC25

  • 简介
  • 概要
  • 转写文稿
  • 代码
  • 探索 visionOS 上的空间配件输入

    了解如何将空间配件整合到你的 App 中。展示虚拟内容、与 App 进行交互、在空间中进行追踪,并获取有关交互效果的信息,进一步提升 visionOS 上的虚拟体验。

    章节

    • 0:00 - 开场
    • 2:41 - 构建雕塑 App
    • 13:37 - 使用 ARKit 追踪配件
    • 14:45 - 设计注意事项

    资源

    • Tracking a handheld accessory as a virtual sculpting tool
      • 高清视频
      • 标清视频

    相关视频

    WWDC25

    • RealityKit 的新功能

    WWDC24

    • 使用 ARKit 打造更出色的空间计算体验
    • 使用 RealityKit 构建空间绘画 App

    WWDC21

    • 利用虚拟和物理游戏手柄

    WWDC20

    • 游戏控制器的进展
  • 搜索此视频…

    大家好! 我是 Amanda Han 是 RealityKit 团队的工程师 在本次讲座中 我将介绍 如何利用新的空间配件支持 为 visionOS 构建空间雕塑 App visionOS 采用了以眼动和 手部输入为首要交互方式的强大范式 仅用眼睛和手就能 轻松操控 Apple Vision Pro 此外 我们也在不断拓展 可以在 Vision Pro 上打造的体验 我们提供了一系列工具 为用户提供 精细控制、按钮输入和触觉反馈功能 今年 我们将添加空间配件支持 我们还增加了对两个空间配件的支持 PlayStation VR2 Sense 控制器 和 Logitech Muse

    PS VR2 Sense 控制器非常适合游戏 它有按钮、操纵杆和触发按钮 它甚至可以使用标准手势 如轻点 来控制系统

    PS VR2 Sense 控制器可以 很好地支持空间跟踪 可以玩运动游戏 比如 Resolution Games 开发的《Pickle Pro》

    我们支持另一个新配件 是 Logitech Muse Logitech Muse 带有力度传感器 笔尖和侧边按钮 支持可变输入 还提供强大的触觉反馈功能

    对于效率和创意 App 来说 这种精准度都非常实用 这就是我在今天的讲座中 要构建的雕塑 App 示例 旁边打开的是照片 App 你可以在全空间 App 和 共享空间 App 中使用这些配件 我们结合 Apple Vision Pro 的 摄像头和空间配件的传感器 跟踪这些空间配件的位置和旋转 你可以在 App 中充分利用触觉反馈 增强沉浸体验 可以使用 Game Controller 框架 连接空间配件 并使用 RealityKit 或 ARKit 访问锚点数据 在本次讲座中 我将介绍 如何在 App 中使用空间配件输入 我要结合使用 GameController、 RealityKit 和 ARKit 构建一个雕塑 App 我会介绍一下如何直接使用 ARKit 跟踪空间配件 最后 我将介绍一些 设计方面的注意事项

    现在 我们先来构建雕塑 App! 首先要设置 Xcode 项目

    通过 Game Controller 框架 连接空间配件 虚拟显示雕塑工具 在虚拟粘土上雕刻 以便开始与 App 交互 接着 显示基于跟踪交互数据 的反应式工具栏 我们先来设置 Xcode

    我使用 Game Controller 框架来管理与配件的连接 我将通过 Xcode 功能编辑器在 plist 中 添加空间游戏控制器支持 我会勾选“Spatial Gamepad” 旁边的复选框 表示我会通过空间配件追踪功能 支持游戏控制器

    我将在 App 的 plist 中的 Accessory Tracking Usage 的描述字段说明 App 会如何使用配件

    在雕塑 App 我会告知用户 我在“跟踪配件的动作 以便在虚拟粘土上雕刻” 用户会在弹窗中看到 这条消息并选择允许跟踪配件

    现在 我们来跟踪其中一个配件 空间配件需要活跃连接 才能传输惯性传感器数据 所以我需要发现连接 才能使用雕塑工具

    我会使用 GameController 框架 来发现连接的空间配件 侦听连接和断开连接事件 或迭代当前连接 如需进一步了解游戏控制器 请观看讲座 “利用虚拟和物理游戏控制器” Game Controller 中的两个类 可以支持空间配件跟踪 即 GCController 和 GCStylus 它们分别代表游戏控制器和触控笔 两者都支持 GCDevice 协议

    并非所有游戏控制器 或触控笔都支持空间配件跟踪 我将展示如何在我的雕塑 App 中检查是否支持这两种配件 当 App 打开时 App 可能没有连接配件 我需要监听何时连接配件 对于触控笔 我会监听 GCStylusDidConnect 通知 并抓取 GCStylus 要检查 GCStylus 是否支持空间配件跟踪 我要确保产品类别为 Spatial Stylus 在 App 的生命周期内 配件也可能会断开连接 断开连接事件的实现方式非常类似 为了使用 GCController API 我可以将 GCStylus 换成 GCController 检查 GCController 的产品类别 是否为 Spatial Controller 我已经建立了连接 但我看不到我的配件! 我们在它的末端显示一个虚拟笔尖 在 visionOS 上 对空间中的 对象的位置和方向进行跟踪的技术 称为锚定 无论你使用的是 RealityKit、ARKit 还是 同时使用这两者 全空间和共享空间 App 都可以使用锚定到配件的功能 雕塑 App 将使用共享空间 当我从 Safari 浏览器或“照片”等 App 拉取图片作为雕塑参考时 这一点非常重要 为了保护隐私 仅当前获得授权的焦点 App 才可以跟踪配件运动

    每个配件都标有 自己的一组锚定位置 PS VR2 Sense 控制器标记了 目标、握把和握把表面 Logitech Muse 没有标记握把的位置 只标记了目标位置 雕塑 App 锚定每个空间配件的目标 我将使用 RealityKit AnchorEntity 将虚拟内容锚定到我的配件 AnchorEntity 是将虚拟内容 附加到物理世界的实体 它可以与 RealityKit 场景中的其他元素交互 我们来看看如何通过代码实现锚定 从空间配件创建 AccessoryAnchoringSource

    我将以配件的“目标”位置为目标 如果我的配件不支持这个位置 我就不会锚定

    然后我会创建一个 AnchorEntity AnchorEntity 包含“配件”目标、 “目标”位置以及预测的跟踪模式

    我在左侧创建了 AnchorEntity 预测跟踪模式使用复杂的模型来预测 内容呈现时配件所在的位置 但是如果你做出急促的动作 则动作可能会过冲 我们可以看到 在第 4 帧 紫色的预测帧与 灰色的实际位置不匹配 使用它来进行渲染 和进行低延迟交互 如果需要更高的精度 可以使用连续跟踪模式 这样会增加延迟但能提供 更准确的姿态并且不会过冲 我会为配件选择 使用预测跟踪模式 最大限度地提高响应速度 在雕塑 App 中 我不希望用户 做出急促的手部动作 现在我有一个虚拟笔尖 锚定在我的配件上! 它可能看起来很棒 但我的雕塑工具 无法与 App 中的其他对象交互 我想根据配件的位置在粘土上雕刻 并提供触觉反馈 要在虚拟粘土上雕刻 我需要获得雕塑工具的转换 去年 我们添加了 SpatialTrackingSession 我们可以用它来 获取已配置目标 AnchorEntity 类型的转换 今年 我们将 .accessory 添加到了支持的 SpatialTrackingSession 配置列表 将 .accessory 添加到空间跟踪配置后 我可以运行会话来获取 任何配件 AnchorEntity 的转换 如需进一步了解 SpatialTrackingSession 请观看 Adrian 的讲座 “使用 RealityKit 构建空间绘画 App” 现在我要为雕塑添加触感 空间配件可以提供触觉反馈 这是一种很好的反馈机制 我要把它添加到我们的雕塑 App 中 以提供粘土的真实触感 从配件中获取触觉反馈 创建触觉引擎 然后启动它

    如需进一步了解触觉反馈 比如设置触觉反馈方式 请观看讲座 “游戏控制器的进展” 现在看看如何使用 我的雕塑工具在粘土上雕塑 每当配件移入粘土时 App 就会 移除一些材料并提供触觉反馈 以提供沉浸式体验 但我可能一下子从作品中 移除了太多的材料 就像那样 所以 我要添加一个 “添加”雕塑模式 App 会展示一个工具栏 用于 根据用户与配件的交互 在雕塑模式之间切换 我会把工具栏放在配件的左侧或右侧 取决于用户用哪只手拿着配件 这时候 我可以使用 ARKit AccessoryAnchor ARKit AccessoryAnchor 提供四个属性: 惯用手 告诉 App 用户用哪只手握着配件 配件在空间中的相对运动 在空间中的相对旋转运动 和跟踪状态 当传感器或相机的 覆盖范围减少时 跟踪质量会下降

    对于特定用例 例如借助空间配件 进行实际测量 ARKit 还会公开一个 API 用于接收指标锚点转换 如需了解详细信息 请查看文档中的 “坐标空间”API 回到我的例子 我需要访问 ARKit AccessoryAnchor 但我只有 RealityKit AnchorEntity 今年 RealityKit 支持从任意 RealityKit AnchorEntity 获取 ARKit 锚点 但前提是运行并配置了 SpatialTrackingSession 我要设置一个函数 用来从 RealityKit AnchorEntity 获取 ARKit AccessoryAnchor 只需访问 AnchorEntity 上的 ARKitAnchorComponent 获取它的 ARKitAnchor 然后有条件地将它 转换为 AccessoryAnchor 如需进一步了解 ARKitAnchorComponent 请观看 Laurence 的讲座 “RealityKit 的新功能”

    现在我要显示这个工具栏 我将使用我刚刚编写的辅助函数 从 AnchorEntity 中获取配件锚点 然后使用惯用手 来确定工具栏的位置 这个属性存储在 配件锚点的保持手性中

    如果用户是左撇子 我会让工具栏在正 x 位置显示 如果用户是右撇子则在相反位置 如果配件没有在任何一只手中 则不会进行补偿

    我们来看看我的 App 中的 响应式工具栏 当我用右手握住配件时 按住这个按钮 工具栏会显示在配件的左侧 我可以切换到“添加”模式并补上 我前面移除得过多的部分

    嗯 效果不错! 我们来回顾一下前面的内容 我使用新的空间配件 API 构建了一个沉浸式雕塑 App 我使用 GameController 连接配件 然后 我使用 RealityKit API 构建我的雕塑工具 我还展示了一个响应式工具栏 它使用了 RealityKit 和 ARKit 的组合功能 最后得到的 App 视觉效果和感觉都很棒 但如果你更喜欢直接使用 ARKit 或者如果你要构建 具有自定渲染功能的 App 有一些 API 可以帮助你实现 用于跟踪空间配件的等效功能 我们来看一下 我将概述 ARKit 在使用 配件跟踪提供程序和配件锚点更新 来实现配件跟踪的要点 使用 GCStylus 或 GCController 创建配件

    使用配件跟踪提供程序 来跟踪配件对象 当配件与 App 连接或断开连接时 我们需要处理地优雅些 这意味着你需要 使用更改后的配件配置 重新运行 ARKit 会话

    如需了解实现过程 请查看 ARKit 示例 App “在视体窗口中跟踪配件” 配件锚点的更新方式类似于手部锚点 我们可以选择流式接收准确的更新 或者使用按需预测 来获取交互式用户反馈 有关 ARKit 预测的更多信息 请观看讲座 “使用 ARKit 打造 更出色的空间计算体验” 我已经介绍了很多 出色的空间配件 API 接下来 我将分享构建 App 时 一些设计方面的注意事项 我们先来讲一下 使用手势与 UI 交互 你已经可以告诉视图 接收游戏控制器输入 例如按钮 或触发器作为输入法 而不是手势 现在 我们可以处理 标准手势和游戏控制器 作为视图中的输入

    我们来看看如何在代码中 实现这项功能 告诉 SwiftUI 视图 接收游戏控制器事件 接着 设置修饰符 .receivesEventsInView 告诉 SwiftUI 视图 也接收手势事件

    如果游戏控制器具有 空间配件跟踪功能 你的空间事件手势将具有手性 也称为游戏控制器填充的 惯用手

    对于在全空间中运行的 App 可以考虑使用 .persistentSystemOverlays API 来隐藏原位指示器 使用 .upperLimbVisibility API 来隐藏上肢和配件 这样可以进一步增强 App 和游戏的沉浸感 空间配件为用户与 App 和 游戏交互提供了强大的全新方式 为了确保 App 能够支持 尽可能多的用户 可以为空间配件和惯用手 提供自适应支持

    今年 ARKit 原生跟踪 手部的速度更快了 因此 手和眼睛更适合作为输入

    如果想让用户知道 App 支持 具有空间配件跟踪功能的游戏控制器 可以在 App Store 上添加 “支持空间游戏控制器”标记 如果你的 App 只支持具有 空间配件跟踪功能的游戏控制器 可以显示 “需要空间游戏控制器”标记 请查看相应文档 查找要添加到应用的 plist 中 以显示任一标记的对应秘钥 我来总结一下今天的内容 你可以采用空间配件来 实现更精细的输入控制和触觉反馈 并使用 GameController、 RealityKit 和 ARKit 来集成配件 设计 App 时 确保能够自适应支持惯用手和配件 这就是构建支持空间配件的 App 和游戏的简要介绍 期待看到大家的佳作 希望大家在 WWDC25 上有所收获!

    • 0:09 - Get in-app transforms

      // Get in-app transforms
      
      let session = SpatialTrackingSession()
      
      let configuration = SpatialTrackingSession.Configuration(tracking: [.accessory])
      
      await session.run(configuration)
    • 4:57 - Check for accessory support

      // Check spatial accessory support
      
      NotificationCenter.default.addObserver(forName: NSNotification.Name.GCControllerDidConnect, object: nil, queue: nil) {
        notification in
          if let controller = notification.object as? GCController,
             controller.productCategory == GCProductCategorySpatialController {
                   
          }
      }
    • 7:20 - Anchor virtual content to an accessory

      // Anchor virtual content to an accessory
      
      func setupSpatialAccessory(device: GCDevice) async throws {
      
          let source = try await AnchoringComponent.AccessoryAnchoringSource(device: device)
      
          guard let location = source.locationName(named: "aim") else {
              return
          }
        
          let sculptingEntity = AnchorEntity(.accessory(from: source, location: location),
                                             trackingMode: .predicted)
      
      }
    • 9:45 - Add haptics to an accessory

      // Add haptics to an accessory
      
      let stylus: GCStylus = ...
      
      guard let haptics = stylus.haptics else {
          return
      }
      
      guard let hapticsEngine: CHHapticEngine = haptics.createEngine(withLocality: .default) else {
          return
      }
      
      try? hapticsEngine.start()
    • 11:25 - Access ARKit anchors from AnchorEntity

      // Access ARKit anchors from AnchorEntity
      
      func getAccessoryAnchor(entity: AnchorEntity) -> AccessoryAnchor? {
          if let component = entity.components[ARKitAnchorComponent.self],
             let accessoryAnchor = component.anchor as? AccessoryAnchor {
              return accessoryAnchor
          }
          return nil
      }
    • 0:00 - 开场
    • 这个关于 visionOS 开发的讲座将重点介绍如何利用新的空间配件支持来创建空间雕塑 App。现在,你可以构建支持 PlayStation VR2 Sense 控制器和 Logitech Muse 的 visionOS App,实现更精细的控制体验并增强沉浸感。 PS VR2 Sense 控制器带有按钮、操纵杆和触发按钮,非常适合游戏和导航;而 Logitech Muse 则带有力度感应器和触觉反馈,对效率和创意 App 来说都非常有用。 本讲座将重点介绍如何利用新的空间配件支持来创建空间雕塑 App。现在,你可以构建支持 PlayStation VR2 Sense 控制器和 Logitech Muse 的 visionOS App,实现更精细的控制体验并增强沉浸感。 PS VR2 Sense 控制器带有按钮、操纵杆和触发按钮,非常适合用来打造游戏以及其他趣味十足的交互式体验;而 Logitech Muse 则带有力度感应器和触觉反馈,对效率和创意 App 来说都非常有用。 你可以使用 Game Controller 框架来连接这些配件,并利用 RealityKit 或 ARKit 来追踪配件的移动和旋转。本讲座将演示如何构建雕塑 App,并探讨将空间配件输入整合到 visionOS 全空间和共享空间 App 中的设计注意事项。

    • 2:41 - 构建雕塑 App
    • 为了构建雕塑 App,示例项目先设置了 Xcode 项目并在 plist 条目中配置了空间游戏控制器支持。 然后,项目使用 Game Controller 框架来发现并连接到空间配件。建立连接后,示例 App 使用 RealityKit AnchorEntity 将虚拟内容锚定到配件的“目标”位置。 这种锚定技术可以显示虚拟雕塑工具,从而准确追踪配件在空间中的运动。这款 App 还需要处理连接和断开连接事件,并利用预测追踪模式来实现虚拟内容的平滑渲染,确保提供灵敏又直观的雕刻体验。 为了实现与虚拟粘土的交互,App 需要访问雕塑工具的转换。项目使用“SpatialTrackingSession”来实现这一功能,这个 API 现在支持配件追踪,允许 App 获取任何配件“AnchorEntity”的转换。 接下来,项目添加了触觉反馈以增强触感,营造更富沉浸感的雕刻体验。使用 ARKit 的“AccessoryAnchor”,这款 App 可以确定用户是用哪只手拿着配件,同时获取有关相对运动和追踪状态的信息。 通过结合使用 RealityKit 和 ARKit API,这款 App 可以显示一个响应式工具栏,根据用户的惯用手来确定工具栏的显示位置,方便用户切换不同的雕刻模式。这种设计提升了用户体验,并实现了对雕刻过程的精确控制。

    • 13:37 - 使用 ARKit 追踪配件
    • 如果你要使用自己的渲染功能创建 App,ARKit 提供了一些用于追踪空间配件的 API,例如“GCStylus”和“GCController”。使用配件追踪提供程序可创建并管理配件对象。当配件连接并断开连接时,需要使用新的配件配置来重新运行 ARKit 会话。配件锚点的更新方式类似于手部锚点:你可以选择接收流式传输的准确更新,或通过按需预测来获取交互式反馈。

    • 14:45 - 设计注意事项
    • 建议针对惯用手和空间配件提供自适应支持,以尽可能方便用户使用。 借助 ARKit,你现在可将空间配件与游戏控制器集成,从而增强 SwiftUI 视图中的输入控制和触觉反馈。使用“receivesEventsInView”修饰符可处理标准手势事件和游戏控制器事件。 你可以在 App Store 上显示特定的标记,表明自己的 App 支持空间游戏控制器。对于全空间 App,你还可使用一些 API 来隐藏主屏幕指示器和上肢,从而增加沉浸感。

Developer Footer

  • 视频
  • WWDC25
  • 探索 visionOS 上的空间配件输入
  • 打开菜单 关闭菜单
    • iOS
    • iPadOS
    • macOS
    • Apple tvOS
    • visionOS
    • watchOS
    打开菜单 关闭菜单
    • Swift
    • SwiftUI
    • Swift Playground
    • TestFlight
    • Xcode
    • Xcode Cloud
    • SF Symbols
    打开菜单 关闭菜单
    • 辅助功能
    • 配件
    • App 扩展
    • App Store
    • 音频与视频 (英文)
    • 增强现实
    • 设计
    • 分发
    • 教育
    • 字体 (英文)
    • 游戏
    • 健康与健身
    • App 内购买项目
    • 本地化
    • 地图与位置
    • 机器学习
    • 开源资源 (英文)
    • 安全性
    • Safari 浏览器与网页 (英文)
    打开菜单 关闭菜单
    • 完整文档 (英文)
    • 部分主题文档 (简体中文)
    • 教程
    • 下载 (英文)
    • 论坛 (英文)
    • 视频
    打开菜单 关闭菜单
    • 支持文档
    • 联系我们
    • 错误报告
    • 系统状态 (英文)
    打开菜单 关闭菜单
    • Apple 开发者
    • App Store Connect
    • 证书、标识符和描述文件 (英文)
    • 反馈助理
    打开菜单 关闭菜单
    • Apple Developer Program
    • Apple Developer Enterprise Program
    • App Store Small Business Program
    • MFi Program (英文)
    • News Partner Program (英文)
    • Video Partner Program (英文)
    • 安全赏金计划 (英文)
    • Security Research Device Program (英文)
    打开菜单 关闭菜单
    • 与 Apple 会面交流
    • Apple Developer Center
    • App Store 大奖 (英文)
    • Apple 设计大奖
    • Apple Developer Academies (英文)
    • WWDC
    获取 Apple Developer App。
    版权所有 © 2025 Apple Inc. 保留所有权利。
    使用条款 隐私政策 协议和准则