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 有两项:

建议不知道或者不太知道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的开发难度是很低的,毕竟我这种渣渣接触几天就弄懂了。效果来说,位置追踪做得相当不错,几乎没有抖动和漂移的现象,平面解析还是能用的,不过也就是能用的水平,速度慢,边界不准,有时候根本检测不出。不过鉴于只有一个摄像头,能作出这样的效果还是很不错了,遗憾的是只能检测水平平面,并不能检测垂直平面。

  期待更好的技术出现。

  

p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Menlo; color: #703daa; background-color: #ffffff }
p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Menlo; color: #703daa; background-color: #ffffff }
p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Menlo; color: #703daa; background-color: #ffffff }
p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Menlo; color: #703daa; background-color: #ffffff }
p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Menlo; color: #000000; background-color: #ffffff }
span.s1 { color: #ba2da2 }
span.s2 { color: #703daa }

时间: 2024-10-12 21:26:16

ARKit 初体验的相关文章

微信公众号牌九棋牌开发ARKit初体验

微信公众号牌九棋牌开发(aqiulian.com)咨询更多ARKit联系QQ:212303635 1.1-写在前面的话 初次接触ARKit,很多人会为其复杂的架构关系而感到畏惧.这里笔者将以最基础简介的方式带领一下一睹苹果原生AR(虚拟增强现实)的风采 ARKit并不是一个独立就能够运行的框架,而是必须要SceneKit一起用才可以,换一句话说,如果只有<ARKit>,而没有<SceneKit>,那么ARKit和一般的相机没有任何区别 由于笔者从事多年的iOS应用开发,并没有从事过

erlang 初体验

最近测试了一下 erlang的坑... 如不出意外.... 大家第一眼看到这语法... 心里第一句一定是"我擦.这TM都是啥!!!!!" 没有变量!!! 没有结构体!!! 没有循环!!! 好吧,至少我是这样想的. 找了半天..连个if也不知道怎么写.. 这记录一些基本常识.. -module(module_name)  %%定义模块 括号内的要和文件名相同. -export([fun1/1 fun2/2]) %%这里是导出2个函数对外使用  函数名/参数名. 一个简单的函数定义如下 f

linux初体验

第一次听到linux这个'词语'是在一次偶然的朋友聊天中朋友提到的,之前压根没听到过'这个东西',所以我可以说是个linux的新新手,菜鸟都不算. 截至到目前,我已经开始linux系统运维学习有差不多10天时间了.在没接触linux之前,我对它的认识仅仅是:它是个计算机系统.决定学习linux系统运维之前,自我以为运维应该是对系统的一些日常维护之类的,不会很难的东西,我更希望运维是个不难的东西,我个人很笨,对难的东西可能接受的很慢,所以我愿意认为运维是很简单的,这样我就可以轻轻松松的掌握运维相关

【Spark深入学习 -15】Spark Streaming前奏-Kafka初体验

----本节内容------- 1.Kafka基础概念 1.1 出世背景 1.2 基本原理 1.2.1.前置知识 1.2.2.架构和原理 1.2.3.基本概念 1.2.4.kafka特点 2.Kafka初体验 2.1 环境准备 2.2 Kafka小试牛刀 2.2.1单个broker初体验 2.2.2 多个broker初体验 2.3 Kafka分布式集群构建 2.3.1 Kafka分布式集群构建 2.3.2 Kafka主题创建 2.3.3 生产者生产数据 2.3.4消费者消费数据 2.3.5消息的

Java8初体验(二)Stream语法详解

原文链接:http://ifeve.com/stream/ 1. Stream初体验 我们先来看看Java里面是怎么定义Stream的: A sequence of elements supporting sequential and parallel aggregate operations. 我们来解读一下上面的那句话: Stream是元素的集合,这点让Stream看起来用些类似Iterator: 可以支持顺序和并行的对原Stream进行汇聚的操作: 大家可以把Stream当成一个高级版本的

hibernate--CRUD初体验

hibernate的crud操作初体验. 看具体实例 package com.fuwh.model; import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.Id; import org.hibernate.annotations.GenericGenerator; @Entity publ

Oracle SQL篇(一)null值之初体验

    从我第一次正式的写sql语句到现在,已经超过10年的时间了.我写报表,做统计分析和财务对账,我一点点的接触oracle数据库,并尝试深入了解.这条路,一走就是10年,从充满热情,到开始厌倦,我不知道我还能坚持多久,未来的路,谁知道呢? 也许是该抓紧时间,做一点什么了,我不知道该开始写些什么,我从来没有在网上写东西的习惯.     先从简单的开始吧,那当然就是SQL,这是我SQL系列的第一篇,希望我能够坚持. 在Oracle数据库中,如果一个表中的列没有值的话,我们可以说是空值,比如IT员

AngularJS路由系列(3)-- UI-Router初体验

本系列探寻AngularJS的路由机制,在WebStorm下开发. AngularJS路由系列包括: 1.AngularJS路由系列(1)--基本路由配置2.AngularJS路由系列(2)--刷新.查看路由,路由事件和URL格式,获取路由参数,路由的Resolve3.AngularJS路由系列(3)-- UI-Router初体验4.AngularJS路由系列(4)-- UI-Router的$state服务.路由事件.获取路由参数5.AngularJS路由系列(5)-- UI-Router的路由

Android Studio初体验之启动AVD模拟器异常:cannot set up guest memory &#39;pc.ram&#39;

启动AVD模拟器异常:Cannot set up guest memory 'pc.ram' 错误信息: HAX is working and emulator runs in fast virt mode Cannot set up guest memory 'pc.ram': Invalid argument Error accepting connect 分析 各种查资料,没有发现网上有同样问题的,在一篇相关文章中找到类似的解决方法. 从语意看,应该是hax安装后没有启动.(不懂hax是什