2019年WWDC的《 Session 604 - Introducing ARKit 3 》 主要内容速览:
- People occlusion:人体遮挡,原理介绍,Demo 演示.
- Motion capture:动作捕捉介绍,Demo 演示.
- 同时打开前后摄像头
- 多人协作
- 用户引导 UI
- 多个面容追踪
- 其他改进
回顾与概览
ARKit 已经使苹果成为国内最大的 AR 平台,使用者数百万。也诞生了很多好玩的 AR 应用和游戏,比如 AR 版《愤怒的小鸟》。
今年,苹果带来了更多的新特性,来帮助大家更快构建优质 AR 应用。
People occlusion(人体遮挡)
在以前的 ARKit 中,如下面的场景,当我们将 AR 物体放在场景中时,由于 AR 物体显示的层级最高,会遮挡住其他物体和人,但这明显不符合真实场景的透视规律。严重影响了 AR 的真实效果。
今年 ARKit 3 带来了人体遮挡技术,它能很好的解决这个问题。效果如下图:
它的原理,就是利用机器学习的分割技术(Segmnetation),将人体从画面中分离出来,并显示在 AR 物体之前。
但是这样仍然有问题,因为场景中实际上是一个人在 AR 物体前,另一个人在 AR 物体后。因此简单地将所有人物显示在 AR 物体前,又会造成新的问题:后面的人错误遮挡了 AR 物体。
对此,ARKit 3 也有解决办法:采用带有深度信息的分割技术(Segmentation+Depth),将不同人物通过深度信息分离开来,然后正确地显示出人物和 AR 物体的遮挡关系。
需要说明的是,人体遮挡并不是只对完整人体形状进行识别,部分遮挡同样也能正确处理,比如手部的遮挡:
简单总结一下People occlusion(人体遮挡):
- 可以让虚拟物体渲染在人物后面
- 支持多人场景
- 支持完整或部分人体
- 支持 ARView(RealityKit框架)和 ARSCNView(ARKit框架)
- 深度信息估计
- 仅支持 A12 及之后处理器
代码:
首先,可以调用 API 确定是否支持 AR 的语义分析。
如果能确认场景中的人物不会出现在 AR 场景后面,只能在前面(比如绿幕),那就可以用
personSegmentation
选项。如果不确定人物的位置,则使用personSegmentationWithDepth
选项。
另外,如果希望拿到人体相关 buffer 信息,深度相关 buffer 信息,自己进行处理的话,也可以拿到相关像素数据:
Motion capture(动作捕捉)
动作捕捉在以前需要使用专用设备来录像,但现在只需要用 iPhone+ARKit 就能实现动作捕捉,并用捕捉到的动作驱动虚拟人偶运动。
ARKit 3 同时提供 2D 和 3D 版本的骨骼模型点位
动作捕捉特点:
- 同时以 2D 和 3D 来追踪人体
- 提供骨骼呈现点(skeleton representation)
- 可以驱动一个虚拟角色
- 支持 A12 及之后
2D 追踪,支持世界追踪,图片追踪和朝向追踪配置
对于 3D 追踪,提供 3D 坐标及骨骼模型大小估计
注意:图中白色部分的叶子节点,并没有被真实追踪,他们的位置只是被估计的,并相对于父连结点不变。比如,手部,脚部,手指。
代码:
在 RealityKit 中驱动一个虚拟模型也非常简单,rigged mesh 可以从官网下载
// Animating a 3D character with RealityKit
// Add body anchor
let bodyAnchor = AnchorEntity(.body)
arView.scene.addAnchor(bodyAnchor)
// Load rigged mesh
Entity.loadBodyTrackedAsync(named: "robot").sink(receiveValue: { (character) in
// Assign body anchor
bodyAnchor.addChild(character)
同时打开前后摄像头
ARKit 3 现在可以同时打开前后摄像头,同时使用 AR 功能。该功能仅支持 A12 及以上设备。
代码:
// Enable world tracking in face tracking configuration
let configuration = ARFaceTrackingConfiguration()
if configuration.supportsWorldTracking {
configuration.worldTrackingEnabled = true
}
session.run(configuration)
// Access world position and orientation
func session(_ session: ARSession, didUpdate frame: ARFrame) {
let transform = frame.camera.transform
...
}
多人协作
在 ARKit 2 中已经可以多人共享同一个世界地图了,简单说就是:当一个用户建立 AR 世界地图后,将数据发送给网络内的其他用户,这样实现多人共享。 今年在 ARKit 3 中,多人协作世界更加方便:
- 持续在多台设备间共享地图数据
- 特殊网络(Ad-hoc)内多用户体验
- 在所以设备上进行 ARAnchor 共享和识别
- 独立的坐标系统
效果如下图:
原理如图,用户 A 和用户 B 之间会互相传输
CollaborationData
,以此来共享数据:
代码:
// Enable a collaborative session with RealityKit
// Set up networking
setupMultipeerConnectivity()
// Initialize synchronization service
arView.scene.synchronizationService =
try? MultipeerConnectivityService(session: mcSession)
// Create configuration and enable the collaboration mode
let configuration = ARWorldTrackingConfiguration()
configuration.isCollaborationEnabled = true
arView.session.run(configuration)
// Session callback when some collaboration data is available
override func session(_ session: ARSession, didOutputCollaborationData data:
ARSession.CollaborationData) {
// Send collaboration data to other participants
mcSession.send(data, toPeers: participantIds, with: .reliable)
}
// Multipeer Connectivity session delegate callback upon receiving data from peers
func session(_ session: MCSession, didReceive data: Data, fromPeer peerID: MCPeerID) {
// Update the session with collaboration data received from another participant
let collaborationData = ARSession.CollaborationData(data)
session.update(from: collaborationData)
}
用户引导 UI
在 AR 应用中,我们经常需要引导用户,告诉用户接下来应该怎么做,比如当用户移动太快时告诉用户慢一点。于是今年引入了AR Coaching View
- 为 AR 应用程序内置的 UI 图层
- 引导用户以获得更好的追踪体验
- 与整个应用一致的设计体验
- 自动激活和取消
- 可调整的训练目标
多个面容追踪
ARKit 2去年已经支持了多个面容的识别,今年 ARKit 3 能在任意面容离开并重新回来时,持续追踪并识别出同一张脸。如下图,离开并重新进入,ID 不变:
其他改进
ARKit 3 还有很多其它改进。
- 图片追踪提高到 100 张,自动大小估计,运行时质量反馈。
- 机器学习增强的物体检测,更快识别,更健壮
- 机器学习增强的平面检测,更精确的边界检测,更快的扩展增大
Demo 示例,自动识别墙壁,地板等:
新 Anchor 类型:
新 API raycast 的使用,可以更好的放置虚拟物体:
// Create a raycast query
let query = arView.raycastQuery(from: screenCenter,
allowing: .estimatedPlane,
alignment: .any)
// Perform the raycast
let raycast = session.trackedRaycast(query) { results in
// Refine object position with raycast update
if let result = results.first {
object.transform = result.transform
}
}
// Stop tracking the raycast
raycast.stop()
此外,还有视觉一致性增强:运动模糊,景深,镜头噪点等。此外还有AR 视频录制,可以让我们直接导入视频进行 AR 调试,无需每次都重新运行 app 并移动手机进行识别。
参考
WWDC2019视频