ARKit介绍

ARKit是iOS11引入的一个全新的框架,使用Visual Inertial Odometry(VIO,视觉惯性里程计)来精确跟踪现实世界中的真实场景。相比其它设备平台,ARKit中的VIO可以将传感器数据和CoreMotion的数据融合在一起,从而提供更为精确的信息。ARKit可以让iOS设备精确感知它如何在房间内移动,而无需外部设备的校准。基于此原理,ARKit可以获取关于iOS设备位置和运动信息的高精度模型,并在场景中使用。

ARKit的强悍功能都是基于海量的计算,因此目前只支持Apple A9和A10处理器。从硬件设备上来看,目前搭载了Apple A9和A10处理器的只有iPhone 6s, iPhone 6s Plus, iPhone SE,iPhone7,iPhone 7 Plus,两代iPad Pro和最新的iPad。

ARKit目前已经支持Unity、Unreal Engine和Scenekit,由于目前正在做Unity开发,故下面就简单介绍一下Unity下的ARKit开发。

工具版本要求

  • 开发IDE:Unity 5.6.1p1 或以上版本
  • 运行系统:iOS 11 或以上版本
  • 编译工具:XCode 9 beta 或以上版本
  • 运行设备:支持ARKit的iOS设备

Unity插件介绍

插件的下载地址:https://oc.unity3d.com/index.php/s/3hfM9T05P9vOpCf

该Unity插件将让开发者们可以轻松访问ARKit的功能,例如世界追踪(World Tracking)、实时视频渲染(Live Video Rendering)、平面预测与更新(Plane Estimation and Updates)、碰撞检测API(Hit-testing API)、环境光预测(Ambient Light Estimation)以及原点云数据(Raw Point Cloud Data)

其基本使用方法可以参考此文,这里不做重复叙述。

将该插件导入到Unity中,有几个重要文件需要做一下说明:

"/Assets/Plugins/iOS/UnityARKit/NativeInterface/ARSessionNative.mm" - OC文件,ARKit SDK的本地接口文件

"/Assets/Plugins/iOS/UnityARKit/NativeInterface/UnityARSessionNativeInterface.cs" - C#版本的ARKit SDK接口文件 这两个文件完成了C#对OC跨语言调用ARKit功能的工作

UnityARSessionNativeInterface 包含下面几个重要方法:

  • public void RunWithConfigAndOptions(ARKitWorldTackingSessionConfiguration config, UnityARSessionRunOption runOptions)
  • public void RunWithConfig(ARKitWorldTackingSessionConfiguration config) public void Pause()
  • public List HitTest(ARPoint point, ARHitTestResultType types)
  • public ARTextureHandles GetARVideoTextureHandles()
  • public float GetARAmbientIntensity()
  • public int GetARTrackingQuality()

还包含几个重要事件

  • public delegate void ARFrameUpdate(UnityARCamera camera)
  • public delegate void ARAnchorAdded(ARPlaneAnchor anchorData)
  • public delegate void ARAnchorUpdated(ARPlaneAnchor anchorData)
  • public delegate void ARAnchorRemoved(ARPlaneAnchor anchorData)
  • public delegate void ARSessionFailed(string error)

"/Assets/Plugins/iOS/UnityARKit/NativeInterface/AR*.cs" - ARKit用到的数据结构脚本

"/Assets/Plugins/iOS/UnityARKit/Utility/UnityARAnchorManager.cs" - 一个实用程序,可以跟踪ARKit的锚更新,并可以为其创建相应的Unity游戏对象 (具体可以参看在 GeneratePlanes.cs 组件里查看使用方法)

"/Assets/Plugins/iOS/UnityARKit/Editor/UnityARBuildPostprocessor.cs” - 编译时用到的编辑脚本,对导出工程做一些相应的操作,例如添加ARKit库文件等

ARKit有用的组件 "/Assets/Plugins/iOS/UnityARKit/UnityARCameraManager.cs" - 这个组件应该放置在通过ARKit引用的摄像机的场景中的一个游戏对象,并且它将定位和旋转相机,并提供基于ARKit更新的正确投影矩阵。该组件还具有初始化ARKit的功能

