ARKIT是苹果公司在今年发布的一个AR开发包,用于现有的IOS设备,是的,就是用在手机或者平板上,类似于pokemon go的效果。看了下演示视屏,嗯,看起来很厉害。

  对于一个资深软粉,居然被要求研究它,尽管不情愿,还是得去看看。

  先花半天时间熟悉下swift,再去苹果开发者中心看看arkit的文档。接着MacBook和ipad pro也到了(请注意! ARKIT 理论上支持现有的所有IOS设备,但是,要进行平面解析以及位置追踪的话,处理器必须是A9及更快)。将它们的系统都升级到最新(MacOS10.12.6和IOS 11 beta),安装xcode 9beta,安装Unity 2017,开发环境就弄好了。你问我为什么要安装Unity2017 ? 因为Unity 也可以用于ARKit的开发。

  废话说完了,下面正是进入开发阶段。

  首先打开Xcode,新建一个项目(不知道IOS Developer 们是不是叫新建项目) , 选择IOS项目,选择Augmented Reality APP 模版,next,输入你的项目名称 next,create。一个基本的AR应用就建好了,可以先用真机调试下,看能不能运行,如果不能运行的话,那我也没办法。

  

  下面转到ARKit开发文档页面,看看它到底是个什么情况。在First Steps 有两项:

建议不知道或者不太知道AR的朋友戳进去Understanding下。

  ARSession在ARKIT中是一个非常重要的API,它搭建了整个AR世界以及摄像头管理。我们点进去可以看到一个run方法,它的作用可以理解为调用了该方法就开始加载ar世界了。它的参数是一个ARSessionConfiguration,从名字可以看出这是一个决定ARKit如何运行的类,它还有一个子类ARWorldTrackingSessionConfiguration,以后我们要用到的也大多是它的子类。出了run方法外,它还有一个pause方法,顾名思义就是暂停的意思。它还有add和remove方法,用于添加和移除描点,关于描点后面会讲到。属性currentFrame获取当前帧,类型是ARFrame。

  接下来看看ARWorldTrackingSessionConfiguration,它的作用就是能让你的AR应用拥有6个自由度(不知道什么是自由度的请使用搜索引擎),它有一个PlaneDetection属性,如果要检测真实世界中的平面的话,请将它设为horizontal,isLightEstimationEnabled属性为自动光照,建议true。

  接下来看看另外一个非常重要的东西:ARSCNView,它继承自SCNView,SCNView则是用于SceneKit的显示,SceneKit是苹果公司收购的一个游戏引擎。简而言之,AR程序中真实世界部分由ARSession提供,虚拟部分由ARSCNViwe提供(如果在Unity下开发,虚拟部分则由Unity提供,其它游戏引擎同理)。  ARSCNView有一个Session属性,就是上面讲的ARSession,还有一个scene属性,scene属性是一个场景,可以理解为整个虚拟世界就是一个scene,scene由无数node组成,关于scene的详细理解请阅读SceneKit文档。

  下面讲讲比较重要的平面检测以及Node添加,前面说过要实现平面检测必须将planedetection设置为水平,然后通过

func renderer(_ renderer: SCNSceneRenderer, didAdd node: SCNNode, for anchor: ARAnchor) 事件(这是叫事件么?)来获取到识别的平面,这里由一个ARAnchor类型的参数,它就是获取到的平面的锚点,它包含了获取平面的坐标,可以通过这样来添加一个物体到这个平面上:

     let plane=SCNBox(width: CGFloat(arPlaneAnchor.extent.x), height: 0.0, length: CGFloat(arPlaneAnchor.extent.z), chamferRadius: 0);
plane.firstMaterial?.diffuse.contents=UIColor.red;
let pnode=SCNNode(geometry: plane);
pnode.position=SCNVector3Make(arPlaneAnchor.center.x, 0, arPlaneAnchor.center.z);
node.addChildNode(pnode);

以上代码添加了一个和检测到的平面等大,高度为0,颜色为红色的平面,因为检测到的平面是看不到的,需要我们添加一个东西来标示。请仔细阅读以上代码。

除了添加一个物体到平面上,还可以进行和平面的碰撞检测,相信做游戏的朋友不会陌生。ARSCNVi 额外提供了一个hittest方法,传入参数是一个CGPoint和hittesttype,CGPoint也就是一个二维世界的点,也就是屏幕上的一个点;type有单点(也就是相机中的任何一个地方,遗憾的是返回的结果没有什么参考价值,都是错的),有边界平面和无边界的平面(二者的区别应该很好理解)。返回值是一个ARHittestResult,它有distance,worldtransform,localtransform,分别对应距离,世界坐标和本地坐标,关于世界坐标和本地坐标请自行了解。

  一个最简单的AR应用基本就完成了 , 不过现在看来也没有其它更复杂的操作了。总体而言,ARKIt的开发难度是很低的,毕竟我这种渣渣接触几天就弄懂了。效果来说,位置追踪做得相当不错,几乎没有抖动和漂移的现象,平面解析还是能用的,不过也就是能用的水平,速度慢,边界不准,有时候根本检测不出。不过鉴于只有一个摄像头,能作出这样的效果还是很不错了,遗憾的是只能检测水平平面,并不能检测垂直平面。

  期待更好的技术出现。

  





