大多数浏览器和
Developer App 均支持流媒体播放。
-
探索 ARKit 5
使用 ARKit 5 构建下一代增强现实 app。探索如何在其他区域使用位置锚定,以及如何更轻松地引导用户体验您的基于位置的 AR 功能。了解有关面部跟踪和动作捕捉的更多信息。同时探索在现实世界中放置 AR 内容的最佳实践。我们还将展示如何将轻 App 代码集成到您的 AR app,以便轻松发现和精确定位虚拟内容。
资源
- ARKit
- Explore the ARKit Developer Forums
- Human Interface Guidelines: App Clip Codes
- Interacting with App Clip Codes in AR
- Tracking Geographic Locations in AR
相关视频
WWDC22
WWDC21
WWDC20
WWDC19
-
下载
大家好 我叫大卫 是ARKit团队的工程师 今天克里斯托弗和我会分享 ARKit 5的广泛改进 我们很期待能讨论iOS 15 即将到来的改变 今年 我们在各方面都做了许多升级 我们也会讨论许多功能 在这之前 我们想要展示 你们一直以来用激光雷达打造的体验 我们已经见到各种用到激光雷达的 app 使用到了场景重建及深度API 包括效率类app、照片滤镜特效、娱乐 甚至是你们可以在客厅玩的游戏 我们很高兴见到 ARKit社群展示的创意和机智 你们在创造这些app时 我们也在努力 为你们带来世界上 最棒的增强现实(AR)框架 并突破可能实现的疆界 让我们来看看ARKit 5 即将出现的改变 首先 我们会分享 位置锚点的一些更新 和最佳实践 这能让用户 在现实户外位置体验AR 接下来 我们会讨论 App Clip Code 这是一种探索 App Clip 的绝佳方式 也能让你在AR中放置你的内容 我们会特别强调我们在 利用新iPad Pro上的 超广角前置摄像头的 人脸跟踪方面做的一些改进 最后我们会讨论ARKit 动作捕捉方面的一些提升 我们会从位置锚点开始讨论 我们一直在改进这方面 来拓展区域支持 并提供生活品质上的一些改进 我们也会建议一些适用于创造 应用程序的最佳实践 位置锚点是去年引进的 用途是让AR内容 可以被放置在特定经纬度上 它们的目的是让AR体验的创建 与地理位置绑在一起 我们来看个例子吧 这是ScavengAR应用程序里的 New Nature体验 是利用位置锚点API建构的 ScavengAR支持 现实位置上的AR内容 使虚拟公共艺术的 设置及活动能够成功创建 这是个好例子 显示位置锚点能够 随着全世界重新开放来增强户外体验 地图app也引进了一种在iOS 15 使用这种API的新AR功能 我们来看看吧 今年地图加入了以AR显示的逐向导航 步行路线 就是使用位置锚点API 里面整合了几项我们建议的实践 我们稍后会讨论这几个部分 来展示你能怎么建构很棒的应用程序 现在我们已经看到一些样本 我们来摘要说明 我们能怎么使用位置锚点来创建它们 要从设置 GeoTrackingConfiguration 开始说起 首先 确认设备是否支持这项功能 位置锚点需要A12或更新的芯片 蜂窝网络及GPS支持 接着 启动之前 确认该位置 是否可以使用这项功能 设备所有者必须批准 相机和位置权限 有需要的话 ARKit会要求权限 去年的发布会介绍ARKit 4 和示例工程 《在AR中跟踪地理位置》 更深入地说明 这些内容与API的用法 我们强烈建议你们熟悉一下 这两个资源 这个代码样本显示如何进行上一张 幻灯片提到的检查 它会询问设备支持 然后确认 该功能在当前位置是否可以使用 然后才会试着运行 GeoTrackingConfiguration 接着可以把GeoAnchors 加入ARSession 就跟其他类型的锚点一样 它们会用经纬度坐标来指定 也可以选择性用高度来指定 一定要监测GeoTrackingConfiguration 的状态 看看该功能是否已经定位 以及是否可能有问题还没解决 开发者网站有一个例子 显示了如何实现一个方法 来接收状态更新 检查设备位置附近的可用性 对于开启带有地理跟踪的应用程序 是很重要的 我们一直在努力支持更多地区 位置锚点起初发布时只限 五个都会区 然后自那时起 支持范围就扩展到美国各地 超过25个城市 我们也在努力把位置锚点推广到 全球各地的城市 我们很高兴宣布 在美国之外的第一个市场 位置锚点要到伦敦了 我们会随着时间持续努力 增加新的地区 如果你没有住在获得支持的都市区 你也可以开始使用录制和回放 来试验位置锚点 我们稍后会在这次展示中说明 想知道获得支持地区的名单 请随时查看 ARGeoTrackingConfiguration 的线上文件 由于愈来愈多地区可以使用位置锚点 我们意识到 需要有一种 通用视觉语言 来引导大家 为了提供一致的新手引导流程 我们增加了一个新的.geoTracking目标 来配合ARCoachingOverlayView使用 和现有的世界跟踪的叠加层类似 通过展示动画来协助用户获得良好体验 因为指导叠加层被用于 许多不同的AR app 包括地图 所以大家已经 在一定程度上熟悉它们 也知道如何反应 我们鼓励你们纳入指导叠加层 来降低这项功能的学习曲线 即使在使用指导叠加层的时候 我们也建议 你们监测.geoTracking的状态更新 这其中包括跟踪状态的详细信息 这是.geoTracking指导叠加层的样子 这个 UI指引用户把设备不要朝向 地面 而应该指向建筑外观 几秒之后 跟踪成功了 你的app就能放置与位置绑定的内容 用于展示这种动画的代码非常类似 用于其他指导叠加层的代码 独特的是为叠加层 引进.geoTracking目标 请确保设定这个目标 来展示正确的引导 我们已经看到指导叠加层能够如何 创建统一的新手引导流程 现在我们要来看看其他一些最佳实践 这会帮助你创建地理跟踪AR体验 我们的第一个建议是使用录制 和回放来促进更快的开发 ARKit会话能在使用 Reality Composer的设备上录制 你可以在App Store上 获得Reality Composer 这对于位置锚点特别有用 这样你就不需要常常出去测试了 它也允许你与位置遥远的创建者协作 录制内容可以 通过Xcode在设备上回放 为了避免不兼容问题 建议 使用相同设备及iOS版本 这也适用于其他类型的 ARKit应用程序 回放并不是位置锚点特有的功能 让我们来看看捕捉录制内容的过程 要进行录制 请打开 Reality Composer 点击右上角查看更多选项 然后打开开发人员窗格 选择“录制AR会话” 请确定位置服务已经启用 点击红色按钮来开始和停止录制 要回放录制内容 请把设备 连到运行Xcode的电脑 单击“Edit Scheme” 然后配置ARKit Replay data 选项 它在run配置项下面 接着运行应用程序 尽管录制及回放能有助于加速开发 但我们也推荐其他 用于内容放置的实践 以下是一段示范这些实践的视频 请注意这里的AR内容有多大 又有多清晰可见 信息的传达也不需要 与环境中的结构重叠 作为开发时间与放置精确性 之间的权衡 你可以考虑创建浮在空中的内容 而不是试图把内容 紧密叠加在现实对象上 我们还有几个有关 放置内容的建议 为了取得经纬度坐标来放置对象 请使用Apple地图app 并复制坐标 精确到小数点之后至少第六位 介绍ARKit 4的视频已经 显示过这方面的步骤 所以请参看该视频取得更多细节 创建应用程序时 也一定要 调整内容相对于位置锚点的高度 这是产出良好体验所必需的 如果app要求更精确的内容放置 请于设备在地理锚点位置的 50米内的时候 再添加地理锚点 如果ARKit放置锚点时 有精确的高度 它会更新锚点的高度源场 来显示锚点高度 CLLocation类有一个方法能用于 计算两点之间以米为单位的距离 这可以用来在添加锚点之前 先确认用户是否接近位置 我们关于位置锚点的说明到此结束 还有更多方法能在 使用ARKit 5的 app上放置AR内容 所以我要把镜头交给克里斯托弗 他会为你们提供更多说明 谢谢你 大卫 嗨 我叫克里斯托弗 我是ARKit团队的工程师 我很高兴能告诉你们 更多有关ARKit 5 其他新功能的事情 让我从ARKit的 App Clip Code开始吧 你们或许还记得 我们在去年的WWDC上 介绍过App Clip app clip是app的一小部分 能引导用户完成app的关联工作流程 却不需要安装整个app 由于文件很小 app clip 可以节省下载时间 并立即把用户直接带到 app的特定部分 也就是当下 与用户的内容高度相关的部分 我们也介绍了App Clip Code 这是让用户能在视觉上探索与启动 app clip的好方法 完全不需要前往App Store 这是App Clip Codes的外观 它们可以有各式各样的形状和色彩 身为开发人员 你可以创建 最符合你的设想的外观 你也能决定要在App Clip Code里 编码什么数据 以及哪个app clip 跟哪个代码有关联 所有App Clip Code都含有 一种视觉上可浏览的模式 有些App Clip Code 例如这里显示的红、蓝、橙色代码 也含有一个NFC标记 方便用户使用 人们可以用相机扫描代码 或者把手机靠近嵌入式NFC标记 来启动相关的app clip 现在 你也可以在AR体验中 辨识及跟踪App Clip Code 我们稍后会在本次说明会中 介绍这要怎么做 不过首先 让我们来看看 这个由Primer开发的 app clip 他们利用 一个App Clip Code 来启动AR体验 Primer跟Clay Tile合作 来向人们展示 在App Clip Code的帮助下 他们的样品在AR中会是什么样子 只要把你的iPhone和iPad 放在App Clip Code上 就能调用AR体验 现在人们可以在墙上预览磁砖花色 完全不需要下载app 挺酷的吧? 所以 从iOS和iPad 14.3开始 你可以在AR体验中 侦测和跟踪App Clip Code 请注意 App Clip Code跟踪 需要设备具有 A12 Bionic处理器或更新版本 例如iPhone XS 让我们来仔细看看 如何在ARKit中使用App Clip Code 在iOS 14.3 我们引进了一种新型 ARAnchor 叫做 ARAppClipCodeAnchor 这个锚点具有三种新属性 嵌入App Clip Code的URL URL解码状态 还有App Clip Code 以米为单位的作用范围半径 让我来解释一下 每个App Clip Code都有一个URL 这个URL会被解码 来展示正确的内容 解码URL不是实时的 ARKit能迅速侦测 App Clip Code的存在 但ARKit可能花稍微较久时间 来解码URL 取决于用户 跟代码之间的距离 以及其他因素 例如照明强弱 这就是为什么 App Clip Code锚点 含有一个.decoding状态属性 而且它的状态有三种 初始状态.decoding代表 ARKit还在解码URL 只要ARKit成功解码了URL 状态就会转换成.decoded 无法解码URL的时候 状态则会转换成.failed 举例来说 这种情况 可能发生在有人扫描了 一个跟app clip不相关的 App Clip Code 要使用App Clip Code跟踪 你应该先检查 设备是否支持这项功能 请记得App Clip Code跟踪只在 具有A12 Bionic处理器或 更新版本的设备上才有支持 然后在你的配置上设置 appClipCodeTrackingEnabled为true 然后运行会话 要读取App Clip Code的URL 请监测AR会话的didUpdate anchors 回调 并检查任何已侦测到的 App Clip Code锚点的解码状态 ARKit在解码App Clip Code时 你或许想要在App Clip Code上方 展示占位符可视化 来提供 用户立即反馈 也就是App Clip Code 已被侦测到 但仍需要进行解码 正如之前提到的 解码App Clip Code 也可能失败 比如有人把手机指向 不属于自己的app clip的 App Clip Code 我们建议你在这种状况下也提供反馈 只要App Clip Code被解码了 你就能访问它的URL 并开始展示 这个App Clip Code的正确内容 比如说 在稍早你看到的 Primer app clip案例中 URL含有 关于展示哪种磁砖花色的信息 只要App Clip Code被解码了 问题就是 你该在哪里展示 与这个代码有关的内容呢? 有个选项是直接在 App Clip Code锚点上方展示 不过 依据你的用途 App Clip Code本身 可能不是展示内容的最佳位置 所以 你可以把内容放在 App Clip Code附近的 一个固定相对位置 想让这种做法有很好的效果 可以把App Clip Code 印在某个物件上 例如一台咖啡机 而且你可以在机器按钮上方 展示关于如何操作的虚拟指令 或者你可以结合App Clip Code跟踪 及ARKit支持的其他跟踪技术 例如图像跟踪 让我们来看看这种做法的一个实例 你接下来看到的视频和代码是以 “Interacting with App Clip Codes in AR”样本代码为基础 你可以在developer.apple.com上 下载这个代码 你现在看到的是该样本AR体验的 一段录制内容 首先 我打开相机app 扫描一包向日葵种子 或许我在一间园艺店里购物 试图决定该买什么植物的种子 iOS辨识出包装上的 App Clip Code 然后启动关联的 Seed Shop app clip 我在这里再次扫描App Clip Code 然后长成的向日葵 就出现在种子包装上 请注意app clip使用了 整个种子包装的 图像跟踪 并把向日葵放在上面 这种做法在这个案例中很合理 因为人的注意力最有可能放在 整个种子包装上 而不是 右上角那个小小的App Clip Code 但要是有人想看看植物在自家花园里 生长的样子呢? 这是可能看起来的样子 我们看到 当code第一次 被扫描时 它调用了 一个app clip下载 然后当同样的code从app clip内 再次被扫描时 它会把code 跟向日葵种子包关联起来 接着点击在草地上 就会让一株向日葵出现在那里 如果app clip看到的是 玫瑰种子包上的code 它会在草地上显示一株玫瑰 请注意 app clip应该 只含有一个工作流程 但这个app clip能提供 一个按钮来下载 完整的Seed Shop app使用户体验 能在自家空间中预览的其他植物 请记得 App Clip Code跟踪 也能在App Clip的父应用中运行 让我们来看看把向日葵放在草地上 所需要的代码 首先 你把tapGestureRecognizer 添加到视图 来侦测屏幕上的点击 当有人在屏幕上点击时 你可以投射射线到世界上 然后取回在他们设备前的 水平面上的结果位置 在我们的例子中 这会是那个人的草地 然后你抓取最后一个 被解码的App Clip Code URL 然后在草地上添加一个 新的ARAnchor 最后 你下载向日葵3D模型 在草地上展示它 现在 我们来谈谈ARKit的 App Clip Code 所呈现的一些最佳实践 app clip能被用于不同环境 以及不同用途 请考虑这对你来说是不是用来创建 NFC App Clip Codes的选项之一 我们建议在人们 能靠近 code 的环境中 使用NFC App Clip Code 使用NFC App Clip Code时 采用合适的行动文案 指引用户用设备触碰标签 或者 提供明确的方式来扫描code 最后但同样重要的是 你需要确保 你的App Clip Code 是以适合用户环境的大小印刷的 比如一间餐厅的菜单可能印在A4纸上 在那张菜单上 人们就适合 从至多50厘米的距离扫描 一个2.5厘米的App Clip Code 不过 电影海报通常大得多 可能有足够空间放置 一个12厘米的App Clip Code 人们可以从至多2.5米的距离 用手机扫描 请查看我们的人机交互指南 App Clip Codes的部分 了解更多关于 建议code尺寸的信息 以上就是你在ARKit 使用App Clip Code的方式 如果你想更深入探索 app clip和App Clip Code 请一定要观看 《关于App Clip的新内容》 和《建构轻巧快速的App Clip》 课程 现在我们跳到人脸跟踪的部分 人脸跟踪让你能识别 前置摄像头的人脸 在之上叠加虚拟内容 以及实时驱动面部表情 自从推出iPhone X之后 ARKit就产生 一大堆利用人脸跟踪的优秀app 从跟踪多人脸 到同时运行前后置摄像头的场景里 运行人脸跟踪 这些年内 这个API已经有许多进展 去年我们在没有TrueDepth传感器的 设备上引入人脸跟踪 只要它们有A12 Bionic 或更新版本的处理器就行 今年稍早 我们也推出了新的iPad Pro 它提供了 一个超广角的前置摄像头 让你能用于AR人脸跟踪体验 我们来看看吧 这里你看到的是 普通前置摄像头的视野 这个是新iPad Pro的 新超广角视野 差别真的很大 对吧? 请注意 你现有的app会继续使用 普通摄像头来进行人脸跟踪 如果你想要把你的用户体验升级到 新iPad Pro上的超广角视野 你需要检查哪些视频格式可用 并选择使用新的超广角格式 你能使用的做法是 迭代所有支持的视频格式 然后检查builtInUltraWideCamera选项 然后在你的AR配置上设置这种格式 并运行会话 有件需要注意的事 就是新iPad Pro的 超广角摄像头拥有的视野 比TrueDepth传感器大得多 因此 使用超广角视频格式时 你不会在ARFrame上得到 capturedDepthData缓冲区 最后但同样重要的是 我们来谈谈动作捕捉吧 自从动作捕捉在2019年推出以来 它已经实现了 真人在AR场景中的强大集成 例如驱动虚拟角色 以及用于2D和3D模拟 在iOS 15中 动作捕捉又变得更好了 在具有Apple A14 Bionic 处理器的设备上 例如iPhone 12 动作捕捉现在支持 各式各样的身体姿势 而且完全不需要改变代码 iOS 15上的所有动作捕捉app 都会从中受益 最明显的是 旋转比以往更加准确 帮助你更加精确地跟踪 体育活动的动作 另一个很大的改进是你的设备摄像头 现在能够从更远的距离跟踪身体关节 另外 四肢动作的跟踪范围 也有显著增加 让我们来看一个例子 这是我的同事艾勒 他用Driven2win这个app 跟踪自己的锻炼 iOS 15上的结果比以往更精确 回顾一下 ARKit 5带来 许多新功能与改进 位置锚点能在更多城市使用 并显示一个新的指导叠加层 App Clip Code跟踪能协助你 在app clip中 轻松探索并使用AR 以及精确放置你的虚拟内容 人脸跟踪在新iPad Pro上配合 新的超广角视野运行 而动作捕捉 添加更好的准确性及更大的动作范围 我很期待看到你们将会用ARKit 5 创建的所有精彩体验 [音乐]
-
-
3:29 - Geo Tracking Recap I
// Check device support for geo-tracking guard ARGeoTrackingConfiguration.isSupported else { // Geo-tracking not supported on this device return } // Check current location is supported for geo-tracking ARGeoTrackingConfiguration.checkAvailability { (available, error) in guard available else { // Geo-tracking is not available at this location return } // Run ARSession let arView = ARView() arView.session.run(ARGeoTrackingConfiguration()) }
-
3:42 - Geo Tracking Recap II
// Create Location Anchor and add to session let coordinate = CLLocationCoordinate2D(latitude: 37.795313, longitude: -122.393792) let geoAnchor = ARGeoAnchor(name: “Ferry Building”, coordinate: coordinate) arView.session.add(anchor: geoAnchor) // Monitor geo-tracking status updates func session(_ session: ARSession, didChange geoTrackingStatus: ARGeoTrackingStatus) { … }
-
6:02 - Geo Tracking Coaching Overlay
// Declare coaching view let coachingOverlay = ARCoachingOverlayView() // Set up coaching view (assuming ARView already exists) coachingOverlay.session = self.arView.session coachingOverlay.delegate = self coachingOverlay.goal = .geoTracking coachingOverlay.translatesAutoresizingMaskIntoConstraints = false self.arView.addSubview(coachingOverlay) NSLayoutConstraint.activate([ coachingOverlay.centerXAnchor.constraint(equalTo: view.centerXAnchor), coachingOverlay.centerYAnchor.constraint(equalTo: view.centerYAnchor), coachingOverlay.widthAnchor.constraint(equalTo: view.widthAnchor), coachingOverlay.heightAnchor.constraint(equalTo: view.heightAnchor), ])
-
8:53 - GeoTracking Distance Method
// Method to compute distance (in meters) between points func distance(from location: CLLocation) -> CLLocationDistance
-
12:16 - App Clip Code: check device support
func viewDidLoad() { // Check device support for app clip code tracking guard ARWorldTrackingConfiguration.supportsAppClipCodeTracking else { return } let worldConfig = ARWorldTrackingConfiguration() worldConfig.appClipCodeTrackingEnabled = true arSession.run(worldConfig) }
-
12:34 - Accessing the URL of an App Clip Code
/// Accessing the URL of an App Clip Code override func session(_ session: ARSession, didUpdate anchors: [ARAnchor]) { for anchor in anchors { guard let appClipCodeAnchor = anchor as? ARAppClipCodeAnchor, appClipCodeAnchor.isTracked else { return } switch appClipCodeAnchor.urlDecodingState { case .decoding: displayPlaceholderVisualizationOnTopOf(anchor: appClipCodeAnchor) case .failed: displayNoURLErrorMessageOnTopOf(anchor: appClipCodeAnchor) case .decoded: let url = appClipCodeAnchor.url! let anchorEntity = AnchorEntity(anchor: appClipCodeAnchor) arView.scene.addAnchor(anchorEntity) let visualization = AppClipCodeVisualization(url: url, radius: appClipCodeAnchor.radius) anchorEntity.addChild(visualization) } } }
-
15:34 - Adding a gesture recognizer
/// Adding a gesture recognizer for user interaction func viewDidLoad() { initializeARView() initializeCoachingOverlays() // Place sunflower on the ground when the user taps the screen let tapGestureRecognizer = UITapGestureRecognizer( target: self, action: #selector(handleTap(recognizer:))) arView.addGestureRecognizer(tapGestureRecognizer) }
-
15:45 - Tap to place the sunflower
func handleTap(recognizer: UITapGestureRecognizer) { let location = recognizer.location(in: arView) // Attempt to find a 3D location on a horizontal // surface underneath the user's touch location. let results = arView.raycast( from: location, allowing: .estimatedPlane, alignment: .horizontal) guard let firstResult = results.first else { return } // Fetch the last decoded app clip code URL guard let appClipCodeURL = decodedURLs.last else { return } // Add an ARAnchor & AnchorEntity at the touch location let anchor = ARAnchor(transform: firstResult.worldTransform) arView.session.add(anchor: anchor) let anchorEntity = AnchorEntity(anchor: anchor) arView.scene.addAnchor(anchorEntity) // Download the 3D model associated with this app clip code. downloadAndDisplay(appClipCodeURL, on: anchorEntity) }
-
18:33 - Checking for supported video formats for face tracking
// Check if the ultra wide video format is available. // If so, set it on a face tracking configuration & run the session with that. let config = ARFaceTrackingConfiguration() for videoFormat in ARFaceTrackingConfiguration.supportedVideoFormats { if videoFormat.captureDeviceType == .builtInUltraWideCamera { config.videoFormat = videoFormat break } } session.run(config)
-
-
正在查找特定内容?在上方输入一个主题,就能直接跳转到相应的精彩内容。
提交你查询的内容时出现错误。请检查互联网连接,然后再试一次。