经过昨天的一些步骤,我们已经将我们的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. C语言库函数大全及应用实例十一

    原文:C语言库函数大全及应用实例十一                                         [编程资料]C语言库函数大全及应用实例十一 函数名: setbkcolor 功 能 ...

  2. HDU 1256 图片8

    图片8 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submis ...

  3. 浅析 JavaScript 中的 函数 currying 柯里化

    原文:浅析 JavaScript 中的 函数 currying 柯里化 何为Curry化/柯里化? curry化来源与数学家 Haskell Curry的名字 (编程语言 Haskell也是以他的名字 ...

  4. Java泛型和集合之泛型VS模板

    Java的泛型很像C++中的模板,说到Java 泛型和C++中的模板的关系时,有两个重要的方面需要被考虑到:语法和语义.语法看起来是相似的,可是语义却明显是不同的. 在语法上讲,选择尖括号  是因为他 ...

  5. c#之冒泡排序的三种实现和性能分析

    冒泡排序算法是我们经常见到的尤其是子一些笔试题中. 下面和大家讨论c#中的冒泡排序,笔者提供了三种解决方案,并且会分析各自的性能优劣. 第一种估计大家都掌握的,使用数据交换来实现,这种就不多说了,园子 ...

  6. spring bean范围

    总结: 实例代码具体解释: 文件夹结构 Car.java package com.coslay.beans.autowire; public class Car { private String br ...

  7. ASP.NET页面生命周期和asp.net应用程序生命周期

    作为一个asp.net程序员,不了解ASP.NET页面生命周期和asp.net应用程序生命周期是绝对不行的,那永远只能是菜鸟级别.我很早就学过,可是没次还是得去翻,一些事件还是记不住,还是记在自己的b ...

  8. delphi字符串函数大全

    转帖:delphi字符串函数大全 2009-11-17 16:43:55 分类: delphi字符串函数大全 ━━━━━━━━━━━━━━━━━━━━━首部 function StringToGUID ...

  9. c#跟objective-c语言特性

    c#跟objective-c语言特性的对比 拿c#语言跟objective-c做个对比,记录下自己认为是差不多的东西. 学过objc的人相信对category这个东西肯定不陌生,它可以让我们在没有源码 ...

  10. 移动web知识

    1.像素知识 px: css pixels,逻辑像素,浏览器使用的抽象单位 dp,pt:device independent pixels ,设备无关像素 dpr:devicePixelRatio 设 ...