[ WWDC2018 ] - ARKit2 革新 What’s New in ARKit 2

WWDC2018:ARKit 2 新特性

Session 602:What’s New in ARKit 2


ARKit 概述(ARKit Recap)

ARKit主要由三部分组成:

arkit_recap.png

1. 跟踪(Tracking)

跟踪是ARKit的核心组件之一,其提供了设备在物理世界中的位置与方向信息,并对物体进行跟踪,如人脸。

2. 场景理解(Scene Understanding)

场景理解通过学习更多关于环境的属性,以对水平平面进行检测,如地面或桌面;iOS 11.3开始还支持检测垂直平面。这些在场景中平面可用于放置虚拟物体。此外,场景理解还会了解当前环境的光照情况,以提供光照信息用于在虚拟场景中反映真实环境,避免过亮或过暗。

3. 渲染(Rendering)

通过ARKit可以很容易地集成你所选的渲染引擎。ARKit可通过SceneKit和SpriteKit渲染。Xcode中还提供了Metal模板,方便快速地开始你的增强现实体验(augmented reality experience)项目。此外,Unity和Unreal也已经集成ARKit完整的功能集到他们主流的游戏引擎中,因此你可以通过这些引擎开始使用ARKit。

ARKit 2 新特性

主要新特性如下:

  1. 保存与加载地图(Saving and Loading Maps):用于支持持久化与多用户体验的强大新特性。
  2. 环境纹理(Environment Texturing):用于更逼真地渲染你的增强现实场景(augmented reality scene)。
  3. 图像跟踪(Image Tracking):对真实场景中的2D图像进行跟踪。
  4. 物体检测(Object Detection):对真实场景中的3D物体进行跟踪。
  5. 人脸跟踪的提升(Face Tracking Enhancements)

1. 保存与加载地图(Saving and Loading Maps)

世界跟踪概述(World Tracking Recap)

保存与加载地图是世界跟踪(World Tracking)的一部分,世界跟踪提供了以下信息:

  • 设备在真实世界中的位置与方向:用于在场景中放置物体。
  • 精确的物理尺寸:用于使用正确的尺寸放置物体,避免物体看上去过大或过小。还可可用于实现精确的测量。
  • 3D特征点:用于了解环境的物理结构,还可用于执行HitTest以在场景中放置物体。

在iOS 11.3引入了重定位(Relocalization),此功能可用于在ARSession被中断后(如进入后台),恢复之前的跟踪状态。

译注:世界跟踪中的位置与方向信息transform通常都是以6自由度的坐标系(6 degrees of freedom paws)的方式提供。

six_degrees_of_freedom_paws.png

映射(Mapping)

重定位工作于世界跟踪持续构建出来的地图上。当在环境中做越多的移动后,将能了解和学习到环境中越多不同的特征,而得到越完整的地图。然而此地图只在你的ARSession存活时存在。

mapping.png

在ARKit中,地图以ARWorldMap表示。ARWorldMap代表了3D物理空间中的映射状态及此空间中的Anchor。Anchor是物理空间中重要项,它们可被放置在你想要放置虚拟物体的地方,因而ARWorldMap中默认包含了平面(PlaneAnchor)。

ARWorldMap中的Anchor列表是可变。为在场景中创建自定义的Anchor,可以向其中添加这些Anchor。

为了方便查看与调试,ARWorldMap也提供了原始的特征点和范围。

更重要的是,ARWorldMap是个可序列化的对象,可将其序列化为任意你所选的数据流,如本地文件系统中的文件或放在共享网络上。由于此特性,使得可通过WorldMap对象为用户带来强大的新体验。

持久化(Persistence)

若将物体放在场景中,并在离开场景前保存WorldMap,之后再回来时,可加载同一的WorldMap,此时将发现之前的物体仍在场景中,而得到与之前相同的增强现实体验。

多用户体验(Multi-User Experiences)

multi_user_experiences.png

ARWorldMap提升了多用户体验。现在你的增强现实体验(augmented reality experience)并不局限于单一设备或单一用户。一个用户可创建一个WorldMap后,分享给一个或多个其他用户。

要注意的是,WorldMap表示真实世界中的一个单一的坐标系,这意味着每个用户共享同一空间,他们可以从不同观察点体验同一AR内容。因而可将此新特性用于多用户游戏或教学。

// Saving and Loading World Maps

// Retrieve world map from session object
session.getCurrentWorldMap { worldMap, error in
    guard let worldMap = worldMap else {
        showAlert(error)
        return
    }
}

// Load world map and run the configuration
let configuration = ARWorldTrackingConfiguration()
configuration.initialWorldMap = worldMap
session.run(configuration)

获取良好的世界地图(Acquiring Good World Maps)

