ITEEDU

iPhone版AR算法研究和部分功能实现

在公司最后接触的一个项目就是iPhone版的AR开发,自己一个人从头到尾的研究,确实很晕,下边简单通过功能模块简单总结一下子,由于涉及公司的,所以很多东西还是没能上传,如果有需要可以进一步交流,呵呵……

那么先看一下子什么是AR技术呢?

AR(Augmented Reality),AR技术即增强现实技术,也被称为扩增现实(台湾)。定义:把原本在现实世界的一定时间空间范围内很难体验到的实体信息(视觉信息,声音,味道,触觉等),通过科学技术模拟仿真后再叠加到现实世界被人类感官所感知,从而达到超越现实的感官体验,这种技术叫做增强现实技术,简称AR技术。

Augmented Reality(中文翻成增强实境),这个词近来在网上出现的越来越多,Augmented Reality可以算是Virtual Reality〈虚拟实境〉当中的一支,不过略为不同的是,Virtual Reality是创造一个全新的虚拟世界出来,而Augmented Reality则是强调『虚实结合』。AR把虚拟的图像和文字讯息与现实生活景物结合在一起,从去年开始,很多AR应用已经在Android和iPhone智能手机上纷纷亮相 ,呈现效果让大家惊艳不已, 甚至有评论网站直指,这已是2010最热的Web趋势之一。

Augmented Reality有三个要素:

1. Combines real and virtual 〈结合虚拟与现实〉
2. Interactive in real time〈即时互动〉
3. Registered in 3-D〈3D定位〉

要达到AR的虚实结合,使用者必定得透过某种装置来观看。早先大部分的研究主要是透过HMD〈Head-Mounted Display;就是头罩式的装置〉,技术大概分成光学式〈Optical〉与影像〈Video〉两种,前者是一种透明的装置〈像是柯南的眼镜之类〉,使用者可以直接透过这层看到真实世界的影像,然后会有一些另外的投影装置把虚拟影像投射在这层透明装置上。另外一种是不透明装置,使用者看到的是由电脑处理好、已经虚实结合的影像。 最近几年开始流行起来的智能手机,改变了AR的样貌。头戴式的HMD还是太麻烦了,而智能手机同时具备电脑计算能力、录影、影像显示,还有GPS、网路连线、触控、倾斜度侦测等等的额外功能,价格也逐渐平民化,于是在智能手机为平台的AR研究越来越多。

由于学校里开题,在离开公司时,我们大概做了以下工作实现工作,主要是研究AR的前两个要素的实现中:经纬度获取,电子方向罗盘,poi点计算等问题。

首先,下边是走的时候的,我所开发的工程的所有目录,在xcode中打开源码包,如下目录:

 
图1

iPhone版AR中关键部分和主要算法

主要功能:主界面的实现、获取服务器信息,雷达的实现、雷达夹角的计算、各种计算问题的解决等。

其中:

(1)StartViewController类实现了启动界面的动画;

(2)ARCoordinate类是对poi点基本信息的封转,包括径向距离;倾向角,代表角度,球面上两点之间连线与水平方向的夹角;方位角,代表弧度,球面上两点之间连线与垂直(正北)的夹角的弧度;周边的信息的name;保存周边信息的地址;同时,实现了比较两个该封装对象是否相等的方法;初始化属性值等。

(3)ARViewController类是该程序的关键部分,该部分中实现了大多部分功能,其中每一个功能的注释都十分详细。

在此,简单描述一下子计算雷达poi点坐标和屏幕poi点坐标的算法。

首先,计算雷达poi点坐标需要的数据是:

经度值lat,纬度值lon,由经纬度值所计算出来该点与中心点之间连线和正北方向(北极)的夹角azimuth,该点与当前点连线之间的距离d,设定的视角的最大半径R,雷达的半径r。具体算法如下:

x=sinf(azimuth)*d;y=cosf(azimuth)*d;则:

piont.x = x/R *r+r;

piont.y = y/R *r+r;

在此处,雷达半径r=60;

该算法具体在drawLeidaPoi方法中实现。

因将其绘制在雷达上,所以雷达转动,其也会跟着转动,避免了重新计算因屏幕转动而得的偏移量。

其次,计算屏幕poi点坐标的算法,该方法较为复杂,需要的参数也相对多了,需要考虑因屏幕转动而得的偏移量。

经度值lat,纬度值lon,由经纬度值所计算出来该点与中心点之间连线和正北方向(北极)的夹角azimuth,由经纬度计算来该点与中心点之间连线和水平方向的夹角inclination,该点与当前点连线之间的距离,设定的视角的最大半径R,雷达的半径r,旋转手机后z轴的偏角angleZ,旋转手机后x轴的偏角angleX。

azimuthZ = azimuthZ+angleZ; inclinationX = inclination+angleX;

x=sinf(azimuthZ)*d;y=cosf(inclinationX)*d;则,

piont.x = x/R *ar_overlayView.frame.size.width;

piont.y = y/R *ar_overlayView.frame.size.width;

其中 ar_overlayView.frame是主界面的view.

该算法在drawPoi中实现。

(4)ARGeoCoordinate类是ARCoordinate类的子类,其通过经纬度,来实现计算经度值lat,纬度值lon,由经纬度值所计算出来该点与中心点之间连线和正北方向(北极)的夹角azimuth,由经纬度计算来该点与中心点之间连线和水平方向的夹角inclination。

(5)ARGeoViewController是ARViewController的子类,只是复杂初始化ARViewController。

Util包实现的功能

(1)GTMDefines和GTMBase64这2个类主要是为了实现base64解码。

(2)RequestUrl类封转了拼接Url地址,包括后期需要发送的所有请求的Url地址都可以通过此类来实现。

(3)UserData类封转了用户登陆的信息。

(4)Util类是调用base64解码的一个工具类。

(5)Opers类是封转poi信息的动作的类。

Views包实现功能

(1)DrawLeidaView类,实现了绘制雷达上的扇形区域和显示雷达变动信息的文本框,后期凡是在雷达上固定的不变的东西,都可以添加在该类中。

(2)TopView类,是主界面中的导航的简单绘制,后期需要修改成动态的。

GDataXML包实现的功能

该包中就一个类,实现解析xml文件,后期解析XML文件均可调用该类中的方法。

ASIhttpRequest包

该包是谷歌上的开源软件包,导入进来,进行一些基本的设置,具体信息见官方网站:http://allseeing-i.com/ASIHTTPRequest/Setup-instructions

其中这些包,已经根据不同的功能分成3类,每一个类的功能也在该类的顶层用汉语做了注释。

该包的具体调用方法见http://allseeing-i.com/ASIHTTPRequest/How-to-use。也可以参加该项目中已经使用过该类的相关方法,在ARViewController类中。

最后是程序的入口处:ARKitDemoAppDelegate类中。