经过昨天的一些步骤,我们已经将我们的IOS应用的基本界面搭建好,下面我们将开始新的征程:增强现实技术的实现;

进入webView后,我们要选用我们这次需要用的nib文件,它是一个家居摆放应用的界面文件,控制它的是视图控制对象 Tutorial7ViewController.mm,现在我们就从此文件开始我们的增强现实之旅;

首先是增强现实显示除家居的流程:

1、当摄像头处于激活状态时使用GPS跟踪

2、设置坐标的偏移

3、拍摄一张照片并且设置图片作为跟踪图样

4、载入机器人模型的跟踪配置文件

5、将模型放置在图样上(手势可以应用到模型上)

6、截一个屏

7、通过清除跟踪图样和重新激活摄像头来重置进程

接着来看文件,首先声明四个指向3D模型的变量

    metaio::IGeometry* m_metaioMan;
metaio::IGeometry* m_chair;
metaio::IGeometry* m_tv;
metaio::IGeometry* m_screen;

再声明一个处理手势操作的变量

    //手势处理拖拽、缩放、旋转
GestureHandlerIOS* m_gestureHandler;

两个开关变量

    //开关变量来标识手势识别enabled
int m_gestures;
//表明用户是否做出了拍照的请求
bool m_imageTaken;

当然还要记录下3D物体移动后的实时位置信息(增强现实)

    //记录3D模型实时的方位值
metaio::TrackingValues m_pose;

最后就是一堆的方法声明,包括显示\隐藏3D模型、右下角按钮和左上角选择按钮的插座变量声明:

- (IBAction)onTVButtonClick:(id)sender;
- (IBAction)onChairButtonClick:(id)sender;
- (IBAction)onManButtonClick:(id)sender; // handle buttom buttons
- (IBAction)onTakePicture:(id)sender;
- (IBAction)onSaveScreen:(id)sender;
- (IBAction)onClearScreen:(id)sender; //show/hide the geometries
- (void)setVisibleTV:(bool)visible;
- (void)setVisibleChair:(bool)visible;
- (void)setVisibleMan:(bool)visible;

当然还有一个子视图的声明:

@property (unsafe_unretained, nonatomic) IBOutlet UIView *subview;

现在进入Tutorial7ViewController.mm,
先来到ViewDidLoad,这个方法是在视图加载晚了之后运行方法,因此在里面设置subView为透明、开启所有手势并且加载跟踪配置信息,代码如下:

    [super viewDidLoad];

    // make the subview transparent(让subView透明)
subview.backgroundColor = [UIColor clearColor]; m_gestures = 0xFF; //enables all gestures(开启所有的手势)
m_gestureHandler = [[GestureHandlerIOS alloc] initWithSDK:m_metaioSDK withView:glView withGestures:m_gestures]; m_imageTaken = false; // load our tracking configuration(加载跟踪配置信息)
bool success = m_metaioSDK->setTrackingConfiguration("ORIENTATION_FLOOR");
NSLog(@"ORIENTATION tracking has been loaded: %d", (int)success);

下载需要加载3D对象资源了,一般资源的加载都是在ViewDidLoad方法中实现的,所以开始我们的加载:(增强现实)

首先是3D机器人的加载,首先找到它对应已经加入Copy Bundle Resouce里的路径,然后通过createGeometry方法创建3D模型,当然还要用setScale
设置它的初始化大小;最关键的一步就是到现在3D模型已经显示出来了,但是初始的时候是不应该有的,所以我们人为的把它隐藏起来,方法为

[selfsetVisibleMan:false];,整体代码如下:

//(加载机器人)
NSString* manPath = [[NSBundle mainBundle] pathForResource:@"metaioman" ofType:@"md2" inDirectory:@"tutorialContent_crossplatform/Tutorial7/Assets7"]; if(manPath)
{
// m_metaioMan指向3D机器人
m_metaioMan = m_metaioSDK->createGeometry([manPath UTF8String]);
if(m_metaioMan)
{
// 设置其最大缩放量
m_metaioMan->setScale(metaio::Vector3d(5.0,5.0,5.0));
// 添加手势识别
[m_gestureHandler addObject:m_metaioMan andGroup:1];
}
else
{
NSLog(@"Error loading the metaio man model: %@", manPath);
}
}
// 开始的时候隐藏3D模型
[self setVisibleMan:false];

椅子、电视的加载方式大同小异,有几点不同的地方在于:椅子、电脑没有trackingData,所以需要设定他们的旋转角度和位置,代码如下:

            //rotate the chair to be upright
m_chair->setRotation(metaio::Rotation(M_PI_2, 0.0, 0.0));
m_chair->setTranslation(metaio::Vector3d(0.0, 0.0, 0.0));

同时,屏幕对象screen需要加载电影文件,代码如下:

            // start the movie
NSString* moviePath = [[NSBundle mainBundle] pathForResource:@"sintel" ofType:@"3g2" inDirectory:@"tutorialContent_crossplatform/Tutorial7/Assets7"];
m_screen->setMovieTexture([moviePath UTF8String]);

接下来就是家居按钮的处理了,它采用的是for循环遍历整个view的方法,我觉得它不用插座将nib文件的button和视图控制文件联系起来的原因在于这样的话可以批处理这些对象而不用一个一个的连接再处理

[subView isKindOfClass:[UIButtonclass]]这句话用了isKindOfClass来筛选button控件,设置按钮选择与未选的图片变换;

												