"/Assets/Plugins/iOS/UnityARKit/UnityARVideo.cs" - 该组件应放置在相机上,并抓取渲染视频所需的纹理,并将其设置为对后缓冲区进行拼接所需的材质,并设置命令缓冲区以进行实际布局

ARKit使用说明

  1. 首先给Camera挂上UnityARCameraNearFar和UnityARVideo这两个脚本并为UnityARVideo的ClearMaterial设置上YUVMaterial材质,其中UnityARCameraNearFar脚本将Camera的nearClipPlane和farClipPlane提供给ARKit使用,UnityARVideo则将摄像头拍摄到的真实世界组合到Camera呈现的背景中去。
  2. 通过UnityARSessionNativeInterface.GetARSessionNativeInterface()拿到ARKit的会话接口,暂且叫它m_session。
  3. 调用m_session.RunWithConfig(config)或m_session.RunWithConfigAndOption(config,option)可以创建一个ARSession,这也代表着ARKit的启动。
  4. 通过m_session.GetCameraPose()可以获取ARKit所认为的Camera当前姿态,例如位置和旋转,将其设置给Camera。
  5. 通过m_session.GetCameraProjection()可以获取ARKit所认为的Camera当前投影矩阵,将其设置给Camera。(以上2-5步可以参考UnityARCameraManager.cs中的使用)
  6. 通过以上步骤,一个基本的AR场景就算搭建好了,你可以通过m_session.HitTest(point,resultTypes)来确定摄像头中的该位置在ARKit理解中是虚拟世界的什么位置和形态。(参考UnityARHitTestExample.cs)
  7. 也可以通过m_session的配置进行平面检测,通过设置UnityARSessionNativeInterface.ARAnchorAddedEvent,UnityARSessionNativeInterface.ARAnchorUpdatedEvent和UnityARSessionNativeInterface.ARAnchorRemovedEvent来获得ARkit对摄像头中平面的理解。(参考UnityARAnchorManager.cs)
  8. 同样的,如果想获取ARKit理解的特征点数据,可以通过设置UnityARSessionNativeInterface.ARFrameUpdatedEvent来及时获取。(参考PointCloudParticleExample.cs)
  9. 还可以通过m_session.GetARAmbientIntensity()来获取对光线强度的估算(参考UnityARAmbient.cs)
  10. 最后需要注意的是,ARKit的各种方法的回调速度和Unity的更新速度是不一样的。

总结

ARKit的功能非常强大,但使用却如此简单,使用不难,只能说苹果牛逼呀!

本文来自网易云社区,经作者张志明授权发布。

原文地址:ARKit入门

更多网易研发、产品、运营经验分享请访问网易云社区

