33-ARKit 3简介

615 阅读6分钟

ARKit系列文章目录

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视频