经过昨天的一些步骤,我们已经将我们的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. Asp.net TextBox只能输入数字

    原文:Asp.net TextBox只能输入数字 <asp:textbox id="TextBox1" onkeyup="if(isNaN(value))execC ...

  2. JAVA学习课第五十三届 — IO流程(七)File打靶 &amp; Properties设置

    一个.锻炼 深度遍历目录 深度遍历非常自然而然想到递归,而递归就非常自然的想到事实上现的底层算法是栈 对指定文件夹下列出全部内容(包括子文件夹的内容) PS:建议不要遍历C盘 import java. ...

  3. 调试javascript

    Chrome 控制台 如何调试javascript 上面的文章已经大致介绍了一下console对象具体有哪些方面以及基本的应用,下面简单介绍一下如何利用好chrome控制台这个神器好好调试javasc ...

  4. Ubuntu12.10无法安装openssh-server[已解决]

    因为要在Ubuntu下搞些东西,家里的台式有Deepin2013,但是发现有很多依赖的问题,实在不想解决,就到win7下用VBox安装了Ubuntu.打算使用SourceCRT连接虚拟机,但是在安装在 ...

  5. PHP专业开发IDE——Zend Studio 10.5预览版发布

    Zend Studio是新一代的PHP IDE,高效的开发和维护PHP代码是它的核心.Zend公司目前已发布了Zend Studio 10.5预览版,预览版中提高了快速响应能力和时时误差检查.因此使用 ...

  6. 国内外最全面和主流的JS框架与WEB UI库

    当下对于网站前段开发人员来说,很少有人不使用一些JS框架或者WEB UI库,因此这些可以有效提高网站前段开发速度,并且能够统一开发环境,对于不同浏览器的兼容性也不需要程序员操心,有了这些优点,当然大家 ...

  7. svn外网访登录不进去提示证书错误Authorization Required

    为了外网能访问内网svn.于是坐在外网端口映射.但是奇怪的是内网能访问,外网总也登录不进去.以为是浏览器版本低 但是其他浏览器也一样.最后客户端也登录不进去.提示报错:  Authorization  ...

  8. SQL Server 增删改

    --use用来设置当前使用哪个数据库use StudentDb--go批处理go --T-SQL中不区分大小写,数据库表中的数据是区分大小写的--例如:insert与INSERT不区分大小写,数据库表 ...

  9. AngularJS学习笔记filter

    filter是对数据进行过滤操作,比如按某个字段搜索.格式化数据等等,是一个非常有用的接口.下面就简单介绍下它的用法. AngularJS自带的filter接口,|是filter的分隔符,参数用:分隔 ...

  10. SpringMVC格式化显示

    SpringMVC学习系列(7) 之 格式化显示 在系列(6)中我们介绍了如何验证提交的数据的正确性,当数据验证通过后就会被我们保存起来.保存的数据会用于以后的展示,这才是保存的价值.那么在展示的时候 ...