ARKit 初体验的更多相关文章

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

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

  2. .NET平台开源项目速览(15)文档数据库RavenDB-介绍与初体验

    不知不觉,“.NET平台开源项目速览“系列文章已经15篇了,每一篇都非常受欢迎,可能技术水平不高,但足够入门了.虽然工作很忙,但还是会抽空把自己知道的,已经平时遇到的好的开源项目分享出来.今天就给大家 ...

  3. Xamarin+Prism开发详解四:简单Mac OS 虚拟机安装方法与Visual Studio for Mac 初体验

    Mac OS 虚拟机安装方法 最近把自己的电脑升级了一下SSD固态硬盘,总算是有容量安装Mac 虚拟机了!经过心碎的安装探索,尝试了国内外的各种安装方法,最后在youtube上找到了一个好方法. 简单 ...

  4. Spring之初体验

                                     Spring之初体验 Spring是一个轻量级的Java Web开发框架,以IoC(Inverse of Control 控制反转)和 ...

  5. Xamarin.iOS开发初体验

    aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAAKwAAAA+CAIAAAA5/WfHAAAJrklEQVR4nO2c/VdTRxrH+wfdU84pW0

  6. 【腾讯Bugly干货分享】基于 Webpack & Vue & Vue-Router 的 SPA 初体验

    本文来自于腾讯bugly开发者社区,非经作者同意,请勿转载,原文地址:http://dev.qq.com/topic/57d13a57132ff21c38110186 导语 最近这几年的前端圈子,由于 ...

  7. 【Knockout.js 学习体验之旅】(1)ko初体验

    前言 什么,你现在还在看knockout.js?这货都已经落后主流一千年了!赶紧去学Angular.React啊,再不赶紧的话,他们也要变out了哦.身旁的90后小伙伴,嘴里还塞着山东的狗不理大蒜包, ...

  8. 在同一个硬盘上安装多个 Linux 发行版及 Fedora 21 、Fedora 22 初体验

    在同一个硬盘上安装多个 Linux 发行版 以前对多个 Linux 发行版的折腾主要是在虚拟机上完成.我的桌面电脑性能比较强大,玩玩虚拟机没啥问题,但是笔记本电脑就不行了.要在我的笔记本电脑上折腾多个 ...

  9. 百度EChart3初体验

    由于项目需要在首页搞一个订单数量的走势图,经过多方查找,体验,感觉ECharts不错,封装的很细,我们只需要看自己需要那种类型的图表,搞定好自己的json数据就OK.至于说如何体现出来,官网的教程很详 ...

随机推荐

  1. php面向对象3

    类的定义 基本定义 class 类名{ 访问修饰符 成员属性; 访问修饰符 成员方法; } 说明: ①类一定要class关键词修饰 ②类名的规范说明,使用大驼峰法 ③php 中,类名不区分大小写.但是 ...

  2. Cookie的作用以及封装的方法

    Cookie相当于本地储存(local Storage),也是一种储存信息的方式. 它通过 document.cookie ='name=value' //name name值 value value ...

  3. scrapy抓取淘宝女郎

    scrapy抓取淘宝女郎 准备工作 首先在淘宝女郎的首页这里查看,当然想要爬取更多的话,当然这里要查看翻页的url,不过这操蛋的地方就是这里的翻页是使用javascript加载的,这个就有点尴尬了,找 ...

  4. scrapy配置

    scrapy配置 增加并发 并发是指同时处理的request的数量.其有全局限制和局部(每个网站)的限制. Scrapy默认的全局并发限制对同时爬取大量网站的情况并不适用,因此您需要增加这个值. 增加 ...

  5. POJ 1459-Power Network(网络流-最大流-ISAP)C++

    Power Network 时间限制: 1 Sec  内存限制: 128 MB 题目描述 A power network consists of nodes (power stations, cons ...

  6. java 动态代理的实现

    http://www.cnblogs.com/jqyp/archive/2010/08/20/1805041.html

  7. 在C#中初遇Socket - 2

    后期项目实战:多人在线聊天室 源码位置:https://git.oschina.net/z13qu/BlogProjects 前言 第一篇主要对Socket有个基本认识,实现初始化,发送.接受消息:本 ...

  8. Latex: 插入数学公式

    write equations align equations to left To only align one equation, you can \begin{flalign} &\te ...

  9. dubbo 请求调用过程分析

    服务消费方发起请求 当服务的消费方引用了某远程服务,服务的应用方在spring的配置实例如下: <dubbo:referenceid="demoService"interfa ...

  10. 【Android Developers Training】 30. 允许其它应用启动你的Activity

    注:本文翻译自Google官方的Android Developers Training文档,译者技术一般,由于喜爱安卓而产生了翻译的念头,纯属个人兴趣爱好. 原文链接:http://developer ...