ARKit 初体验
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 有两项:
- Understanding Augmented Reality
- ARSession
建议不知道或者不太知道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 初体验的更多相关文章
- ARKit从入门到精通(1)-ARKit初体验
ARKit从入门到精通(1)-ARKit初体验 转载自:http://blog.csdn.net/u013263917/article/details/72903174 该系列文章共十篇,笔者将由易到 ...
- .NET平台开源项目速览(15)文档数据库RavenDB-介绍与初体验
不知不觉,“.NET平台开源项目速览“系列文章已经15篇了,每一篇都非常受欢迎,可能技术水平不高,但足够入门了.虽然工作很忙,但还是会抽空把自己知道的,已经平时遇到的好的开源项目分享出来.今天就给大家 ...
- Xamarin+Prism开发详解四:简单Mac OS 虚拟机安装方法与Visual Studio for Mac 初体验
Mac OS 虚拟机安装方法 最近把自己的电脑升级了一下SSD固态硬盘,总算是有容量安装Mac 虚拟机了!经过心碎的安装探索,尝试了国内外的各种安装方法,最后在youtube上找到了一个好方法. 简单 ...
- Spring之初体验
Spring之初体验 Spring是一个轻量级的Java Web开发框架,以IoC(Inverse of Control 控制反转)和 ...
- Xamarin.iOS开发初体验
aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAAKwAAAA+CAIAAAA5/WfHAAAJrklEQVR4nO2c/VdTRxrH+wfdU84pW0
- 【腾讯Bugly干货分享】基于 Webpack & Vue & Vue-Router 的 SPA 初体验
本文来自于腾讯bugly开发者社区,非经作者同意,请勿转载,原文地址:http://dev.qq.com/topic/57d13a57132ff21c38110186 导语 最近这几年的前端圈子,由于 ...
- 【Knockout.js 学习体验之旅】(1)ko初体验
前言 什么,你现在还在看knockout.js?这货都已经落后主流一千年了!赶紧去学Angular.React啊,再不赶紧的话,他们也要变out了哦.身旁的90后小伙伴,嘴里还塞着山东的狗不理大蒜包, ...
- 在同一个硬盘上安装多个 Linux 发行版及 Fedora 21 、Fedora 22 初体验
在同一个硬盘上安装多个 Linux 发行版 以前对多个 Linux 发行版的折腾主要是在虚拟机上完成.我的桌面电脑性能比较强大,玩玩虚拟机没啥问题,但是笔记本电脑就不行了.要在我的笔记本电脑上折腾多个 ...
- 百度EChart3初体验
由于项目需要在首页搞一个订单数量的走势图,经过多方查找,体验,感觉ECharts不错,封装的很细,我们只需要看自己需要那种类型的图表,搞定好自己的json数据就OK.至于说如何体现出来,官网的教程很详 ...
随机推荐
- Java虚拟机14:Java对象大小、对象内存布局及锁状态变化
一个对象占多少字节? 关于对象的大小,对于C/C++来说,都是有sizeof函数可以直接获取的,但是Java似乎没有这样的方法.不过还好,在JDK1.5之后引入了Instrumentation类,这个 ...
- 走进BFC
在解释 BFC 是什么之前,需要先介绍 Box.Formatting Context的概念. Box: CSS布局的基本单位: Box 是 CSS 布局的对象和基本单位, 直观点来说,就是一个页面是由 ...
- 非Controller中调用Service
1. 新增文件 package com.library.common; import org.springframework.beans.BeansException; import or ...
- [转]Java多线程学习(吐血超详细总结)
转自:http://www.mamicode.com/info-detail-517008.html 本文主要讲了Java中多线程的使用方法.线程同步.线程数据传递.线程状态及相应的一些线程函数用法. ...
- springmvc 之 返回值
springMVC对于controller处理方法返回值的可选类型 spring mvc 支持如下的返回方式:ModelAndView, Model, ModelMap, Map,View, Stri ...
- flask笔记二
web表单 web表单是浏览者和网之间的一个互动平台,完成浏览器和服务器之间的数据交互. 1.用Flask-WTF来处理表单 (1)在根目录下编辑扩展配置--config.py CSRF_ENABLE ...
- uwp版的音乐播放器练手
UWP项目之音乐播放器 这个项目本来是我女朋友的一个小作业,她做不出来,结果只能是我来代劳.经过几天的时间虽然赶出来了,但是自己不是很满意,还有很多不满意的地方,因此决定在最近的一段时间内,重新完成. ...
- js数值使用及数组转json,转化后的json传入后台解析
var storeArray=new Array(); $("input[name='storeid']").each(function(i){ var curStoreObj = ...
- 【从零开始】用node搭建一个jsonp&json服务
目录: 一.介绍 二.node安装 三.webstorm配置node环境 四.代码介绍 五.如何使用 六.自定义域名 七.其他 一.介绍 1.背景 日常工作中,跟后端商定好接口格式后:通常采用 ...
- 百度统计API的使用
百度统计API的使用 在搭建自己博客的时候,希望自己能有个日志系统,能够看到PV.UV等信息,同时自己也搭建了个ELK系统,可惜服务器配置太低(1GHZ+1G内存),根本运行不起来.只能使用第三方的日 ...