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. MongoDB一个基于分布式文件存储的数据库(介于关系数据库和非关系数据库之间的数据库)

    1:MongoDB的官方网址:https://www.mongodb.com   MongoDB的中文社区:http://www.mongoing.com/(老外也很看重中国市场啊,知道大家英语不好, ...

  2. oracle删除数据后表空间仍过大问题解决方法

    -----亲测有效------- --一.备份原始数据库库--1.备份空表--在plsql里面执行一下这句话 然后把结果集 再执行一把 再导数据select 'alter table '||table ...

  3. jenkins管理员密码登录不了

    1.密码管理员密码,如何修改 进入/var/jenkins_home/users/admin目录下修改config.xml文件: 以下密码是admin <hudson.security.Huds ...

  4. 【分享】我们用了不到200行代码实现的文件日志系统,极佳的IO性能和高并发支持,附压力测试数据

    很多项目都配置了日志记录的功能,但是,却只有很少的项目组会经常去看日志.原因就是日志文件生成规则设置不合理,将严重的错误日志跟普通的错误日志混在一起,分析起来很麻烦. 其实,我们想要的一个日志系统核心 ...

  5. 容易忽略的递归当中的return

    先描述问题. 最近项目有个需求,数据入库失败后延时一定时间然后重新入库:当失败达到一定次数后就不再进行入库,因为项目简单,也不需要异步处理.所以看到这个问题很容易想到用递归去实现. 我最开始的代码ex ...

  6. grep[行号&正则匹配字符有颜色]

    事情是这样的,昨天在深入学习grep命令时,看到别人博客用grep正则匹配,不仅行数有颜色,而且匹配到的字符也有颜色.我在CRT也试了下,毛颜色都没有.顿时感觉 so low. 解决 编辑vim~/. ...

  7. Unity应用架构设计(12)——AOP思想的实践

    想象一下,当程序所有的业务逻辑都完成的时候,你可能还来不及喘口气,紧张的测试即将来临.你的Boss告诉你,虽然程序没问题,但某些方法为什么执行这么慢,性能堪忧.领会了Boss的意图之后,漫长的排查问题 ...

  8. ABP入门系列(19)——使用领域事件

    ABP入门系列目录--学习Abp框架之实操演练 源码路径:Github-LearningMpaAbp 1.引言 最近刚学习了下DDD中领域事件的理论知识,总的来说领域事件主要有两个作用,一是解耦,二是 ...

  9. MinGW(GCC)编译DLL文件

    这两天用CB(Code::Blocks)写个小程序,要编译出DLL供VB(6)使用.CB使用mingw-gcc作为编译器,在库文件的产出上跟VC.VS之类的IDE略有不同. 由于C语言的基础知识不是太 ...

  10. 流行框架(angularj基础)