为表现稳定,重要的是要获取良好的地图。要点如下:

  • 从多个角度扫描物理空间,使得跟踪系统可学习环境的物理结构。
  • 环境需要是静止的,纹理良好的,使得可以提取到更多的特征并学习到更多的环境情况。
  • 地图上存在密集的特征点,使得重定位更可靠。

然而不需要担心以上要点,ARKit会在每一帧更新worldMappingStatus,以便于了解当前World Mapping的状态。此状态一开始是不可用的(notAvalable),一旦开始扫描物理空间后,将立即进入受限状态(limited)。之后越是在物理世界中移动,世界跟踪将持续扩展地图(extending)。如果我们在当前视角已经扫描到足够的物理世界信息,状态将被置为mapped。若视角从一个已mapped的物理空间中移开,WorldMappingStatus将重置回limited状态,使其开始学习更多当前新环境的信息。

open class ARFrame : NSObject, NSCopying {
    open var worldMappingStatus: ARFrame.WorldMappingStatus
}

public enum WorldMappingStatus : Int {
    case notAvalable
    case limited
    case extending
    case mapped
}
world_mapping_status.png

若你有一个程序可分享WorldMap给其它用户,程序界面上有一个分享按钮,好的实践是在notAvalable或limited时禁用按钮。而当状态变为extending时,可考虑在界面上显示一个提示图,以鼓励你的用户在物理世界中持续移动并持续扫描,通过扫描去扩展地图。一旦完整地mapped,就可以隐藏提示图并启用分享按钮,以允许你的用户分享地图。

世界跟踪的提升(World Tracking Enhancements)

  • 更快的初始化及平面检测:从ARKit2开始,初始化及平面检测更快。
  • 更健壮的跟踪及平面检测:能在更复杂的环境下检测平面。水平平面和垂直平面都有更精确的范围和边界,意味着可以在场景中更精准地放置对象。
  • 持续自动对焦:从iOS 11.3开始,为增强现实体验而引入此特性。
  • 新的4:3视频格式:从iOS 12开始,在ARKit中引入了4:3视频格式。4:3是一种广角的视频格式,其大大加强了iPad上的视觉效果(Visualization),因为iPad的屏幕显示比例就是4:3,同时4:3的视频格式也将成为ARKit 2的默认格式。

2. 环境纹理(Environment Texturing)

为提升终端用户的体验上,我们引入了环境纹理,其大大增强了渲染效果。

真实感渲染(Realistic Rendering)

为保证渲染结果逼真,使它看起来真的像是被放置在真实世界中,需要做到以下几点:

  • 物体的位置与方向正确
  • 比例正确,避免物体不会过大或过小。世界跟踪会提供为你正确的transform。
  • 环境光。ARKit会提供给你测量的光照情况,你可用于渲染时修正虚拟物体的光照,使物体看起来不会过亮或过暗
  • 添加阴影,若将物体放置在水平平面上,为物体添加阴影也是重要的,以大大提升视觉感知,使得真正感觉物体被放置在表面上
  • 表面反光。对于会反光的物体,人们希望看到环境呈现在虚拟物体的表面上。

环境纹理(Environment Texturing)

环境纹理为收集到的场景纹理的信息,通常表示为立方体贴图(Cube Map),但也有其它表示方式。环境纹理被渲染在此立方体贴图中,可被用于作为渲染引擎中的反射探针(Reflection Probe)。此反射探针可应用纹理在虚拟物体上,这将大大提升了会反射的物体的视觉效果。

收集场景纹理的工作方式为:ARKit运行期间,世界跟踪和场景理解持续学习环境的更多信息。通过计算机视觉,其可提取信息并逐渐填充立方体贴图。只有立方体贴图填充完成,才可作为反射探针。为得到此完成的立方体贴图,你需要像360度全景扫描整个物理空间,但这对任何用户不实用,因而ARKit为了简化使用,通过高级的机器学习算法自动完成此立方体贴图的填充。需要注意的是,所有处理都是在你的设备上实时执行的。因而一旦有了一个完整填充的立方体,就可用于配置反射探针,之后只要虚拟物体放到场景中,就会开始反射环境光。以下是通过代码启用此特性:

// Environment Texturing
let configuration = ARWorldTrackingConfiguration()
configuration.environmentTexturing = .automatic
session.run(configuration)
environment_texturing.png

使用环境纹理后对比如下:

environment_texturing_demo_1.png
environment_texturing_demo_2.png

ARSession会在后台自动执行环境纹理的收集,并以AREnvironmentProbeAnchor对象给到程序使用。AREnvironmentProbeAnchor是ARAnchor的扩展,因而其提供了位置与方向的transform,和一个使用Metal格式的纹理(MTLTexture)表示的立方体贴图,及立方体贴图的物理范围。