ARKit入门的更多相关文章

  1. ARKit从入门到精通(10)-ARKit让飞机绕着你飞起来

    1.1-ARKit物体围绕相机旋转流程介绍 1.2-完整代码 1.3-代码下载地址 废话不多说,先看效果 其实是会一直围着你转圈的,只不过笔者不好意思暴露家里的场景,所以请读者朋友们见谅~ 由于是晚上 ...

  2. ARKit从入门到精通(11)-ARKit开发常见问题及解决方案

    转载请注明出处:ARKit从入门到精通(11)-ARKit开发常见问题及解决方案 本文主要介绍ARKit开发过程中一些常见问题 1.ARKit框架无法导入问题 2.ARKit运行黑屏或者白屏问题:Un ...

  3. ARKit从入门到精通(9)-ARKit让飞机跟着镜头飞起来

    1.1-ARKit物体跟随相机移动流程介绍 1.2-完整代码 1.3-代码下载地址 废话不多说,先看效果 1001.gif 1.1-ARKit物体跟随相机移动流程介绍 1.点击屏幕添加物体,已经在第三 ...

  4. ARKit从入门到精通(8)-ARKit捕捉平地

    转载:http://blog.csdn.net/hdfqq188816190/article/details/73360287 1.1-ARKit捕捉平地实现流程介绍 1.2-完整代码 1.3-代码下 ...

  5. ARKit从入门到精通(3)-ARKit自定义实现

    转载:http://blog.csdn.net/u013263917/article/details/73038566 在上一小节中ARKit从入门到精通(2)-ARKit工作原理及流程介绍,我们完整 ...

  6. ARKit从入门到精通(2)-ARKit工作原理及流程介绍

    转载:http://blog.csdn.net/u013263917/article/details/73038519 1.1-写在前面的话 1.2-ARKit与SceneKit的关系 1.3-ARK ...

  7. ARKit从入门到精通(1)-ARKit初体验

    ARKit从入门到精通(1)-ARKit初体验 转载自:http://blog.csdn.net/u013263917/article/details/72903174 该系列文章共十篇,笔者将由易到 ...

  8. ARKit从入门到精通

    ARKit从入门到精通(10)-ARKit让飞机绕着你飞起来 ARKit从入门到精通(9)-ARKit让飞机跟着镜头飞起来 ARKit从入门到精通(8)-ARKit捕捉平地 ARKit从入门到精通(7 ...

  9. ARKit从入门到精通(7)-ARCamera介绍

    ARCamera是一个相机,它是连接虚拟场景与现实场景之间的枢纽.在ARKit中,它是捕捉现实图像的相机,在SceneKit中它又是3D虚拟世界中的相机.(一般第一人称3D游戏,主角其实就是一个3D相 ...

随机推荐

  1. C# 32位程序访问64位注册表

    接上文:http://www.cnblogs.com/TaiYangXiManYouZhe/p/5086974.html 上代码: RegistryKey localKey; if (Environm ...

  2. 1138 Postorder Traversal

    题意:给出二叉树的前序序列后中序序列,输出其后序序列的第一个值. 思路:乍一看不就是前序+中序重建二叉树,然后后序遍历嘛!这么做当然不会有错,但是却没有真正领会本题的意图.本题并不是让我们输出后序序列 ...

  3. 1134 Vertex Cover

    题意:给出一个图和k个查询,每个查询给出Nv个结点,问与这些结点相关的边是否包含了整个图的所有边. 思路:首先,因为结点数较多,用邻接表存储图,并用unordered_map<int,unord ...

  4. oracle自动创建表分区

    创建一个table,记录哪些表需要创建表分区 create table STAT_TABLE ( tablename VARCHAR2(), pre_partition_name VARCHAR2() ...

  5. 免Oracle客户端程序监听程序配置

    Oracle默认安装时,监听程序和tnsnames程序中的监听方式都是默认的localhost,但免客户端的程序是连接不上的.这时需要: 1.将listener中的(HOST = localhost) ...

  6. 4.solr学习速成之bean

    以bean的形式提交索引,以bean的形式查询出来 package com.liucheng.solr; import java.io.Serializable; import org.apache. ...

  7. SSD惊悚的跪了,找回数据

    1.电脑出现小bug,例如显示乱码,开机变慢等,都是SSD跪的前兆,哭,我怎么就没看出来,而且没有备份过数据. 2.终于,PC死机了...OK,重启,纳尼?起不来... 3.大哭,所有代码,所有论文不 ...

  8. 前端学习笔记一:什么是W3C?

    俗话说好记性不如烂笔头,最近在学习前端技术,一些理论性的知识虽然理解,但有时确不能精准的用语言表述出来,那就索性记下来吧,以备以后时常查看: 我们平时说的W3C,其实是World Wide Web C ...

  9. 判断手机使用网络wifi 2G 3G

    ConnectivityManager cManager = (ConnectivityManager) this .getSystemService(Context.CONNECTIVITY_SER ...

  10. Resin 的watchdog(看门狗)介绍和resin负载均衡实现

    为了稳定和安全,Resin使用一个独立的watchdog进程来启动和监视Resin服务器.watchdog连续你检测Resin服务器的状态,如果其没有反应或者迟钝,将会重启Resin服务器进程.大多数 ...