Fb7207a739a6eb5c7003c533efaa34eb
33-ARKit 3简介

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
...
}
top Created with Sketch.