应注意的是,其与其它Anchor的生命周期相同,如ARPlaneAnchor或ARImageAnchor。此外,其完全集成进ARSCNView,若使用此View作渲染,则只需要在跟踪配置中启用此特性,其它的会自动处理。

你可以手动地将一个AREnvironmentProbeAnchor放在任意想要放的位置,或以任意方向摆放,可通过以下代码配置:

// Enable manual placement

configuration.environmentTexturing = .manual

3. 图像跟踪(Image Tracking)

图像检测概述(Image Detection Recap)

iOS 11.3开始引入了图像跟踪作为世界跟踪的一部分。检测场景中的2D图像时,这些图像需要是静止且不被移动的,如电影海报或博物馆中的画作。一旦图像被检测到,ARKit会估量图像的位置与方向,之后可用于在你的渲染场景中触发一些AR内容。

图像跟踪被完全集成进世界跟踪,需要做的只是对一些属性进行配置就可以启用。

为了加载图片用于图像检测,可从文件或Xcode的Asset Catalog中加载,后者还会提供一个图像的检测质量信息。

虽然这功能已经很好,但从iOS 12开始提供了相对更做优的图像跟踪。

图像跟踪(Image Tracking)

图像跟踪是图像检测的扩展,其显著的优点是不要求图像静止,而是允许图像移动。
ARKit会以每秒60帧的帧率为每一帧提供位置与方向,且可同时跟踪多张图像。在iOS 12的ARKit2中引入的新的配置ARImageTrackingConfiguration进行图像跟踪。

其配置方式为通过文件或Asset Catalog加载到ARReferenceImage中作为ARWorldTrackingConfiguration的detectionImages属性,或ARImageTrackingConfiguration的trackingImages属性,并将配置交给ARSession运行。ARSession运行后,可在每次update方法回调中取得ARFrame。只要图片已被检测到,ARFrame中将包含ARImageAnchor。具体如下图所示:

image_tracking.png
open class ARImageAnchor : ARAnchor, ARTrackable {
    public var isTracked: Bool { get }
    open var transform: simd_float4x4 { get }
    open var referenceImage: ARReferenceImage { get }
}

使用利于识别的图像(Using Good Images)

为了得到利于识别的图像,要求图像

  • 利于识别的图像:

    • 特征明显(Distinct features)
    • 细腻(Well textured)
    • 对比度好(Good contrast)
  • 不利于识别的图像:

    • 结构重复(Repetitive structures)
    • 色域一致(Uniform color regions)
    • 直方图窄(Narrow histogram)

以下是两种图的示例:

using_good_images_1.png

若被识别的图片导入到Asset Catalog中,将不需要自己检查,Xcode会自动给出警告,并提示原因,如下图所示:

using_good_images_2.png

配置图像跟踪(Configuration for Image Tracking)

加载完图像后,有两个配置可供选择:

  • ARWorldTrackingConfiguration
    • 在世界参照系中的图像锚点(Image anchors in world reference frame)
    • 被检测的图像可被跟踪(Detected images can be tracked)
  • ARImageTrackingConfiguration
    • 独立于世界跟踪(Independent from world tracking)
    • 为每一帧提供位置与方向(Position and orientation for every frame)

两种配置的使用示例如下:

// Create an image tracking configuration
let configuration = ARImageTrackingConfiguration()
configuration.trackingImages = [catPhoto, dogPhoto, birdPhoto]
configuration.maximumNumberOfTrackedImages = 2
session.run(configuration)
// Create a world tracking configuration
let configuration = ARWorldTrackingConfiguration()
configuration.detectionImages = [catPhoto, dogPhoto, birdPhoto]
configuration.maximumNumberOfTrackedImages = 2
session.run(configuration)

4. 物体检测(Object Detection)

物体检测(Object Detection)

物体检测可用于检测场景中已知的3D对象,并提供检测到的物体的位置与方向。当检测到特定物体时,可根据需要触发AR内容。

与图像检测相同的是,物体检测只适用于无法移动的静止物体,如博物馆的展品或特定玩具等;而与图像检测不同的是,物体检测需要先运行ARKit的iOS应用扫描此物体。Apple提供了开源且功能齐全的应用Scanning and detecting 3D objects用于物体的扫描。这些被扫描的物体需要有点特征,如纹理良好,硬且不反光。

物体跟踪已被完全集成到世界跟踪中,因而使用此特性时,只要设置ARWorldTrackingConfiguration的detectionObjects属性,即:

// Object Detection
let configuration = ARWorldTrackingConfiguration()
configuration.detectionObjects = [ancientBust, clayPot]
session.run(configuration)

物体扫描的具体使用方法如图所示:

object_detection.png

启用物体检测后,若检测到场景中的物体,则每次更新的ARFrame中将包含ARObjectAnchor表示此物体。

open class ARObjectAnchor : ARAnchor {
    open var transform: simd_float4x4 { get }
    open var referenceObject: ARReferenceObject { get }
}