Xcode4.6 开发 metaio 增强现实 项目(二)--增强现实的实现的更多相关文章

  1. 使用Jquery+EasyUI 进行框架项目开发案例讲解之二---用户管理源码分享

    使用Jquery+EasyUI 进行框架项目开发案例讲解之二 用户管理源码分享   在上一篇文章<使用Jquery+EasyUI进行框架项目开发案例讲解之一---员工管理源码分享>我们分享 ...

  2. 使用Jquery+EasyUI 进行框架项目开发案例解说之二---用户管理源代码分享

    使用Jquery+EasyUI 进行框架项目开发案例解说之二 用户管理源代码分享  在上一篇文章<使用Jquery+EasyUI进行框架项目开发案例解说之中的一个---员工管理源代码分享> ...

  3. 利用maven开发springMVC项目(二)——框架配置

    申明:主要内容来源于大神博客(使用IntelliJ IDEA开发SpringMVC网站(二)框架配置),我只是用eclipse自己练习使用,记录下来也只是为了学习使用,没有任何的商业用途,侵权必删. ...

  4. amazeui学习笔记二(进阶开发1)--项目结构structure

    amazeui学习笔记二(进阶开发1)--项目结构structure 一.总结 1.项目结构:是说的amazeui在github上面的项目结构,二次开发amazeui用 二.项目结构structure ...

  5. 基于 abp vNext 和 .NET Core 开发博客项目 - 博客接口实战篇(二)

    系列文章 基于 abp vNext 和 .NET Core 开发博客项目 - 使用 abp cli 搭建项目 基于 abp vNext 和 .NET Core 开发博客项目 - 给项目瘦身,让它跑起来 ...

  6. 基于 abp vNext 和 .NET Core 开发博客项目 - Blazor 实战系列(二)

    系列文章 基于 abp vNext 和 .NET Core 开发博客项目 - 使用 abp cli 搭建项目 基于 abp vNext 和 .NET Core 开发博客项目 - 给项目瘦身,让它跑起来 ...

  7. Android快乐贪吃蛇游戏实战项目开发教程-01项目概述与目录

    一.项目简介 贪吃蛇是一个很经典的游戏,也很适合用来学习.本教程将和大家一起做一个Android版的贪吃蛇游戏. 我已经将做好的案例上传到了应用宝,无病毒.无广告,大家可以放心下载下来把玩一下.应用宝 ...

  8. ASP.NET MVC5 网站开发实践(一) - 项目框架

    前几天算是开题了,关于怎么做自己想了很多,但毕竟没做过项目既不知道这些想法有无必要,也不知道能不能实现,不过邓爷爷说过"摸着石头过河"吧.这段时间看了一些博主的文章收获很大,特别是 ...

  9. Senparc.Weixin.MP SDK 微信公众平台开发教程(十二):OAuth2.0说明

    紧接上一篇<Senparc.Weixin.MP SDK 微信公众平台开发教程(十一):高级接口说明>,这里专讲OAuth2.0. 理解OAuth2.0 首先我们通过一张图片来了解一下OAu ...

随机推荐

  1. Ubuntu10.04中间Leach协议一键安装

    半天后,尝试,引用网络上的零散资源,成品博客Leach协议ubuntu10.04在安装(12.04也可以在右侧安装,然而,实施效果的不,求解决~~),并制作了补丁. 一个关键的安装步骤如下面: 1.在 ...

  2. 基于NHibernate二级缓存的MongoDB组件

    设计一套基于NHibernate二级缓存的MongoDB组件(上)   摘要:NHibernate Contrib 支持很多第三方的二级缓存,如SysCache,MemCache,Prevalence ...

  3. Android多媒体-MediaRecorder 录制音视频

    不多说,直接上代码,有具体凝视 MyAudioRecord.java import java.io.File; import java.io.IOException; import android.a ...

  4. leetcode[61] Unique Paths

    题目:给定一个m*n的矩阵,从头开始,只能往右边和下边走,一次走一格,知道走到最后一个(右下角)为止.总共有多少种走法. 典型的动态规划吧.其实从头走到尾部,和从尾部开始走到头是一样的次数.我们用一个 ...

  5. java这些东西发展(4)-------无穷time of error

    今天,有些郁闷的心情啊.空指针下午折磨.到现在为止仍然没有得到解决,专家的招募结果没拿到,我们必须继续自己的,进而改变一点点一点点地找到它,但现在我不想搞,准备回家,这浪费了一个多小时,之前记录的下一 ...

  6. awk精简教材

    awk就不多介绍了,最优秀的文本处理工具之一 一.内置变量表 属性 说明 $0 当前记录(作为单个变量) $1~$n 当前记录的第n个字段,字段间由FS分隔 FS 输入字段分隔符 默认是空格 NF 当 ...

  7. 领域模型(Domain Model)

    领域模型(Domain Model) 一:面向对象设计中最简单的部分与最难的部分 如果说事务脚本是 面向过程 的,那么领域模型就是 面向对象 的.面向对象的一个很重要的点就是:“把事情交给最适合的类去 ...

  8. beanutils获取带参数get方法

    public Employee getEmployee(int index) {        return new Employee();    } 1.PropertyUtils.getIndex ...

  9. C语言中的内存对齐

    最近看了好多,也编了好多C语言的浩强哥书后的题,总觉的很不爽,真的真的好怀念linux驱动的代码,好怀念那下划线,那结构体,虽然自己还很菜. 同时看了一遍陈正冲老师的C语言深度剖析,收益很多,又把唐老 ...

  10. IP包头

    上图为IP报头的结构图,下图为捕捉的IP数据包