大多数浏览器和
Developer App 均支持流媒体播放。
-
利用 Reality Composer 打造 AR 体验
借助 Reality Composer 这款工具,任何人都可以快速制作原型并构建可整合到 app 中或通过 AR Quick Look 体验的 AR 场景。详细了解 Reality Composer 强大而直观的功能,并探索其内置 AR 资源库中数百种现成可用的虚拟对象。看看构建动画和互动来丰富您的 3D 内容有多简单,并详细了解如何将 Reality 文件整合到您的 app 中。
资源
相关视频
WWDC21
WWDC19
-
下载
(用REALITY COMPOSER 创建AR体验)
早上好 很高兴看到你们 我希望你们都能度过一个 很棒的WWDC
今天能来这里与大家分享 我们感到超级激动 用Reality Composer 创建AR体验 我是Michelle 稍后同事 Pau和Abhi会加入我 今天我们讲什么是 Reality Composer 以及它如何帮助你创建AR app
在这场演讲之后 你将了解Reality Composer 提供哪些功能 以及如何在Reality Composer中 设置你的体验 然后如何接受…如何把你在 Composer中创建的内容 迁移到Xcode中的app中
那么首先什么是 Reality Composer? 你在本周稍早些时候可能听说了 Reality Composer 是一个工具、一个app 用于帮助iOS开发人员 开始使用3D和AR
你们中有些人已经开始使用 3D和AR了 在Reality Composer中 查看 你所创建、发布和标记的一切内容 是一件非常、非常神奇的事 因此请继续这样做
如果你不熟悉3D 你第一次打开3D app时 可能觉得它挺吓人的 是时候花时间来使用AR了 但通过 Reality Composer 视觉化并展示你的体验是一件 非常简单的事 可以使用内置内容库实现 或者如果你愿意 你可以使用你自己的USDZ 如果你不熟悉的话 USDZ只是个3D文件格式 Reality Composer 支持它
一旦你展示出了体验 你可以通过行为系统 添加简单的交互和动画 甚至可以在你编写任何代码之前 就实现 因此 它确实加速了体验自身的 迭代时间
然后最后你在Reality Composer中 所做的一切 你都可以直接迁移到 Xcode中的app中
关于增强现实的创建 就是看到体验在物理空间中的感受 在预期的设备上看它 并了解你的观众可能会如何看到 那个体验
Reality Composer 在macOS上可用 在iPhone和iPad上都可用 你可在iOS上编辑它 从而你可以 在你常用的开发机器上进行开发 然后在iOS上进行编辑 从而继续在iPad或 iPhone上处理同一个项目
或者你还可以在iOS设备上 开始项目 并以另一种方式进行编辑
今天我要给你们介绍创建场景 Pau会讲添加行为和使用物理世界 然后Abhi会讲创建app (创建场景) 对于创建场景
首先场景是什么? 你可能在RealityKit入门 和Reality Composer 演讲中听到过 Reality Composer 场景从本质上来说是实体的集合 包含锚点、对象、 行为和物理世界
每个场景都恰好只有一个锚点 当你开始一个项目或当你开始一个 场景时 任何场景 你都会被问到你在营造什么样的场景 什么样的体验
如果你要创建房间里、舞台上 或桌面上的东西 你要选择水平锚点
如果你希望它在墙面上 请选择垂直锚点
如果你正在增强一本书 或一些包装、一本手册 或一张电影海报 请选择图像锚点 对于自拍效果 比如眼镜或帽子 请选择面部锚点
项目可以有多个场景 但我认为你会发现当你第一次尝试时 一个或两个场景通常就足够了
好的 在这个例子中 让我们假设你已经选择了水平锚点 我们在这里 在Reality Composer中 内容是我们的主要关注点 它的布局和你在AR中看到的 一模一样 布局位于主视图端口或工作空间中 右侧的面板…
显示了你所选择的所有属性 并显示配置该实体的各种选项 可以是对象自身 就像这里所选择的这个文本一样 你可以看到它因为圆环而被选中
你可以选择对象 或一个场景
我可以给你展示更多的幻灯片 但我们为什么不一起在iPad上 了解一下Composer呢? 哦 不过我希望你们记住这个场景 因为我们要在本场演讲过程中 一起创建这个小教程 它是季节和太阳系课程 我们要在AR中创建它
好的 为了我们的演示 我要给你讲三个完全不同的RC项目 第一个有点像是初级版
它会给你展示五个 你可以在Reality Composer中 创建的非常基本的例子 很可能几分钟后你就会看到它 第二个是一个丰富得多 也复杂得多的体验 一个完整体验 关于你可以在 Reality Composer上独立地创建什么 如果你不想写任何代码的话 这非常棒 如果你不是个开发人员 或你只是刚开始尝试 并且你希望在开发app时 在完全投入使用它之前 先尝试一下体验的话 最后我们要一起创建我们看到的那个 季节场景 好的 那么这里是初级版…
在Reality Composer中
我要把我们带到AR中 因为我们打算在AR中看它 好的 这是我提到过的五个例子 让我们按播放… 以便我们可以看到交互 当我们开始之后 我们就 哦 大家好
当我们开始之后 螺旋开始旋转 在这里 如果我在第二个例子中 靠近一些 我可以让这个棋子抖动
我可以轻触这个棋子 获得物理移动
并得到一个声音 这是一种很有意思的声音
然后有人问我 如果我是个动画师 并且我有自己的模型 我有自己的动画 我是否可以把它们放到 Reality Composer中? 是的 你可以 你可以在用户交互上触发它们 比如轻触 如果你不是动画师 你可以在场景中的任意对象上 使用预制的强调动画 在这里我们已经把它们应用到了 一些非常基本的图形上 但你可以把它们应用到 你知道的 应用到这个舞者身上
这就是AR中的场景
接下来我给你展示… 这个更复杂的体验 更丰富的体验
哦 你很可能在想 我如何在场景中移动内容 移动摄像头 对于平移 我所做的就是用两根手指 像这样移动它们 从而我可以看到我想要看的内容
如果你观看了周二的极限特工 你可能会觉得这个小岛很眼熟 我们希望能再增加一些体验 因此如果你想象你正在开发 比如博物馆 或旅游中心体验 这是我们在这里所设想的东西 让我们在AR中看一下这个
我要按播放从而开始播放
你可以听到一些波浪声
现在提示我们轻触直升飞机 让我们这样做吧
你可以看到还要求我们轻触位置 以了解更多 因此我要轻触这些标记 你可以看到我得到了关于我所轻触的 每个位置的更多信息
其它位置都消退了
我还要拆开来讲 我们如何创建了这个场景
那么…实际上在这个场景中 并没有太多自定义内容 只有设计师创建的两个 自定义USDZ 小岛和直升机 你可以看到在这里我们导入了它们 如果你想的话 你可以导入更多 其余的都是从内容库中创建的 内容库是与 Reality Composer配套的 你可以看到我们在这里有许多东西
文本、基本形状 这就是你在这个场景中所看到的东西 这些标记只是基本形状 我们把它们合在一起 两个图形创建一个标记 在这里添加文本
我们还经常被问到另一个问题 我主要在2D中工作 因此我有许多图片
你知道的 公司的图像 我可以在Reality Composer中 使用它们吗? 答案为是的 你当然可以了! 你可以把它们带到体验中来…
因为照片使用图片框架 图片框架就包含在 我们刚看到的内容库中
就在Finally中
你很可能在想我们要如何创建 那些小型交互? 如果我们进入行为 通过点击右上方的行为按钮
你可以看到我们用于创建 那一系列流程 和那些交互的行为 我们在宣传要看的东西 你可能已经注意到随着我移动场景 场景中的那些对象都盯着我看
我们在这里使用了 Look At动作 从而让一切东西都盯着摄像头看 开始你只看到了小岛
其它一切都是隐藏的 你可以看到我们隐藏了其它东西 然后我们依次把它们展示给你 我们等0.2秒 然后我们首先显示了直升机文本 然后我们显示了直升机 以及直升机的轻触以开始 然后我们淡入了下边的标记 这就是下边的动作 我现在就可以给你预览一下 我只需要按卡片上的播放即可
我还要给你展示一个小秘密
这些鸟… 你可能已经注意到了…
我要从这里看它们 我们要求它们以群组为单位 绕着小岛飞行 它们根本不是真实的鸟 它们只是我们所使用的基本体 或只是基础形状 我们放了两张移动卡片 用作翅膀拍打效果 我们不再花时间创建小鸟了 我们所做的就是获取一对形状 并在这对形状上施加两个行动卡片 从而形成动画 如果你之前尝试过制作动画 你就知道创建一个这么简单的东西 是多么费时间 而这样只需要几秒钟
那么这是一个你可以 在Reality Composer中 完全不需要代码就能实现的 完整体验的一个例子 最棒的是 一旦你拥有这个Reality文件 你就可以把它分享给任何人并可以在 AR QuickLook中预览它 而你得到的体验与你在 Composer中实现的一模一样
那么这是第二个项目
最后让我们一起创建… 那个季节课程的体验 我要添加三个天体
太阳、月球和地球 为此我只需要用一些占位符对象 画出场景的草图就可以开始了 这是太阳 我已经把它引入进来了
现在我要…
复制它…
来创建…地球
我只需要在这里使用捏合 把它缩小一点 移动摄像头 让我们…抓住这个箭头 把地球移过去
然后接下来… 我还需要一个月球 让我们再次复制它 把它带到这里
然后我可以抓住这个圆环上的 任意位置 从而把它移到这个平面上来 让我们把它移过来 好的 很棒 现在我想稍微把月球缩小点 我只需要抓住圆环并向内移动 即可缩小它
好了 把它移近一些
好的 我们有这三个天体 让我们把太阳放大一些 我再次抓住这个圆环 只需要抓住它就能调整尺寸
调整太阳的尺寸
我们已经有了三个主体
接下来我要添加一些文本 我要再次进入内容库 让我们获取文本 看起来比我预期的位置要低一些 我只需要抓住这个绿色箭头 并把它拽上去即可 你可以看到它弹出显示在地平面上 那是因为我打开了吸附功能 如果你看一下左边的角落 我们有这个小磁体 如果我想自由移动物体 我可以把吸附关掉 但实际上我只想拉动这个蓝色箭头 让它靠前一些
我希望它距离太阳
大概半米左右… 我要打开我们在右侧看到的面板 用来修改文本 让我们把它修改为秋季
在Composer中添加这些元素 非常简单
最后我认为这就是我想要得到的效果 因此我只需要使用手指触摸屏幕 就可以四处移动摄像头
接下来我要添加…一个箭头
它并没有指向我希望它指向的方向 旋转一下 我要移动摄像头 这样我就可以看到绿色圆环 它位于地平面上 这个圆圈随着摄像头的移动而旋转 我总是可以处于我想处于的平面上 如果我不想通过移动摄像头来实现 我只需要轻触箭头即可 那会锁定到相应的区域 你可以看到圆环变得有点扁了 我只需要旋转… 这个区域 它正以15度角增量 进行吸附 再一次 因为我打开了吸附功能 但如果我不想让它吸附的话 我可以自由移动 在这里我拖动它 它总是在水平面上移动 在这个绿色圆环上移动 但我实际上希望它吸附在 太阳球体和秋季文本之间 因此我要打开吸附功能
你可以看到它吸附到那个位置了 这超级有用 超级简单 然后… 我想稍微修改一下这个箭头 我可以继续并点击 吸附旁边的图标文本来修改它 我要把它稍微放大点 这样我们能看得更清楚
我可以抓住这个手柄 拖动它
我还要把这个稍微变小点 稍微变平点
好的 然后我要把它移远一些
好的 现在一切都好像被挡住了 我们只花了几分钟就实现了
我实际上想替换这些天体 因为它们现在看起来都非常模糊 我想导入一些自定义USDZ 因为我已经把它们放在我想要放的 位置上了 我要做一次替换 因此我只需要轻触这个对象 我得到了这个编辑菜单 点击替换 我要导入…
太阳…
这将替换太阳 你可以看到尺寸一样 并且它正好是在 我所期待的正确位置上
我可以采用同样的方式… 替换地球
让我们快速实现一下
好了 还有月球 我要…
对它进行一些自定义 通过一些 让我们看一下 我想要地图材料 我可以让月球显示我想要显示的颜色 但我认为 为了安全起见我要选择灰色
如果我想更好地查看任何一项 我只需要双击来框住对象 这是在场景中四处游逛的一种 非常简单的方式
或如果我想查看场景 向后拉 我可以双击网格中的任意位置 来查看场景 这里还可以使用那些快捷方式 框住场景或框住所选定的东西
好的 我想我们已经准备好 添加行为了 我可以添加所有其它元素 但由于时间关系 我们现在不添加全部元素
在我们完成这部分演示之前 我想与你们分享一些小窍门
你看到那个替换了吗? 如果我们已经应用了行为 就像我们做其它动画一样 比如 假如是太阳 如果我替换它 那些行为将会保留下来 这会节约很多时间 如果你只想替换新内容的话 这个技巧很强大 然后同时我们提到了拥有多个场景 你可以在左上方的场景选择器中 访问它们 因此如果你想添加更多场景 你只需要在这里添加即可
如果你正在Xcode中 处理这些实体 你一定想给它们命名 你将在演讲的后半部分了解 与此相关的更多信息 你可以在打开面板时就开始命名 有一个配置面板 你可以在这里给实体命名 我要把它命名为太阳
最后如果有一些你不想做的操作 比如假如我移动了地球 但我却不想这样做 我可以撤销那个动作 我还可以长按
并重做 它会告诉我说 比如会做什么 我即将调用的撤销会做什么
好的
最后有些人问我 共享RC项目的最简单的方式是什么 你可以在设备间进行隔空投送 或像我们之前讲过的那样 你可以在iOS上使用编辑 轻松地在开发机器和iOS设备之间 进行共享
好的
我们现在得到了这个场景 已经准备好添加行为了
你刚了解了如何 在Reality Composer中创建场景 我要带你们了解如何使用内容库 进行快速布局 我们刚才还讲了 如何引入你的自定义USDZ
现在我们将转到添加交互和行为上 为了让你们了解这些内容 让我们欢迎我的同事Pau上台来
谢谢Michelle
好的 (添加行为) 现在我们了解了如何向场景中 引入内容 现在是时候让全部这些内容动起来了
当用户轻触某个对象时 你可能想播放一些音乐 或当用户靠近某个对象时 显示一些文本 或也许你只想播放一些USD动画
为了实现这些功能以及更多功能 我们需要利用 Reality Composer中的行为
让我们开始吧
正如我们之前所看到的 Reality Composer 中的场景包含一个锚点、 对象、行为和物理世界
行为总是发生在场景范围内 意思是你只能在同一个场景内 定位对象
让我们具体看一下什么是行为
行为由两种东西组成 触发器和动作序列 触发器 正如它的名字所暗示的那样 其实就是动作序列开始的条件
假如我们有一个场景是 一台电唱机的模型 当用户轻触它时 我们想播放一些音乐同时进行旋转
嗯 为了实现这个功能 我们只需要创建新行为即可 使用轻触触发器 然后创建一个动作序列 由音乐动作和旋转动作组成
当创建新行为时 第一件事是 选择要开始动作序列的触发器
Reality Composer 有五个不同的触发器可以使用
使用开始触发器 将在场景加载完成后尽快开始 动作序列
使用轻触触发器 将在用户轻触你所定义的对象时 开始动作序列
使用接近触发器 你要定义对象到摄像头的临界距离 一旦摄像头距离对象足够近 就开始动作序列
使用碰撞触发器 你要定义两个对象 一旦这两个对象发生碰撞 就开始动作序列 最后一个触发器是通知触发器 这个触发器可以让你 以编程方式从app中开始动作序列 我们将在本场演讲的最后一部分 了解一下这个触发器
现在让我们谈一下动作序列
你有三种主要方式 修改动作序列的执行 (动作序列) 分别是群组、循环和独有动作序列
让我们从群组开始讲
默认情况下在Reality Composer中 群组是按顺序起作用的 因此动作一个接一个地播放 但你可以合并多个动作 如果你想让动作并行播放的话 在这个例子中 在动作一完成之后 动作二和动作三可以立即同时播放 动作四只能在群组中所有动作 都完成后才能开始 (群组)
动作序列还可以进行循环 假如你想在场景中播放一些音乐 并且你想永久循环那首音乐 嗯 你只需要创建一个行为 把音乐动作放在动作序列中 并把动作序列标记为循环即可
最后一部分是独有动作序列 在Reality Composer中 你可以把动作序列标记为独有
每次只能播放一个独有动作序列 那意味着一旦开始独有动作序列 或将会停止其它正在运行的 独有动作序列 非独有的动作序列也会播放 比如与其它独有 和非独有动作序列一起
关于动作序列 你了解这么多就够了 现在让我们看一下 在Reality Composer 中的一些可用动作
使用可见度动作 你可以使用动作在场景中 把对象移入和移出 我们支持多种类型的动画 并且你可以使用一些基础功能 比如淡入淡出 但你还可以使用更好玩的动画比如 放大然后缩小
Reality Composer 还支持对把对象放到固定位置时设置动画
重点是与所显示的高度相似 你可以给对象施加不同的动作类型 和动画样式 你可以使用BasicPop 但你还可以使用更好玩的弹出动画
你还可以旋转对象或
让对象围绕其它对象环绕运动 如果你在文件中使用了USD资产 你可以使用它们的转换和骨骼动画
对于移动动作 你可以同时平移、缩放和旋转对象
使用移动由 将相对于对象目前所在位置移动 比如在这个例子中 对象总是会向前移动两格 并向左移动一格
使用移动到 你总是可以把对象 移动到场景中的指定位置 就像这里 对象将返回场景中的 原始位置
使用Look At 你可以让对象总是面向摄像头
就像在这个例子中 马脸总是朝着用户的设备 (看动作) (音频动作) 现在我们已经有了所有的动画动作 是时候给你的体验添加一些声音了 在Reality Composer中 有三个动作 可以给你的场景中添加音频
使用播放声音将从对象自身播放音频 就像这里 马正在发出嘶鸣声
使用环绕播放将面向场景发出声音 使用播放音乐 不需要任何转换即可播放音频
现在让我们做一个快速演示 让我们迅速看一下如何把一些行为 引入到Michelle 之前创建的场景中去 在这里我们有一个 比Michelle所创建的场景 更完整的场景 这里我们有月球、地球和太阳 我们有一些文本和太阳光线 显示不同的季节
让我们打开行为面板 点击右上角的行为按钮即可打开它
你可以在这里看到已经有一些行为了 让我们点击播放 并查看场景中会发生什么
在这里你可以看到月球、地球 或太阳没有移动 但以相继次序出现不同的光线、 季节和文本
让我们继续并创建一个新行为 以制作不同的动态月球、 地球和太阳对象 为此 让我们从引入新行为开始
我们点击加 然后在这里 我们可以看到所有可用的预设 我们可以从中选择 但对这个演示来说 我们要从自定义触发器开始
第一件事就是选择我们想要用于 开始动作序列的触发器 因为我们想当场景加载完成后 就开始让这些对象动起来 我们可以打开库并选择场景开始
太棒了 现在是时候开始动作序列了
对于这个动作序列 我们希望地球围绕太阳转 然后月球围绕地球转 同时我们想让地球和太阳旋转 让我们从环绕开始做
我们可以打开动作库 然后… 选择环绕作为第一个动作 当创建一个新动作时 第一件事就是要定义 动作的目标是谁 在这个例子中 动作所影响的对象是地球 并且中心是太阳
太棒了 我们有了所有的属性 比如持续时间、转速、 对齐到路径和环绕方向 对于方向 我们希望使用逆时针方向
现在我们可以轻松地预览动作了 只需要点击动作卡片中的播放按钮 即可开始播放
速度有点快 让我们把持续时间修改为一个 更适合这个场景的持续时间 让我们把它设为20秒
你可以修改持续时间并再次播放 耶 我认为持续时间看起来正合适 现在让我们引入第二个环绕 我们要再次打开库并选择环绕
现在所影响的对象是月球 而中心是地球
持续时间 我们希望跟以前一样 对于转速 因为我们不是在尝试做到实际准确度 我们只想让它在这个场景中看起来 相适宜 我们把它设为四 我认为设为四挺好的 现在因为月球被地球潮汐锁定了 我们希望月球能与轨道对齐 因此我们选择对齐到路径 现在方向仍然是逆时针方向
让我们试一下 耶 动画看起来不错
现在环绕已经按我们的要求实现了 让我们开始旋转动作
为此我们要打开另一个旋转动作 让我们从太阳开始
方向跟以前一样 那么20秒 对于迭代次数 我觉得四次不错
方向相同 因此是逆时针方向
如果我们点击播放 我们可以看到旋转的速度不错
好的 现在让我们引入序列中的 最后一个动作 即地球的旋转
我们要创建另一个旋转 我们选择地球 相同的持续时间
因为我们想让地球比太阳的 迭代次数多 在这个例子中让我们把它设为十 对于方向 再一次 逆时针方向
让我们试一下 耶 看起来很好 现在我们的动作序列完全展示出来了 让我们尝试播放整个动作序列 我们可以按动作序列页眉中的 播放按钮上的播放
我们可以在这里看到只有地球在移动 那是因为动作序列的播放是 按次序播放所有动作 一个接一个 然而我们想在这里 并行运行所有这些动作 为此我们可以使用拖放 拖动不同的卡把它们叠起来
这样做 我们就能创建有四个动作的一个群组
现在让我们继续并尝试… 谢谢
现在让我们继续并点击播放 看看所有行为同时播放时怎么样
我们可以看到 现在所有环绕和旋转动作 正在同时播放 并且地球环绕太阳移动时 场景中还出现文本和光线
好的 让我们返回到演讲中
在Reality Composer中 把一些交互和行为 引入到你的场景中就是如此简单 现在让我们讲物理
为了创建优秀的沉浸式AR体验 你需要让你的对象 跟在现实世界中一样 你需要让你的对象跟实际的对象 一样移动 为此我们需要利用 Reality Composer中 这个强大的物理引擎
让我们看一下
这是一个你可以 在Reality Composer中 使用物理引擎创建的一个场景的示例 我在这里使用了物理引擎 球体因为重力作用正在下落 然后它碰撞拦截棒 最后一旦它弹到绿色方框 我们就显示这个赢家文本
让我们看一下该如何创建这种场景
有三种方式可以影响 你场景中的物理模拟
各种不同的材料将定义 对象与场景及其它对象之间的交互
通过力量动作和重力 我们可以定义如何在你的世界中 播放力
通过碰撞触发器和碰撞形状 你可以定义碰撞力学 如何在物理模拟中发生
让我们从材料开始看
在Reality Composer中 你可以使用六种不同的材料
你需要定义场景材料和对象材料
假如你使用了对象材料 使用冰作为对象材料 这将使你的对象滑过场景 如果你使用橡胶 对象将变得更有弹性
现在让我们讲一下力 (力) 默认情况下你所有的场景 都启用了重力
并且重力值将为设为地球的重力值 但你可以把那个值修改为 任何你想要的值
使用力动作 你可以赋予你的对象一个初始刺激 你要定义一个方向 要给对象施加多少速度 你可以创建这种行为 你可以在用户轻触对象时 给对象添加力
(碰撞) 现在你的对象有了材料 可以受力了 是时候让它们相互碰撞了
默认情况下 在Reality Composer中 所有对象都不参与物理模拟 如果你想让对象与其它对象发生碰撞 你需要设置碰撞动作 如果你想让对象按物理模拟进行移动 你需要设置模拟动作 在这里你可以看到在默认情况下 碰撞和模拟选项是如何影响 场景中的对象的
碰撞力由场景中的 对象的形状决定 在Reality Composer中 你可以使用三种不同的形状 分别是方框、球体和胶囊
这些形状将决定你的对象 如何在场景中移动 以及如何与其它对象及锚点相碰撞
使用碰撞触发器 你可以创建这些行为 在这里我们有一个 球体和方框的碰撞触发器 那样我们可以检测到用户 是否赢了游戏 并显示赢家文本
关于Reality Composer中的物理 我们就讲这么多了 现在我想把舞台交给 我的同事Abhi 他会讲如何使用 Reality Composer创建app
Abhi?
(创建app)
大家好 我是Abhi 今天来到这里我感到非常激动 在演讲的上半场我们了解了如何用 Reality Composer 创建优秀的3D体验 然后通过行为让体验鲜活起来 现在让我们了解一下如何 把那些AR体验 集成到我们的app中
我们提供三种不同的方式 第一种是直接在Xcode中创建 一个新RealityKit AR 或游戏模板
第二种是从Reality Composer中 创建一个新项目 第三种是从Reality Composer中 导出一个Reality文件 然后把它包含到你的app内
让我们先讲一下两个必需文件 Reality Composer 项目和Reality文件 我们要从Reality Composer项目 开始讲 这是Reality Composer的项目文件 它自动包含RealityKit AR 和游戏模板 你可以直接在Xcode内预览它 我们集成了Xcode 并且在Xcode的创建过程中 Xcode自动把你的Reality Composer 项目导出为Reality文件
在这里我们可以看到我们的 Reality Composer项目 在Xcode 11中 我们可以预览它 我们还可以预览每一个场景 在右上角 我们可以看到一个 “在Reality Composer中打开”按钮 这将直接从Xcode中启动 Reality Composer
正如我刚才提到过的 如果你在创建 Xcode app的过程中 有Reality Composer项目 我们将自动为你生成 Reality文件 它包含在你的app中 跟其它资源一样 你可以用同样的方式访问它 那么什么是Reality文件? 这是一个中心对象 关于你将如何使用你的app 以及你将如何运用你的AR体验 它包含渲染和模拟所需要的全部数据 并且它对 RealityKit进行了优化 正如我刚才所说过的那样它是 从Reality Composer中导出的文件 并且在项目创建过程中 Xcode会自动导出它
你使用Reality文件的方式是 要么直接在app中引用 要么在AR Quick Look中预览它 我们推荐你们参加 明天举办的AR Quick Look改进演讲 以了解更多信息
让我们再深入一些 什么是Reality文件? 因为这是由Reality Composer 导出的文件 它将包含你在 Reality Composer中 所创建的每一个场景 比如这里有两个场景 它还包含你在app中所创建的 每个对象
当我们在Reality文件中 思考场景时 我们把场景看作一个锚点 具体的说是一个锚点实体 因此这包含比如 你在Reality Composer中 设置的水平锚点信息
因此我们认为使用 Reality文件的 一个最大的困难是 能用字符串进行访问 我们既有Reality Composer项目 又有Xcode项目 我们想引入一种方式 可以轻松地处理它们 几乎就像是一个对象一样 因此我们决定通过Xcode中的 代码生成实现
代码生成将 分析Reality Composer 项目的结构 并生成一个对象 一个实际对象 你可以在你的app中使用 比如说 这里是我们的太阳系 Reality Composer项目 我们自动生成了一个太阳系对象 你可以在你的app中使用
为你生成的代码是一个 app API 用于你的场景 用于Michelle 刚提到过的命名实体
用于通知动作和通知触发器 稍后我们再讲最后两个用法
代码生成 和使用AR体验的第一步是 为你所关心的一切命名 重点是直接在Reality Composer中 进行命名 你可以在配置下的设置面板中实现 比如我们给太阳 我们所导入的太阳 USDZ命名为太阳 我们将使用这个名称在代码中访问它
如何把我们的Reality Composer 项目转换为 我们可以使用的一个对象呢? 在顶层 我们的Reality Composer项目成为 比如说solarsystem.swift 我们的场景成为有锚点的一个实体 这非常重要 因为这意味着当你加载它时 你可以直接把它添加到场景的锚点中
此外 你所设置的任何对象 都将转化为实体 这些是你可以使用的真正的 RealityKit实体 你可以用完全相同的方式使用它们
此外 我们还提供两种不同的 场景加载方式 一种是同步加载 一种是异步加载
让我们看一下同步加载 Reality文件 我们还以太阳系作为我们的例子 我们要加载 seasonsChapter 我们只需要一行代码就能实现 我们可以说 solarsystem.load seasonsChapter 这将会给我们返回一个锚点 然后我们把它添加到我们的视图中 超级简单
接下来如果我们想异步加载 seasonsChapter 或任意场景 我们可以使用比如 solarsystem.load seasonsChapterAsync 我们将得到一个结果对象 我们可以处理成功的情况 我们得到了锚点 或我们可以处理失败的情况 并给用户显示错误
此外 如果我们想访问场景中的 命名实体 我们可以很简单地调用比如 seasons.sun .earth和.moon 这将使我们可以访问我们在 Reality Composer中所命名的实体 这跟其它对象一样
把Xcode中的代码生成 和Reality Composer 结合在一起 我们可以在我们的app中 加载我们的AR体验 只需要两行代码就能实现 第一行代码是加载Chapter 或加载我们的场景 第二行代码是把它添加到 我们的视图中 超级简单 (Xcode中的代码生成)
这是Xcode中的代码生成 我们还提供一种 访问Reality文件的方式 比如如果你正在从服务器上下载内容 并且你想在app中显示内容 为此 我们有 RealityKit API 要同步加载Reality文件 你首先需要获取URL 就像你app捆绑包中的 其它资源一样 接下来
使用 entity.load锚点方法 传递资源的URL 以及你要加载内容的场景名称 这将给你返回一个你可以使用的锚点 或者你还可以使用 entity.load 加载实体树 不需要锚点信息
要异步加载Reality文件 也有一种方式可以实现 第一步完全相同 获取资源的URL资源
使用 entity.load锚点异步 传入URL 和你要加载内容的场景名称 这将给你提供一个加载请求 使用新的合并框架 我们可以收到一个完成 然后收到值 值包含我们要加载的锚点 从而你可以把这个 放到你的AR视图场景中
访问实体 你可以通过 anchor.find实体实现 然后传入你要加载的对象的名称 比如太阳、地球和月球 使用Xcode中的代码生成 和RealityKit把AR体验 引入到你的app中就是如此简单
接下来我们讲我们的app 如何与我们的AR内容进行交互 我们可以直接在 Reality Composer内 创建优秀的体验 但我们该如何使用它呢? 正如Pau刚才提到的那样 我们给你们准备了很棒的内置动作集 但你可能想定义自己的动作 为此我们创建了通知动作 你可以在Reality Composer中 设置这个动作
它与你的其它动作序列一起被调用 次序完全相同 比如如果它属于某个动作序列 那么将在那个序列中调用它
你的app代码中有一个 可设置的闭包 你可以定义这个动作的实施
就像通过代码生成访问一个实体一样 通知动作也可以通过对象进行访问
在Reality Composer中 我们在这里设置了一个通知动作
我们赋予它一个标识符 这是我们要在代码中使用的标识符 用于引用我们的通知动作 并提供一个自定义实施
在我们所生成的对象的结构中 动作位于场景对象内的能源旁边 在这里我们有动作和属性动作
在动作类内 你可以看到多个通知动作 动作名称是你赋予通知动作的标识符 你可对这些进行访问就像访问所加载 的anchor.actions 和你所关心的动作名称那样简单 此外 我们还生成一个全部动作数组 你可以实现很棒的功能 就像Swift中的其它集合一样 你可以对它进行筛选、迭代 只要你能对Swift中的 数组做的操作 都可以在这个全部动作属性上实施
要设置通知动作的实施 你首先需要通过警告锚点获取它 比如 seasonschapter.actions.display 地球详情 然后提供自定义闭包 因此.onaction 你将在这个闭包内得到的返回是 你在Reality Composer中 所设置的目标实体
另一方面 要启动动作序列 并提供一种实现方式 我们有一些很棒的内置触发器 比如场景开始和接近 但有时候你可能想提供自定义触发器 比如选择一个控制片段或轻触按钮 为此 我们提供通知触发器
你可以在Reality Composer中 设置通知触发器 它会开始一个动作序列 或拥有同一个标识符的多个动作序列
它要在app运行时发布 与通知动作一样 它是可访问的 在代码中按名称充当你的实体
你可以直接在你的行为内 设置一个通知触发器 在这里我们赋予它一个 标识符“显示金星” 我们将在代码中使用这个名称
跟动作一样 在所生成的代码中 通知触发器位于实体旁边
在一个新的通知对象类内
在通知内 跟通知动作一样 你将有与名称对应的 通知触发器 名称是你在 Reality Composer中 赋予那些通知触发器的标识符 与通知动作一样 你也有一个数组 你可以对它进行筛选或迭代
这叫做 allNotifications
你可以通过调用发布方法 发布一个通知触发器 这将启动一个动作序列 或拥有相同名称的多个序列
你还可以传入一个可选的重写集 如果你想复制一个实体 并仅动态地调用新实体的动作序列 这个办法非常好用 重写将把 Reality Composer 中动作的初始目标的名称作为一个键 然后你传入新目标 当动作序列运行时 它只把新实体作为目标
让我们这些总结在一起 然后在Xcode中查看一下 (演示)
这是我的app 这是在演讲进行过程中 Pau和Michelle 所创建的太阳系课程的季节篇章 在这里我想实施第二个篇章 根据不同天体的尺寸 这是我们的Xcode 11 有我们的基础app 我们已经包含了我们的 Reality Composer项目 再一次 你可以创建一个新AR 或游戏模板 或你可以把Reality Composer项目 直接拖到Xcode中
我们可以直接在Xcode中… 预览项目… 并继续在 Reality Composer中打开它
在我们写任何代码之前 让我们先快速操作一下这个过程 在我们的篇章中 我们设置了一些实体 我们给场景赋予了一个名称 我们给我们所关心的不同实体 都赋予了名称 比如这个金星叫做 Sepcial Star 这个名称是我们要在代码中 使用的名称
此外我们还设置了一些行为
比如对于月球 我们想了解月球何时被轻触了 因此我们可以存储一些app状态
同时隐藏所有其他文本标签 并仅显示月球的标签 这些动作都是同时发生的 因为它们属于一个群组
此外我们还有一个通知动作 我们将在我们的app内 用通知动作来了解 月球何时被轻触了 我们也对地球和太阳实施了 同样的动作序列
我们还设置了一个 Look At摄像头动作 当场景开始时 每个文本标签都将面向摄像头 无论我们在看哪儿
并且我们有一个 “开始时隐藏”动作序列 那将隐藏我们只想在特定时间 看到的所有实体 比如Chapter Completed 文本和文本标签
此外我们有一些动作序列 将在代码中被触发 我们稍后会在这个演示中看到 那会把天体的尺寸调整为 它们的相对尺寸
把它们的尺寸调整到同一个尺寸…
显示 Chapter Completed文本 开始地球环绕 并隐藏全部其它天体 我们有一个很酷的小动画… 是从通知触发器中触发的
那将显示金星 旋转它 并给它一个弹跳动作
现在让我们返回到 Xcode app
快速地操作一下 这个app非常简单明了 它是个单一视图的app
在顶层我们有一个AR视图
一个分段的控制 用于切换尺寸和详情视图
一个课程完成按钮 从而学生可以说我已经完成课程了 并在最后浏览篇章
在详情视图中 当我们轻触月球、 地球和太阳时 会显示更多的详情
此外我们有一些视图模型 那将驱动详情视图 因此它只显示一些文本… 然后有一些基本的app逻辑 用于开始加载 让我们首先看一下加载
在这里你注意到的第一件事是… 我们在这个项目中使用了代码生成 因此我们的 Reality Composer项目 将被自动转化为 我们可以使用的一个对象 它是个真正的类型 我们可以直接在这里把它用作 尺寸篇章的属性
比如太阳系 lesson.size篇章 就是我们可以使用的一个真正的类型 我们可以继续… 并加载我们的场景… 让我们一起来看一下这段代码 我们正在做的是异步加载尺寸篇章
然后进行处理 并提供所加载锚点的碰撞形状 从而可以让轻触触发器发挥作用 然后我们把它添加到我们的场景中 因为我们稍后才使用尺寸篇章 我们要把它存在尺寸篇章属性中 我们要设置通知动作 我们稍后再用 目前并没有挂钩起来 让我们继续并运行一下 我们可以看到仅通过几行代码 我们就引入了我们的实体AR体验 并且它应该与Reality Composer中的 运作方式一模一样
好了 我们有场景了 我们看到内容 比如Chapter Completed 隐藏起来了 当我们轻触每个天体时 我们看到文本自动显示出来 并且它面向摄像头 无论我们正在看向哪里
跟太阳一样 看起来很不错 只需要几行代码 我们就把整个Reality Composer项目 引入了Xcode中 超级简单 接下来我要做的其实是 填充这个详情视图 你可以注意到当我轻触太阳时 比如说 其实并没有填充详情视图 让我们返回到Xcode中… 并填充通知动作
因为我们的通知动作是自动生成的 我们还得到一个可以进行筛选的 全部动作数组 我们将对这些动作进行筛选 只获得我们所关注的动作 即以display开始的动作
让我们看一下这段代码
因为我们在尺寸篇章设置了通知动作 我们可以返回到Reality Composer 去看一下
对于这里的每一个天体 月球、地球和太阳 显示月球详情、 显示地球详情和显示太阳详情 我们可以在代码中访问这些 我们实际上想筛选通知动作 只筛选以display开始的动作 因为我们想给每一个display动作 都设置同一个闭包
因此返回到Xcode中 这是我们目前正在做的 我们正在执行size chapter.actions .all actions 我们对它进行筛选 从通知动作对象中获得标识符 并检查标识符是否以 display开始
接下来我们迭代所有 display动作 并给每一个使用on-action 属性的动作设置同一个闭包
我们要获取通知动作的目标 在这个例子中 对于月球来说是月球 对于太阳来说是太阳 对于地球来说是地球
并使用那个实体来显示 不同的视图模型
让我们现在运行一下app
当我们轻触每个天体时 我们希望看到不同的视图模型
好了 我们有内容了 现在当我们轻触月球时 因为我们已经设置了通知动作 并且我们观察那些通知 我们现在可以在底部这里看到 月球详情 当我们轻触地球时可以看到地球详情 当我们轻触太阳时可以看到太阳详情 看起来非常棒
我们还保持着某种状态 当我们轻触全部三个天体地球、 太阳和月球动作时 我们只是要确保 调用了三个不同的动作 并在右上角显示一个课程完成按钮
现在我们要做的是使用通知触发器 启动我们在Reality Composer中 设置的 调整为相对尺寸 以及调整为动作序列的同一尺寸 通过使用顶部的分段控制 和右上角的按钮实现
我们可以使用segmentedControl ValueChanged方法实现 这是一个界面创建器方法 我们就在界面创建器中 设置和挂钩了这个方法
使用我们的通知动作触发器 我们可以启动我们在 Reality Composer中设置的 调整为同一尺寸动作序列
那将把每个天体尺寸重新调整到 100%初始尺寸
当选中尺寸分段控制之后 我们可以把太阳的尺寸调整为 对地球的相对尺寸
为此我们可以启动…
调整为相对尺寸动作序列
最后当轻触课程结束按钮时 这是我们所设置和挂钩的 界面创建器动作
我们将启动Chapter Completed 通知触发器 它所执行的操作是 因为Reality Composer中 有三个不同的通知触发器 我们将触发全部三个动作序列 我们将淡出现有内容
然后开始小地球和小月球的环绕
我们将显示 Chapter Completed
让我们现在运行一下 看看我们的app
好的 在这里我们有内容
我们可以轻触月球 一切都… 跟我们在Reality Composer中 所设置的完全一样 现在当我们轻触尺寸分段控制时 当我们看地球和月球时 我们就可以很好地了解 相对于地球来说太阳到底有多大 地球非常小
看起来很不错 让我们把它的尺寸调回去 让我们结束课程 我要轻触课程完成 位于右上角的完成课程按钮
我们可以看到内容淡出了 并且我们看到 Chapter Completed 并且地球和月球开始环绕小太阳移动 看起来很不错 我们可以看到如何在app中使用 通知触发器和通知动作 来处理我们的AR内容 我们还有最后一件事要做 我们提到过用重写进行发布 我想告诉你如何使用重写 来显示使用了app状态的动态内容 因为这是一个课程app 我们想根据学生的表现显示金星
对于这场演讲来说 我觉得我们做的非常不错 因此我要给我们三颗星 我们可以看一下如何进行设置 这个方法是我们要在上边的 显示详情视图内调用的方法 我们要在这个方法中保持状态
看起来我刚传入了许多代码 但让我们来看一下吧 我们要做的第一件事就是访问 我们在Reality Composer中 所设置的Special Star实体
就在这里
我们赋予它一个名称是Special Star 我们现在要直接在Xcode中访问它
接下来我们直接在代码中 触发显示金星动作序列 从而可以显示第一颗金星 但我们想显示三颗 因此我们可以分派实现 对于这个演示来说 也许可以在两秒半之后显示 我们要克隆星星
我们要把它放在右侧稍微靠上一些 我们要把它添加到我们的场景中
然后使用发布重写 我们传入动作序列的初始目标 然后传入新动作以及动作的新目标 在这个例子中是右侧的星星 我们想对左边的星星做同样的操作 我们再次复制它 复制星星 把它放在左边稍微靠下一点的位置 把它添加到我们的场景中 再一次 发布重写 获取初始名称 并且这一次传入左侧的星星 作为动作序列的目标
让我们现在创建并运行这个app 我们希望能看到三颗金星 即使我们只在app中设置了一颗 这完全是由app逻辑驱动的
又是我们的场景 我们可以完成课程
我觉得我现在已经完成了 因此我要点击…
完成课程 我们看到出现了一颗金星
然后出现第二颗金星 然后是第三颗金星 我们做的很棒 因此我们得到了三颗金星
因此把AR内容 加载到app中非常简单 先使用通知动作来提供自定义实施 然后使用你在 Reality Composer中 使用通知触发器设置的 触发器动作序列
让我们总结一下我们今天讲过的内容 我们了解了 Reality Composer 我们可以使用内置的模块化资产 创建优秀的AR体验 比如球体或立方体 然后我们使用行为和简单的交互
把那些资产变得鲜活起来 最后我们通过代码生成 和深度集成Xcode 把那些优秀的AR体验 引入到我们的app中 我们已经看到你们使用 Reality Composer 所创建的一些很棒的东西了 我们鼓励你们继续创建 能看到你们即将要创建的 很棒的AR app 我们感到非常激动
今天和明天 还有一些演讲和演讲 我们鼓励你们带上你们的问题 带上你们的项目 带上你们需要带的一切来参加 我们非常乐意帮助你们 祝你们度过一个愉快的WWDC 谢谢大家
-
-
正在查找特定内容?在上方输入一个主题,就能直接跳转到相应的精彩内容。
提交你查询的内容时出现错误。请检查互联网连接,然后再试一次。