美文网首页iOS Developer程序员
[ WWDC2018 ] - ARKit2 革新 What’s

[ WWDC2018 ] - ARKit2 革新 What’s

作者: 字节跳动技术团队 | 来源:发表于2018-06-19 18:09 被阅读143次

    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

    相关文章

      网友评论

        本文标题:[ WWDC2018 ] - ARKit2 革新 What’s

        本文链接:https://www.haomeiwen.com/subject/bbtzeftx.html