Xcode4.6 开发 metaio 增强现实 项目(二)--增强现实的实现

时间:2024-10-13 13:34:02

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

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

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

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

2、设置坐标的偏移

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

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

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

6、截一个屏

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

接着来看Xcode4.6 开发 metaio 增强现实 项目(二)--增强现实的实现文件,首先声明四个指向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控件,设置按钮选择与未选的图片变换;