大多数浏览器和
Developer App 均支持流媒体播放。
-
RealityKit 和 Reality Composer 简介
RealityKit 为 AR 而构建,让开发者能够利用渲染、动画和物理效果和空间音频等一流的功能。看看 RealityKit 如何重新定义传统的 3D 引擎,从而让开发者能够更快、更轻松地进行 AR 开发。了解开发基于 RealityKit 的 app 和游戏包含哪些工作,并学习如何利用 Reality Composer 制作原型并生成 AR 体验所需的内容。
资源
相关视频
WWDC21
WWDC20
WWDC19
-
下载
(RealityKit和 Reality Composer介绍)
大家好
我是Cody 欢迎大家来到 RealityKit和 Reality Composer介绍
现在App Store里有许多 形形色色的AR app 它们都充分利用了 ARKit的强大功能 这些app的开发者们 都有共同的需求 例如渲染 物理和动画
ARKit使创建 AR app更简单 但是我们要让它还要简单
开发AR app 会让你遇到一些其他领域没有的挑战 最主要的是你创建的虚拟内容 会与现实世界进行交互 反过来也是一样
所以如果你在一个 真实的房间中放一盏虚拟台灯 它应该要照亮周围的物体 不管是真实的还是虚拟的 而且放置在现实世界的东西 看起来要像它真的在那里一样
这在比如网购这样的情况下十分重要 如果你想看看该产品 放在你家中是什么样的
所以我们就非常需要 十分逼真的渲染 否则就无法增强现实
进入到RealityKit 这是Swift的一个新框架 是为了帮助你创建AR app 同时也能更轻松地利用ARKit
RealityKit是一个 AR优先的框架 这意味着它完全是从头开始设计的 而它的重点在于AR app的开发
所以该框架特别注重于 高度逼真的物理渲染 精确模拟现实生活环境对象
我们也充分利用Swift 创建出了一个有着 十分简单的API的框架
除了RealityKit 我们还会介绍 Reality Composer 这是一款Mac和iOS工具 能够简单基于AR的内容 它直观的设计 针对的是任何想让他们自己的内容 出现在现实世界中的人 甚至让你可以直接在AR中布景
但是在介绍这个功能之前 让我们先讲RealityKit 并看看它的实际效果
这是一个真实的房间 里面有沙发和桌子 桌子上还有一些小东西
它故意有点模糊 因为这里的相机焦点很浅 我们可以用RealityKit 在里面加上一些虚拟物品 让他们看起来真的像在这个环境里
请注意这里的照明 阴影和相机效果 让这个物体看起来像真的在里面一样 像这样奇思妙想的东西都可以
RealityKit可以帮助你 完成繁重的工作 并使你的内容自动适应环境 你只要告诉该框架你想展示的东西 然后它就会提供适用于 你的app的自定义逻辑
让你简单构建 和运行你的第一个app 实际上你刚刚看到的那个app 我只写了四行代码
所以在这里 我在这个环境中放置了一个水平锚 我从资产包中 加载一个叫flyer的模型 我再将该模型附加到锚点上
在这次演讲中 我会深入探讨每个概念的含义
(系统和框架基础) 你刚刚看到了该框架的运用 让我们进入构成 RealityKit的一些系统 以及帮助你立即开始的基础知识
为了帮助你创建app RealityKit的内置系统 会大大帮助你
这些都与其他 Apple框架集成 比如ARKit和Metal
(渲染) 首先 渲染让你的内容 在真实环境中看起来更真 并且它使用基于物理的 着色系统来实现这一点 能够准确模拟照明和材料的相互作用 它建立在Metal上 也就是说它针对Apple设备 进行了高度优化 该系统充分利用了Metal 提供的所有功能 例如多线程渲染和其他低级功能
因为RealityKit 是为AR app设计的 所以渲染的功能 完全专注于让你的内容 在真实环境中看起来更真
(动画) 在渲染的基础上 动画可以为你的内容带来生命力 也能丰富你的场景 RealityKit动画系统 就可以实现这一点 通过支持骨架和变换动画的方式 两者都可以直接从USDZ导入 你甚至可以通过ARKit的 动作捕捉技术 在程序上为你的对象制作动画 (骨架 - 变换) (碰撞检测 刚体动力学 AR启用) 物理系统负责模拟内容之间 复杂的交互 包括现实世界中的物体 它提供一个支持几种不同 代理形状的碰撞检测系统 如盒状 球体 甚至复合形状 它还可以模拟刚体动力学 例如质量 惯性 摩擦和恢复原状
RealityKit有网络的 内置支持 它可以跨设备同步整个场景 包括现实世界数据的共享表示
它全部建立在Apple的 多对等网络库之上 该系统开箱即用 它使构建连接的app 变得十分简单和自动
RealityKit使用 实体组件系统 来表示对象数据 对用户来说是非常有用的工具 可以通过组合属性轻松创建内容 而不是大对象继承层次结构 你也可以创建自己的自定义组件 将你的数据和功能添加到任何实体 还有 所有组件都会自动将它们的数据 在网络设置中与其他设备同步
甚至是自定义组件 所以共享数据非常简单
所以 我们现在看到的系统 强调的是AR的视觉方面 但这并不是全部
音频也是非常重要的 它能够帮你创建沉浸式内容 让你相信它在现实世界中是存在的
RealityKit的 音频系统理解3D空间 并且可以将音频置于动态内容上
所以它可以让离你较远的虚拟对象 听起来就离你很远 反之亦然
我还想提一提 RealityKit定义了一个 新的文件类型 也就是Reality File 它存储了可以加载到 app中的优化内容
而且该文件能够囊括 你的app需要的所有 例如 网格和材质以及物理属性 甚至音频资源
RealityKit还支持 直接从USDZ文件导入 类似于AR Quick Look 使用Reality File也能 缩短上传时间 也能让你更好地控制你的内容
你也可以直接从 Reality Composer导出这些文件 我们稍后也会说到
(框架基础 AR视图 - 锚 - 场景 - 实体) 在使用 RealityKit API时 你会用到四个主要领域 不管你要创建什么类型的app 包括AR视图 锚 场景和实体
我们先从视图或者叫AR视图开始 RealityKit中这么称呼 视图负责许多构建AR app中 繁杂的工作 这样你就能专注于提高体验 它也有许多有用的功能 比如 完整的手势支持 这样你就可以添加 这样你就可以响应 iOS设备上的任何手势 这允许实体更加轻松地响应用户输入 还有非常逼真的相机效果 这是由渲染支持的 这能够帮助你的虚拟内容集成到 现实世界中 实际上 ARView可以为你提供 和AS Quick Look 一样开箱即用的质量和功能集 让我们来看看其中一些相机效果
(阴影 AR视图) 为了让你的内容看起来像真的 最重要的效果之一 就是具有说服力的阴影 地上的阴影 看看该影片在没有加阴影的时候 很难说这个机器人 相对于下面的桌子在哪里 是漂在空中还是站在桌子上 很难说 但是一旦加上阴影 这个机器人在3D空间中 在什么地方就很容易辨认了 AR视图提供 两种不同的地面阴影技术 供你选择 使你的app更加出彩 所以要么是简单的投影 或者是更真实的阴影 也就是你在这里看到的
(动作模糊 AR视图) AR视图能够自动读取相机曝光时间 这是ARKit提供的 它能在场景中的所有虚拟内容上 执行基于摄像头的运动模糊 这有助于匹配实时相机中 已经存在的模糊
我希望这不会让你们不舒服
好了 看看关闭动作模糊时 该内容看起来就是贴在视屏的表面
好了
我们构建了一个逼真的景深算法 来模拟不同的相机焦点 这也是ARKit提供的有用信息 所以当设备相机 聚焦在现实世界中特殊的一个点时 AR视图会确保虚拟内容 遵循相同的聚焦模式 在该视频中 视频焦点不断前后变换 为了聚焦到单独的每一列 (景深 AR视图)
最后 AR视图将数字胶片颗粒 添加到虚拟内容中 这是ARKit的新功能 相机颗粒
因为数码相机都有一定的噪音 特别是在低光环境下 在你的虚拟内容中加入颗粒 能够让用户感觉到 该内容真的是真实世界的一部分 而不是浮在相机的表面 (相机噪声 AR视图) 现在这个机器人没有加任何噪声 看起来就不像是真的在这个环境中 当你加上噪声 看起来就是相机下的图像 而不是在相机表面
(实体 建立每个对象的块) (确定场景结构 提供层次变换) 现在我们来说说实体 它构成了你要创建的 任何体验的主要构建块 你场景中的所有虚拟内容 是由具有不同类型组件的一个实体 来为其提供特殊的功能
任何实体都可以作为其他实体的父级 这能够帮助我们创建场景结构 并构建一个层次变换 因此它更容易推理 其本地空间内的对象 例如 你有一个虚拟的桌子和虚拟的杯子 你想要杯子在桌子上 你可能会将桌子实体 作为杯子实体的父级 这样它们在空间里就可以同时移动
(AR锚固) 现在我们来讲讲锚固 以及它在AR中为何如此重要 在现实世界中 物体通常处于运动状态 如果我们将虚拟内容 投射到真实环境中 适应动作对于实际体验就至关重要
例如 如果你的内容已锚定到图像 比如桌子上的杂志 这样物体就应该固定在上面了 不管杂志在现实中是怎么移动的
RealityKit解决了该问题 ARKit锚作为API的 第一类对象 支持任何锚定类型 比如飞机 身体 脸部和相机
现实世界中的任何表面都能被锚定 我们将每一个锚点 都视为实体层次结构的本地根 因此 为了说明锚在 RealityKit中的工作原理 我们假设现实环境中 只有水平和垂直的平面 我们可以将内容锚定在上面 比如桌子或者墙
每一个都可以用作锚
所有的锚 都有附加到它们的实体的层次结构 这一点很重要 因为实体的层次结构在相应锚点 在现实世界中被ARKit 激活之前是不会活动的
例如 如果你要定义一个水平平面锚点 再附加实体 你在ARKit成功确认水平平面前 在现实世界是看不到这个实体的 这就防止了内容仅在空间浮动 直到锚点被确定
所以现在 你的场景中可以引入新锚点 比如图片锚点 可能会将用于显示虚拟框架的 新锚点引入到场景中 比如墙上的照片 所以如果你想移动照片 比如你想将照片移到不同的墙上 或者就想往左一点点 虚拟框架也会随之移动
最后 让我们一起来看看AR场景的构成 你们接下来都会看到
我们从AR视图开始 这是AR的开始
它包含了对场景的引用
并且是你可以手动添加 不同锚点的场景 就像你之前看到的那样
每一次你要加载新实体 你就可以将其附加至你选择的锚点 或者附加到先前加载的实体 以形成实体层次结构
在这个例子中 我们有两个锚点 每一个都形成了各自的层次结构
现在结合刚刚我们所说的全部 我们来看一个演示 看看如何实际操作
(演示) 我们要做的 是先检测我前面这个平面 再将虚拟内容添加到这个平面 利用RealityKit中的 程序网格生成库
所以我们把它调出来 我还要加一些虚拟玩具 让它们和这些盒子交互 好了
你可以看到物理系统 负责不同对象之间的交互 动画系统为这架飞机制作动画 让它朝我飞来 RealityKit自动处理光线 还有阴影 还有不同的相机效果 让这些内容尽可能 贴合实际 这整个app只需要几行代码 代码就只有加载方块盒子 加载网格 再告诉RealityKit 我想让它们在哪里
就结束了
接下来我想有请Tyler 来详细讲讲RealityKit 及其运作方式
谢谢Cody
我是Tyler Casella 我将为你们 介绍RealityKit 和Reality Composer 的可用功能 让我们先从 构建AR app需要什么开始
就像Cody向你们展示的那样 RealityKit使用 实体组件设计模式 来将对象创建到现实世界中 实体创建了你的场景结构 和层次结构 那么对你来说燥本地空间 推理对象就更简单了 现在如果你不熟悉实体组件设计模式 没关系 用起来其实很直观
实体本身 实际上由许多不同的组件组成 并且组件被定义为特定的行为和数据 可以添加至独立实体 与严格的继承模式不同 使用实体和组件 可以更好更灵活地运用代码 它还提供了巨大的性能优势 在内存布局和多线程两方面都有 为了更好地解释实体和组件 我们来看一个例子
比如我们有在app中经常使用的 不同的对象类型 比如球 台灯还有相机 现在还经常有许多 它们共有的行为 比如说锚定 这些对象要被锚定到现实世界中 所以我们可以对它们所有 都添加锚定组件
现在 因为球和灯都有视觉表现 所以我们对其添加模型组件 但是相机不添加 因为相机是不可见的 这正是实体组件设计的构成方面 变得强大的地方 现在 为了让对象相互碰撞 我们可以对其添加碰撞组件 之后我们继续操作 直到得到我们想要的活动为止 你可能注意到了这些对象 都有独特的表现方式 但是以这种方式构建代码 你可以避免重复代码和重用行为
我们来看看实体在代码中是怎样的 实体本身不会创建任何参数 但是如果你有实体 你就可以使用下标运算符 开始向其添加组件
同样的方法 你可以删除和修改这些实体上的组件 它允许你修改实体 动态行为
现在所有的实体都包含子项 你可以用addChild方法 来添加子项 有了这种层次结构
设置实体位置 你就是在定义它 相对于父级的位置 如果你想设置在现实世界中的位置 你可以使用 relativeto方法 将现实实体定义为无 这也就表明你也想要 现实世界中的空间
我们知道一些开发者 才刚刚开始创建他们的app 所以我们提供了许多有用的实体变体 它们已经预先配置好并可以使用 它们包含了一般功能如确定锚点 在场景中添加虚拟内容 或是动态灯光 通过实例化任何这些实体 所有必需的组件 都预先配置好并可以使用 我们来看看其中一些实体 以及如何使用 第一个是AnchorEntity 这是现实世界的粘合剂 这也通常是创建AR app 要做的第一件事
有了AnchorEntity 你就可以指定 现实世界的锚点 如果该对象在环境中移动 AnchorEntity 也会一直跟着 因此 AnchorEntity 经常是app的根基 之后在网上加特定组件
AnchorEntity 支持ARKit中 所有可用锚点类型 这可以快速将你的内容带入现实世界 例如 你可以指定内容锚定的 图片或对象 然后在检测到符合规格的锚时 它就会自动附加并在现实世界中出现
如果你已经有AR锚点或 AR光线投射结果 你也可以直接锚定 我们来看看如何在 代码中创建锚定实体
当你创建锚定实体时 你是在描述锚定对象 这里是我的描述 我想让AnchorEntity 锚定水平平面 类别是桌子 最小边界为半米乘半米
之后我们要将该锚 加入到AR视图场景 再加入场景后 锚并不会马上激活 记住 如果ARKit 没有检测到匹配锚点 它就不会被激活 一旦检测到匹配锚点 AnchorEntity 和其子实体 也会被激活
即使AnchorEntity 经常是你的app的子实体 在某些情况下你也 会想要多种操作
比如这个 我有一个想要锚定到桌子的内容 同时还想将单独的内容 锚定到图片 这样它们就能在同一场景中出现 但你的内容就可以固定在 两个现实世界的对象上
当你确定了你的内容 要附着在什么对象上时 下一步就是将内容附着上去 这时ModelEntity 就发挥作用了 这是RealityKit的 主要功能 你也会经常用到这个功能 ModelEntity附带了 在虚拟世界中集成 物理 动画和渲染所需的所有构建块 在实体组件术语中 是一个有着模型组件的实体 物理组件和碰撞组件 这些实体可以在代码中动态创建 或者直接从USDZ或 Reality File加载它们
这里我们从文件中 加载ModelEntity 你可你看到我们 通过loadModel调用 使负载非常明确 这点你要注意 特别是当你在做一些重要的事情 并且可能阻止渲染线程时 我们为你提供了异步变体来解决 这些问题 这在之后的演讲中会讲到 当你的模型加载完成 你就可以将其附加到锚点上 然后就可以继续下一步了 一旦锚点被检测到 你的模型就会在 现实生活中出现并且一直附着
现在让我们来看看 ModelEntity实际解剖结构 ModelEntity包含的 第一个项目是 网格资源 它提供了模型的 几何表示
网格资源可以直接作为 基元生成 或是USDZ或 Reality File的加载结果
因为网格通常是重量级的 所以它们可以在多个实体之间共享 这也允许我们优化渲染 进一步匹配绘制调用 如果你没有从文件中获取网格 你也可以直接从一组 简单的基元中生成 这包括块状 球状 平面和文字 同时支持平台上的所有字体
现在虽然网格定义了 模型的几何结构 你还需要一个方法来定义模型的外观 这时材料就发挥作用了 材料提供物体的外观和感觉 以及与周围的光如何交互
现在RealityKit提供 基于物理的渲染 也就是说我们可以模拟光线 在现实世界是怎样的 确保该物体在现实生活中可以 无缝融合 材料也自定义了对象 参与模拟的方式 材料可以在你加载 ModelEntity时进行预设 你也可以自己创建材料 使用我们在RealityKit中 提供的材料类型 我们待会儿可以看看
首先是 SimpleMaterial 通常基于物理的材料会包含很多参数 这是因为现实生活中的光线 十分复杂 现在SimpleMaterial 将其缩小为一组简洁的参数 这些参数可以采用标量输入 如果您想要改变 曲面上的输入也可以采用纹理
SimpleMaterial 可以让你创造有光泽的塑料 拉丝金属或有色玻璃 你可以通过三个主要属性来做到 基色 粗糙度和金属色 正如名字所说 基色确定材料的整体颜色 可以把对象从红色变成蓝色
金属参数本身 模拟了材料的导电性 也影响光线和表面的交互 因此 金属值为零表示 它是一个不良导体 也意味着光线会传播到表面 是的表面之下的光线占主导地位 如果我们将参数提升至1.0 就说明是良好导体 就使得表面的光线立即反射 就让物体看起来有金属感 粗糙度参数 影响物体的粗糙度 以及表面的反射程度
我们也提供无光材料 也能让物体着色 但不像 SimpleMaterial 它不参与基于物理的渲染 也不受场景中光线的影响 因此 这使它具有整体平面着色 这对保持问题或者内容的亮度很有用 即使是在黑暗的环境中 现在我们来看使用范例 我在该环境中放置了一台虚拟电视 电视机用的是 SimpleMaterial 屏幕用的是无光材料 如果我把灯光调暗 电视机暗下去了 但是屏幕还亮着 这是因为它不受环境光线影响
SimpleMaterial 和无光材料 都允许各种外观 但RealityKit 还提供第三种材料 它完全不一样 但是也同样的重要 这就是 OcclusionMaterial OcclusionMaterial 不会影响对象的外观 是屏蔽其后面的任何对象 再将其传回相机中 这使得物体可以在 真实世界的后面移动
我们来看看用法 我在真实世界的桌子上 创建了一个平面 使用 OcclusionMaterial 这看起来 就像该对象是从桌子里面出来的一样 Cody的演示 也展示了这个效果
如果你不加这个效果 就很难评估对象的位置 也破坏了用户的沉浸式体验
这些内容涵盖了ModelEntity 的基本构建块 我们来快速看看 你怎么在代码中运用网格资源和材料
我们在这里生成一个盒子网格 以及我们动态生成 网格资源的所有调用 使用通用前缀约定 这是为了保证工作能够 正常进行
由于材料重量轻且初始化速度快 它们可以直接从初始化程序创建
当你同时有了网格和材料 你只需创建一个 ModelEntity并传递它们
有了这些 你就可以构建基本块 你就可以开始从中构建 AR体验的可视化内容 但是如果你真的想把它变成现实 你还要添加动画 就像Cody刚刚展示的 RealityKit支持 两种主要动画形式 骨架和变换动画
这些可以从文件中加载 但是变换动画 可以直接从 RealityKit创建
两种类型的动画都可以在所有实体上 从playAnimation 方法播放 当你播放动画时 动画控制器会给回你一个对象 该控制器允许你回放动画 所以你可以暂停播放动画 在正确的时间点维护你的动画 或者检查动画的当前状态 你可以重置 甚至可以停止动画
如果你没有在你的资产中 添加任何动画 你仍然可以通过移动功能 为你的实体设置动画 你首先需要提供想让动画做出的变化 在这种情况下我们向前移动五米 然后你可以选择定义变换 所在的相对空间 我们的情况中是现实世界 所以我设为无
接下来你要提供 动画持续时间 然后使用缓动函数 来定义动画从开始到结束的 平滑程度 这样你就可以创建简单的变换动画了
结合以上所有 RealityKit专注 构建AR体验 今年我们在新框架中 我们也引入了新工具 帮助你的AR开发流程 这就是 Reality Composer
我们为在Xcode 11中 可用的MacOS 引入了 Reality Composer 也为App Store中的 iPad和iPhone提供该功能 有了 Reality Composer 我们可以帮助iOS开发者 更加容易创建AR和3D体验 转向3D是一项很艰巨的任务 有了 Reality Composer 我们希望让你在构建 AR场景时能够更舒服 我们已经将许多功能集成到该工具中 现在我们来具体看看
当你在开始新项目时 你要解决的第一件事 只是把你的内容带到世界中 我们希望这个过程是简单的 我们已经为你提供了一组内容 你可以直接将其集成到场景中 或者你可以直接使用占位符 直到获得你想要的效果 该库的范围从简单形状到普通对象 甚至是大型建筑
而且它们不是静态资产 这里有一个螺旋形状 它提供许多参数 让你能够更加灵活创造 我们可以拉伸和挤压 我们也可加上铝材质 让它看起来像是金属质感
我们也提供丰富的模型 你也可以直接集成你的内容 比如图片帧 我选择了一张图片并将它放进去 然后挑选一个与我创建的体验风格 相匹配的框架
Reality Composer 能提供 所见即所得环境 可以让你轻松在创建时 预设和预显你的场景 在这里我可以复制一排棋子 换掉外表 来创建棋盘的另一面
预可视化的很大一部分 是在AR中看到你的内容 所以你就可以确保 它们的大小是正确的 并且与真实环境吻合
Reality Composer 还允许你在场景中添加行为 还能够支持简单交互 这样就就能使AR体验栩栩如生 让我们来看看这个例子 这里是我想要进行交互的棋盘 我想做的事情 我在点击黑子时 让它过去将军 所以第一步是打开行为面板 添加新行为
这里有很多预定行为 我选择轻拍翻转 现在该行为给了我敲击触发器 这可以出发一系列动作 可以在黑子播放动画 在我的交互中 我要修改运动类型为摇晃 而不是翻转
然后我要添加一个行动来实现移动 我就微调一下我们动作 现在我可以预览我的交互 现在我点击黑子 它就会摇晃 并且会移动到国王面前将军
所以 有了这些功能 创建看起来很棒的 AR视图和体验内容 就十分容易了 我在iPad上展示的这些功能 在macOS和 iPhone上也可用
现在 虽然Reality Composer 作为单独的app运行 它与Xcode的 开发和生态系统紧密集成 当你要构建Xcode项目 你项目中的内容 会集成并优化到你的app中 但是创建Xcode项目 和创建app间 也能发生一些小奇迹 这就是代码生成 作为该步骤的一部分 你项目中的内容 能够被编译 和优化为Reality File 接下来 我们会内省该文件 并生成用于访问你 在场景中创建的对象的 自定义代码
现在该代码生成步骤 由Xcode在幕后自动执行 并建立对场景中内容的强类型访问 这有一个很好的优势 如果你的场景中 对象的命名有任何的不匹配 你就会收到编译报错而不是运行崩溃
代码生成可以让你直接访问 场景行为中的调用触发器 还可以在代码中自定义行为
我们觉得凭借Reality Composer 在构建内容上的经验 Xcode中的编码是无缝的
我们来快速预览 Reality Composer 我还想向你们展示更多 因为我们今天说的只是冰山一角 还有很多东西我没有讲到 比如网络 物理团体 光线投射 手势等等 所以我建议你听听我们其他的演技 明天早上10:00 我们有用Reality Composer 创建app的演讲 会告诉你如何创建AR app 而这是RealityKit 的多人游戏 周四早上11:00 我们有用Reality Composer 创建AR体验 该演讲将会探讨如何将 Reality Composer 集成到您的AR app工作流程中 明天中午请加入我们的实验室 我们会进行答疑 可能会对你有帮助 谢谢大家光临 希望大家在 WWDC过得开心
-
-
正在查找特定内容?在上方输入一个主题,就能直接跳转到相应的精彩内容。
提交你查询的内容时出现错误。请检查互联网连接,然后再试一次。