物体扫描(Object Scanning)

已知的物体可通过Xcode的Asset catelog导入,而未知的物体在进行物体检测前,需要先对物体进行扫描,才可检测到。物体扫描时会收集场景中的信息。与平面检测类似的是,通过收集场景中的信息估算水平平面或垂直平面的位置,但这里获取的是3D对象的信息。为确定物体检测的区域,会生成transform, extent和center,以在物体周围形成立体边框,定义在其在场景中的位置。需要注意的是,扫描时,并不需要将扫描物体的每个面,如博物馆内部分靠墙的雕塑,可以不扫描无法扫描的背面。对扫描结果满意后,可通过extent的center调整物体的原点,但需要确保center始终在extent内部。扫描完成后将得到一个ARReferenceObject对象,此对象可序列化为文件(通常后缀名为.arobject),可在Asset Catelog中查看name,center和extent属性。

open class ARReferenceObject : NSObject, NSCopying, NSSecureCoding {
    open var name: String?
    open var center: simd_float3 { get }
    open var extent: simd_float3 { get }
    open var rawFeaturePoints: ARPointCloud { get }
}

5. 人脸跟踪的提升(Face Tracking Enhancements)

人脸跟踪概述(Face Tracking Recap)

去年发布iPhone X的同时,ARKit也推出了健壮的人脸检测与跟踪,并以每秒60帧的帧速为每一帧提供面部的位置与方向。人脸跟踪的结果使用ARFaceAnchor表示。得到的pose可用于增强人脸效果,如增加面具,帽子或替换脸部素材。ARKit还以ARFaceGeometry的格式提供面部的三角形网格。

方向光的估测(Directional Light Estimation)

ARKit会提供方向光的估测,会将脸部作为光线探测(light probe),估算光线强度,方向及色温。对于对光线要求复杂的应用,ARKit还会收集整个场景中的光线情况,并提供球面谐波系数(Spherical harmonics coefficients),以进一步提升视觉效果。

融合变形概述(Blendshapes Recap)

ARKit可实时跟踪表情,支持识别超过50种以上特定的面部特征点(Blendshapes),Blendshapes使用0与1间的值表示对应面部特征点的活跃程度,其中1表示极度活跃,0表示不活跃,如张嘴时jawOpen系数接近1,闭嘴时则接近0。此特性对创建虚拟角色的动画非常有用(Animation of virtual character),可用于实现类似Animoji的效果。

人脸跟踪的提升(Face Tracking Enhancements)

视线跟踪(Gaze tracking)
gaze_tracking.png
open class ARFaceAnchor : ARTrackable {
    open var leftEyeTransform: simd_float4x4 { get }
    open var rightEyeTransform: simd_float4x4 { get }
    open var lookAtPoint: simd_float3 { get }
}
支持舌头(Tongue support)
tongue_support.png
extension ARFaceAnchor.BlendShapeLocation {
    public static let tongueOut: ARFaceAnchor.BlendShapeLocation
}

相关视频:

  • WWDC 2018

Creating Great AR Experiences
Inside SwiftShot: Creating an AR Game
Integrating Apps and Content with AR Quick Look
Understanding ARKit Tracking and Detection
What’s New in Safari and WebKit

  • WWDC 2017

Introducing ARKit: Augmented Reality for iOS

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 219,635评论 6 508
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,628评论 3 396
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 165,971评论 0 356
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,986评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 68,006评论 6 394
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,784评论 1 307
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,475评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,364评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,860评论 1 317
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,008评论 3 338
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,152评论 1 351
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,829评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,490评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,035评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,156评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,428评论 3 373
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,127评论 2 356

推荐阅读更多精彩内容

  • Introducing ARKit iOS 11 引入 ARKit,这是 个全新的框架,允许开发者轻松地为 iP...
    没八阿哥的程序阅读 2,424评论 1 9
  • ARKit ARKit框架通过集成iOS设备摄像头和运动功能,在您的应用程序或游戏中产生增强现实体验。 概述 增强...
    暗夜夜夜行路阅读 5,801评论 0 17
  • 叛逆期的霜雁伤透了父母,但我能明白,那只是她表达自我想法的方式,虽然并不高明,但她的确让我开始反思,这个家庭的教育...
    小乌龟慢慢爬_阅读 174评论 0 0
  • 那是一个下雪天,树一个人在家,穿着舒服的衣服,依旧是一杯黑咖啡,老旧的收录机播放的钢琴曲不免带着杂音,但流畅轻灵的...
    猫先生Alexis阅读 320评论 1 2
  • 0x00 需求 把视频拆成图片,视频文件其实是一帧帧的图片,视频文件信息及结构这里就不再赘述了,网上有很多讲的都比...
    LeeYZ阅读 6,529评论 9 23