简介
空间计算 (Spatial Computing) 应用程序的构建仍然使用熟悉的 SDK 和开发环境 Xcode。
两项新的特性,混合真实和虚拟内容和使用自然输入与应用程序交互。
整个系统旨在保护人们的隐私,可以安心地专注于应用程序的体验。
结构
基础知识
基本元素
空间计算的基本元素
- 窗口 (Windows)
- 卷 (Volumes)
- 空间 (Spaces)
共享空间
默认情况下,应用程序启动到共享空间,这是应用程序并排存在的地方,就像 Mac 桌面上的多个应用程序一样。
穿透 (Passthrough) 是指显示经过摄像头拍摄到真实空间,这样人们可以通过穿透与周围环境保持联系,。
窗口
每个应用程序可以有一个或多个窗口,窗口可以包含传统视图和控件以及 3D 内容,允许混合和匹配 2D 和 3D。
这些 SwiftUI 场景,跟普通 macOS 窗口一样可以调整大小和重排位置,比如人们可以按照自己的喜好在当前空间中重新放置窗户。
卷
卷允许应用程序在定义的范围内显示 3D 内容,并与其他应用程序共享空间。
卷非常适合展示 3D 内容,例如棋盘。人们可以在空间中重新定位卷,并且可以从不同的角度观看它们。
卷是 SwiftUI 场景,允许您以熟悉的方式进行布局,并且它们使用 RealityKit 的强大功能来显示 3D 内容。
比如在观看视频或玩游戏时集中注意力,您可能希望更好地控制应用程序的沉浸程度,可以通过打开一个专用的完整空间来完成此操作,其中应用程序的窗口、卷和 3D 对象是唯一出现在视图中的对象。
在完整空间中,还可以利用 ARKit 的 API。
例如,除了系统提供的手势之外,还可以获得更详细的骨骼手部跟踪,以真正将人手的结构融入到您的体验中。
使用完整空间的几种不同方式
- 可以使用穿透来接地现实世界中的内容,并使人们与周围环境保持联系。
当播放 Spatial Audio 并通过 RealityKit 渲染 3D 时,将自动利用设备不断更新对房间的理解,将视觉和声音融入人们的周围环境,让他们感觉这些虚拟对象确实属于他们的房间。
- 可以选择渲染到完全沉浸式的空间以填充整个视野。
这使应用程序能够通过自定义虚拟对象的照明以及选择音频特征的能力来灵活地实现应用程序的创意。
SDK 提供了灵活的工具集来构建可以跨越连续沉浸感的应用程序。
交互
在 vision OS 上,我们只需用眼睛和双手就可以与应用程序进行交互。
- 人们可以通过查看按钮并用手指敲击来进行选择来与按钮进行交互。
- 人们还可以在 3D 空间中伸出手并触摸同一个按钮。
对于这两种交互,都可以使用多种手势,例如点击、长按、拖动、旋转、缩放等等。
系统会自动检测这些并生成触摸事件供应用程序响应。
手势与 SwiftUI 可以很好的集成,相同的手势 API 可以与 RealityKit 实体无缝协作,可以轻松地直接与 3D 场景元素进行交互。
例如,这可能有助于将旗帜直接放置到该 3D 模型上,或者想象一下控制虚拟拉链,或者您可能想要交互并拾起虚拟棋子。
现在,如果您想玩保龄球游戏或将人们的手变成虚拟俱乐部,您可以通过 ARKit 的骨骼手部跟踪来实现。
在这里,我们可以看到一个示例,如何使用水龙头将立方体堆叠在桌子上,然后用手将它们砸到桌子上。
这是一种强大的方式,您可以将特定于应用程序的手动输入带入体验中。
最后,系统自动将来自无线键盘、触控板和辅助功能硬件的输入直接带入您的应用程序,并且游戏控制器框架还允许您添加对无线游戏控制器的支持。
SharePlay
协作和共同探索事物是空间计算的基本组成部分。
我们通过 SharePlay 和小组活动框架来做到这一点。
在 vision OS 上,就像在 macOS 上一样,人们可以共享任何窗口,就像这种“快速查看”体验一样。
当人们共享 Quick Look 3D 模型时,我们会在参与者之间同步方向、比例和动画,以便在不同地点时轻松协作。
当人们就其空间中显示的并且他们实际指向的内容进行协作时,SharePlay 会话中的每个人都拥有相同的体验非常重要。
这可以实现自然方式的参考,例如对某个物体做手势,并增强身体在一起的感觉。
我们在系统中添加了共享上下文的概念,系统管理此共享上下文,帮助确保 SharePlay 会话中的参与者都能以相同的方式体验内容。
可以使用空间角色模板进一步自定义人们体验您的内容的方式。
要了解更多信息,请观看我们有关为此平台设计和构建空间 SharePlay 体验的会议。
Design spatial SharePlay experiences – WWDC23
Build spatial SharePlay experiences – WWDC23
隐私
鉴于该设备对周围环境和人有很多深入的了解,我们设置了很多架构来保护人们的隐私。
隐私是指导该平台设计的核心原则,同时使开发人员能够轻松利用 API 来利用设备的众多功能。
系统不会允许应用程序直接访问来自传感器的数据,而是为您执行此操作,并为应用程序提供事件和视觉提示。
例如,系统知道 3D 空间中某人的眼睛位置和手势,并将其作为触摸事件传递。
此外,当视图成为关注焦点时,系统会在视图上呈现悬停效果,但不会与用户正在查看的应用程序进行通信。
在许多情况下,系统提供的行为足以让您的应用程序响应交互,如果确实需要访问更敏感的信息,系统会首先征求人们的许可。
例如,请求用户允许访问场景理解以检测墙壁和家具,或访问骨骼手部跟踪以将自定义交互引入您的应用程序。
开发工具
Xcode
vision OS 依然使用 Apple 的集成开发环境 Xcode。
Xcode 提供了一整套用于开发应用程序的工具,包括项目管理支持、UI 可视化编辑器、调试工具、模拟器等等。
Xcode 还附带平台 SDK,它提供了用于开发应用程序的全套框架和 API。
如果源文件包含 SwiftUI 预览提供程序,预览画布将自动在 Xcode 中打开。
预览画布已扩展为支持 3D,允许您可视化场景的 RealityKit 代码,包括动画和自定义代码。
这可以缩短迭代时间,在编辑实时代码并直接查看更改和调整的结果时为您的应用程序找到正确的外观和感觉。
预览反映了代码更改,可以轻松查看代码中快速实验的结果。
Xcode 预览还具有对象模式,允许快速预览 3D 布局 ,例如查看布局是否适合视图的边界。
这对于使用传统 UI 和新 3D 视觉效果构建紧密集成的场景非常有用。
模拟器是运行和调试大多数应用程序以及在开发过程中使用非常可预测的环境快速迭代的好方法。
可以使用键盘、鼠标或兼容的游戏控制器在场景中移动和环视。
通过使用模拟系统手势,可以轻松地与您的应用程序进行交互。
该模拟器具有三个不同的模拟场景,每个场景都有白天和夜间照明。
我们还扩展了 Xcode,以进行调试时支持多种运行时可视化,从而帮助通过简单地查看场景来快速了解和跟踪错误。
在这里,我们可以看到平面预览,包括这些平面的语义以及场景中的碰撞形状。
通过 Xcode 中的调试器可以轻松切换想要关注的可视化效果。
Instruments
当需要完善应用程序的性能和响应能力时,我们可以使用 Instruments 等熟悉的工具。
Instruments 是 Xcode 中包含的一个强大的性能分析工具。
RealityKit Trace
对于空间计算,Instruments 15 包含一个新模板 RealityKit Trace,为平台上的新行为提供更多、更深入的见解。
RealityKit Trace 模板具有新工具,使开发人员能够了解其应用程序的 GPU、CPU 和系统功耗影响,并识别性能热点。
可以轻松观察和理解帧瓶颈,并将其追溯到重要指标,例如提交的三角形总数或模拟的 RealityKit 实体数量。
这可以快速找到并解决潜在的性能问题。
有关更多详细信息,请查看“认识 RealityKit Trace”会议。
Meet RealityKit Trace – WWDC23
Reality Composer Pro
Xcode 中推出了一种名为 Reality Composer Pro 的新开发工具,用于预览并为应用程序准备 3D 内容,帮助概览所有资产以及它们如何在场景中组合在一起。
我们添加到 RealityKit 的一项新功能是粒子,可以使用 Reality Composer Pro 中的工作流程来创作和预览它们。将粒子添加到场景中可以提供运动、生命和无限的可能性,比如云、雨和火花这些效果可以在短时间内快速构建。
该工具也可以将音频添加到场景中并将它们与对象关联起来。
在空间上预览音频,这会适配整个场景的形状和上下文,比如示例中空间音频具有空间方向特性。
大多数虚拟对象将使用 RealityKit 的基于物理的材质来表示各种现实世界的材质。
RealityKit 使用传感器数据将现实世界的照明信息输入到这些材料中,将它们融入人们的周围环境。
RealityKit 还提供了一些额外的标准材料,供您的应用程序在常见场景中使用。
当有非常具体的需求时,可以使用开放标准 MaterialX 在 Reality Composer Pro 中创作自定义材质。
可以通过节点图来完成此操作,无需接触任何代码,并直接在视口中快速预览它们。
您可以在“探索 Reality Composer Pro 中的材料”课程中了解更多相关信息。
当您对 3D 内容感觉良好时,您可以将场景发送到您的设备并直接测试您的内容,甚至不必构建应用程序。
要了解更多信息,请观看“认识 Reality Composer Pro”会议。
Meet Reality Composier Pro – WWDC23
Unity
另一个可用的选项是 Unity。
Unity 使您能够使用熟悉的工作流程编写空间计算应用程序,而无需任何插件。
可以利用现有内容来推动新的沉浸式体验。
要了解更多信息,请观看这些课程,了解如何使用 Unity 编写沉浸式应用程序。
构建应用程序
有两种方法可以开始构建空间计算的应用程序
-
从头开始设计一个全新的空间应用程序
-
从现有的应用程序想要引入这个新的空间平台
构建全新应用程序
在 vision OS 中选择 App 模板。
选择初始场景类型。
- 窗口
- 卷
这会为您生成初始启动代码,并且以后可以轻松添加其他场景。
选择沉浸式场景类型。
- 无 (None)
- 混合 (Mixed)
- 渐进 (Progressive)
- 全 (Full)
默认情况下,您的应用程序将启动到共享空间。
如果选择了沉浸式场景类型 ,则第二个场景将添加到您的应用程序中,并带有一个示例按钮,显示如何启动到此完整空间。
当您完成配置后,您会在 SwiftUI 中看到一个初始工作应用程序,其中显示熟悉的按钮与 RealityKit 渲染的 3D 对象混合在一起。
要了解更多信息,请观看“开发您的第一个沉浸式应用程序”会议。
Develop your first immersive app – WWDC23
我们还发布了代码示例,每个示例都说明了不同的主题,展示了如何构建融合 3D 视频和空间音频的共享、沉浸式播放体验。
Happy Beam 是一个示例,说明如何创建一款游戏,利用沉浸式空间(包括自定义手势)与朋友一起创建有趣的游戏。
Hello World 展示了如何使用 3D 地球仪在不同的视觉模式之间进行转换。
现有应用程序引入空间计算
在此平台上从头开始构建和设计应用程序提供了轻松接受空间计算概念的机会。
然而,你们中的一些人可能拥有想要引入空间计算的现有应用程序。
从一开始,iPad 和 iPhone 应用程序的外观和感觉都很棒。
如果您的应用程序支持 iPad,则该变体将优于 iPhone,尽管完全支持仅 iPhone 的应用程序。
让我们看一下模拟器中显示的食谱应用程序。
虽然该平台有自己的深色风格,但 iPad 和 iPhone 应用程序保留了浅色模式风格。
Windows 可以缩放以方便使用,并且可以处理应用程序的旋转,让您可以看到不同的布局。
要了解更多信息,请观看“在共享空间中运行 iPad 和 iPhone 应用程序”会议,了解系统的内置行为、功能差异以及如何使用模拟器进行测试。
Run your iPad and iPhone apps in the Shared Space – WWDC23
运行现有的 iPad 或 iPhone 应用程序仅仅是开始。
只需单击一下即可轻松在 Xcode 项目中为此平台添加目标。
之后,我们只需选择目标设备,重新编译并运行即可。
重新编译后,您将获得本机间距、大小和重新布局。
您的窗口和材质将自动移动到平台的外观和感觉,确保在任何光线条件下的可读性,并且您的应用程序可以利用内置功能,例如突出显示自定义控件。
代码示例
从 Hello World 开始,探索一些可以集成到应用程序中的功能。
快速浏览
在模拟器中运行该应用程序后,Hello World 将启动,并在我们面前打开一个进入共享空间的窗口。
这是一个熟悉的窗口用 SwiftUI 制作,它包含不同的元素,例如文本、图像和按钮。
使用点击手势可以在应用程序内进行导航,观察我们的新视图如何嵌入 3D 内容。
SwiftUI 和 3D 内容现在可以无缝协作,返回我们的主窗口并选择行星地球给我们带来了一个新的视图。
出现一个新元素,这是卷。
它包含地球的 3D 模型以及一些 UI 元素。
通过移动窗口栏,可以在周围的任何位置调整音量的位置。
再次返回主窗口并选择“查看外层空间”会邀请我们进入太阳系。
点击进入全沉浸的沉浸式风格,看到示例渲染了地球并调暗了穿透,使我们能够专注于内容,而不会受到周围环境的干扰。
现在我们已经看到了它的实际效果,让我们分解 Hello World 的一些功能,并向您展示如何在您自己的应用程序中使用这些概念。
有多个元素:窗户、卷和空间。
您可以将其视为您的应用程序可以用来上下调整的范围,具体取决于在特定时刻使用您的应用程序的人最适合的内容。
您可以选择在共享空间中呈现一扇或多扇窗户,让人们更加身临其境。他们可以看到穿透,并可以选择并排放置其他应用程序。
或者您可以选择让您的应用程序完全占据空间来提高沉浸感。
当您设计用于空间计算的应用程序时,找到最适合您的应用程序在给定时刻体验的元素并在它们之间进行灵活调整是一个重要的考虑因素。
窗口
窗口作为您的应用程序的起点,它们是使用场景使用 SwiftUI 构建的,并且包含传统的视图和控件。
在 vision OS 上卷支持混合 2D 和 3D 内容,3D 内容可以与 2D UI 一起在窗口中呈现。
窗户可以在空间中调整大小和位置。
回到代码示例。
在 Hello World 中,内容视图包含我们的 SwiftUI 图像、文本和按钮,以及号召性用语以获得更身临其境的内容。
创建窗口就像将 WindowGroup 添加到场景一样简单。
在 WindowGroup 内,我们将显示内容视图。
我们的内容视图可以添加 3D 内容,为您的应用带来新的深度维度。
为此,您可以使用新的 Model3D 视图。
Model3D
Model3D 类似于图像,可以轻松在应用程序中加载和显示由 RealityKit 渲染的精美 3D 内容。
要将 Model3D 添加到您的视图中,我们通过传递卫星模型的名称来初始化 Model3D。
这样,Model3D 将查找并加载模型,并将其放入视图层次结构中。
现在,此窗口已将卫星嵌入到视图中,并且可以看到它从 z 轴出来,为应用程序添加了新的深度维度。
手势识别器
现在我们已经添加了卫星,我们可以添加交互,交互从根本上内置于系统中并由 SwiftUI 提供。
SwiftUI 提供了在 Apple 平台上已经熟悉的手势识别器,例如 Tap、onHover 和 RotateGesture。
该平台提供了专为 3D 交互而设计的新手势识别器,例如 3D 空间中的旋转、点击 3D 对象等。
看一下支持与卫星交互的代码。我们将启用空间点击手势,以便我们可以抓住并移动卫星。
从 Model3D 开始,我们现在可以添加手势。在内部,我们添加一个针对卫星实体的 DragGesture。然后我们可以使用从更新闭包传入的值来移动卫星。
回到渲染卫星的卫星视图,请注意,DragGesture 允许我点击并拖动模型,随着我的交互而移动。
卷
卷是窗口的扩展,是一种新型窗口,非常适合 3D 内容。它们可以托管多个包含 2D 或 3D 内容的 SwiftUI 视图。
尽管卷可以在完整空间中使用,但它们实际上是为共享空间构建的,因此内容必须保留在卷的范围内。
让我们看看如何向场景添加卷。您将首先创建一个新的 WindowGroup 并将其 windowStyle 设置为卷。
然后,您需要为其指定一个defaultSize,其中包含宽度、高度和深度属性。卷的单位可以用点或米来指定。
让我们看看这个在模拟器中的运行情况。当提交应用程序时,该卷被放置在面前。
该卷具有我们指定的尺寸,以及平台控件应用程序标题栏,显示我们的应用程序名称,可以轻松识别该卷属于哪个应用程序。窗口栏,可以定位音量。关闭按钮,点击时暂停应用程序,关闭音量。
目前,我们的卷渲染了地球的 3D 模型,但您可能想要开始添加更多内容和不同的行为。
RealityView
RealityView 可以作为应用程序的一部分,RealityView 是一个可以添加到场景中的新视图,允许直接在 SwiftUI 中管理任意数量的实体。
SwiftUI 和 RealityView 让您可以通过连接到 SwiftUI 的托管状态和实体属性来轻松集成您的应用程序。
这使得您可以轻松地利用应用程序数据模型的真实来源来驱动 3D 模型的行为。
使用 RealityView 提供的转换函数可以轻松进行坐标空间之间的转换,并且 RealityView 提供了一种通过附件在 3D 场景中定位 SwiftUI 元素的方法。
RealityView { <#inout RealityViewContent#>, <#RealityViewAttachments#> in
<#code#>
} update: { <#inout RealityViewContent#>, <#RealityViewAttachments#> in
<#code#>
} attachments: {
<#code#>
}
RealityView 初始化需要三个参数:make 闭包、update 闭包和附件 (Attachments) 视图生成器。
-
make 闭包允许您创建实体并将它们附加到根实体。
-
update 闭包,每当视图的状态发生变化时就会调用它。
-
attachments 闭包中,可以添加带有标签属性的 SwiftUI 视图,该属性允许 RealityView 将视图转换为实体。
RealityView 附件
现在,让我们通过一个示例来了解如何在 RealityView 中使用附件。
添加附件就像将 SwiftUI 视图放入 RealityView 的附件闭包中一样简单。
让我们使用这个糕点的图标来代表 3D 地球上的一个位置。
对于每个附件,您必须添加一个标签来为附件命名。我将这个命名为 “pin ” 。
为了显示附件,将其添加到 RealityView 的内容中。我将在更新闭包中将其添加到场景的根实体中来完成此操作。
在这里,我们可以看到我们之前制作的附件,渲染在我最喜欢的面包店位置上方的地球上。
正如我们刚才所看到的,使用 RealityKit 可以释放强大的功能,例如 Model3D、RealityView、附件等等。
这些可以轻松集成到您的应用程序中 。这只是 RealityKit 功能的冰山一角。
如果您想了解更多信息,我鼓励您观看“使用 RealityKit 构建空间体验”和“使用 RealityKit 增强您的空间计算应用程序”。
空间
一旦应用程序打开专用的完整空间,系统就会隐藏所有其他应用程序,只留下您的应用程序可见。
现在,您可以将应用程序的窗口、卷和内容放置在您周围的任何位置。
借助 ARKit 和 RealityKit,虚拟内容甚至可以与周围环境进行交互。
可以将一个虚拟球扔进房间,观察它从墙上弹起,然后在地板上滚动。
通过添加手部跟踪,您可以构建自定义手势和交互,或将内容相对于人们的手放置。
其中许多功能都来自 ARKit。
要更深入地了解如何在应用程序中利用它们,请务必查看“认识 ARKit 进行空间计算”会议。
Meet ARKit for spatial computing – WWDC23
沉浸感类型
通过空间,您的应用程序还可以提供不同级别的沉浸感,具体取决于创建时选择的样式。沉浸式风格是一个可以在完整空间中传递的参数。
有两种基本样式,称为混合 (mixed) 和满 (full) 的。
- 混合风格将应用程序的内容分层在穿透之上。
- 完整样式隐藏穿透并仅显示应用程序的内容。
还可以通过选择渐 (progressive) 进式将两者结合起来。这种风格最初允许一定程度的穿透,但用户可以通过旋转位于设备顶部的数字表冠将沉浸级别一直更改为完全沉浸。
回到我们的示例来探索沉浸式风格。我将从混合风格开始,看看效果如何。
而且因为 Full Space 是一个 SwiftUI 场景,所以我可以使用 RealityView 来显示地球。
这是从高轨道观看的地球,这是我在应用程序中显示场景的方式。
请注意,我实际上并没有指定沉浸式风格。这是因为当您创建沉浸式空间时,SwiftUI 默认采用混合风格。
我们还可以通过添加不同的沉浸式风格来使您的应用程序完全沉浸式。这次,我将使用沉浸式“完整” 。
在我们的 ImmersiveSpace 的末尾添加沉浸式风格很容易。我们将沉浸式风格存储在状态变量中,然后将类型设置为 full。
因为我们想让人们选择何时进入沉浸式体验,所以最好添加一个按钮来让人们决定是否要进入这种沉浸式风格。
回到我们的应用程序,我将 Hello World 从单个窗口完全沉浸其中,使我们能够从任何角度查看地球。
总结
本文介绍了空间计算的基础知识,开发工具中的新特性,以及如何构建空间计算应用程序并给出了代码示例,一步步创建对应的元素。
有一些很棒的会议,应该是您的下一站。
关于空间设计的原则 – WWDC23
认识空间计算中的 SwiftUI – WWDC23
使用 RealityKit 构建空间计算应用程序 – WWDC23
认识 Reaity Composer Pro – WWDC23