Xcode4.6 开发 metaio 增强现实 项目(二)--增强现实的实现
经过昨天的一些步骤,我们已经将我们的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 增强现实 项目(二)--增强现实的实现的更多相关文章
- 使用Jquery+EasyUI 进行框架项目开发案例讲解之二---用户管理源码分享
使用Jquery+EasyUI 进行框架项目开发案例讲解之二 用户管理源码分享 在上一篇文章<使用Jquery+EasyUI进行框架项目开发案例讲解之一---员工管理源码分享>我们分享 ...
- 使用Jquery+EasyUI 进行框架项目开发案例解说之二---用户管理源代码分享
使用Jquery+EasyUI 进行框架项目开发案例解说之二 用户管理源代码分享 在上一篇文章<使用Jquery+EasyUI进行框架项目开发案例解说之中的一个---员工管理源代码分享> ...
- 利用maven开发springMVC项目(二)——框架配置
申明:主要内容来源于大神博客(使用IntelliJ IDEA开发SpringMVC网站(二)框架配置),我只是用eclipse自己练习使用,记录下来也只是为了学习使用,没有任何的商业用途,侵权必删. ...
- amazeui学习笔记二(进阶开发1)--项目结构structure
amazeui学习笔记二(进阶开发1)--项目结构structure 一.总结 1.项目结构:是说的amazeui在github上面的项目结构,二次开发amazeui用 二.项目结构structure ...
- 基于 abp vNext 和 .NET Core 开发博客项目 - 博客接口实战篇(二)
系列文章 基于 abp vNext 和 .NET Core 开发博客项目 - 使用 abp cli 搭建项目 基于 abp vNext 和 .NET Core 开发博客项目 - 给项目瘦身,让它跑起来 ...
- 基于 abp vNext 和 .NET Core 开发博客项目 - Blazor 实战系列(二)
系列文章 基于 abp vNext 和 .NET Core 开发博客项目 - 使用 abp cli 搭建项目 基于 abp vNext 和 .NET Core 开发博客项目 - 给项目瘦身,让它跑起来 ...
- Android快乐贪吃蛇游戏实战项目开发教程-01项目概述与目录
一.项目简介 贪吃蛇是一个很经典的游戏,也很适合用来学习.本教程将和大家一起做一个Android版的贪吃蛇游戏. 我已经将做好的案例上传到了应用宝,无病毒.无广告,大家可以放心下载下来把玩一下.应用宝 ...
- ASP.NET MVC5 网站开发实践(一) - 项目框架
前几天算是开题了,关于怎么做自己想了很多,但毕竟没做过项目既不知道这些想法有无必要,也不知道能不能实现,不过邓爷爷说过"摸着石头过河"吧.这段时间看了一些博主的文章收获很大,特别是 ...
- Senparc.Weixin.MP SDK 微信公众平台开发教程(十二):OAuth2.0说明
紧接上一篇<Senparc.Weixin.MP SDK 微信公众平台开发教程(十一):高级接口说明>,这里专讲OAuth2.0. 理解OAuth2.0 首先我们通过一张图片来了解一下OAu ...
随机推荐
- js 正则之检测素数
原文:js 正则之检测素数 相信很多人应该看过这篇文章,我第一次看到的时候是11年的样子,那时候学vbs的时候看过这个问题.原文<检查素数的正则表达式>,在文章里已经解释了他是怎么判断的, ...
- MYSQL LIKE 区分大小写匹配
原文 MYSQL LIKE 区分大小写匹配 MYSQL使用LIKE匹配时默认是不区分大小写的.例:select * from table_name where a like 'wss%'select ...
- DEDECMS织梦常用二开自定义标签
网站名称:{dede:global.cfg_webname/} 网站根网址:{dede:global.cfg_basehost/} 网站根目录:{dede:global.cfg_cmsurl/} 网页 ...
- 【C++ Primer】拷贝控制
十三.复制控制 1. 复制构造函数 类中的成员函数都默觉得inline类型.所以即使在类定义体内的函数声明显示定义为inline类型,在进行函数定义时也可以将inline进行省略. // 复制构造函数 ...
- leetcode[60] Rotate List
题目:给定链表,和一个k,把链表的后k个旋转到前头,例如链表为: 1->2->3->4->5->NULL and k = 2, return 4->5->1- ...
- POJ3187 Backward Digit Sums
给出杨辉三角的顶点值,求底边各个数的值.直接DFS就好了 #include<iostream> #include<cstdio> #include<cstring> ...
- WebIM(5)----将WebIM嵌入到页面中
在之前的文章中,已经开发了一个简单的WebIM,但是这个WebIM是在独立的页面中的,今天发布的WebIM是一个可以嵌入到自己网页中的版本,你只需添加少量的代码,就可以在页面中嵌入一个WebIM.不过 ...
- 前后端分离之Web前端架构设计
架构设计:前后端分离之Web前端架构设计 在前面的文章里我谈到了前后端分离的一些看法,这个看法是从宏观的角度来思考的,没有具体的落地实现,今天我将延续上篇文章的主题,从纯前端的架构设计角度谈谈前后端分 ...
- 关于WCF的一些知识点
首先,WCF和WebService一些区别1,WCF支持多中通信协议,http/https tcp/udp/msmq.命名管道,对等网,消息可达性,事物流等.2,WCF可以与ASP.NET集成,共享同 ...
- Bootstrap 模态框(也可以说的弹出层)
最近在尝试使用bootstrap的模态框 使用模态框主要要引入一下几个js和css: bootstrap.css jquery.1.9.1.js(这个可以灵活选择) bootstrap.js html ...