2017-11-18 14:34:00 weixin_30455365 阅读数 17
  • Unity开发AR创意礼物:会动的照片

    小新:“想想我给女神一个相册,每个照片背后都有一段我们美好的记忆,那女神不得老感动了,哈哈哈。” 大智:“不给你拉黑就是万幸了。我已经将撩妹绝学传授给你,你可不能吃独食。” 小新:“那必须的,我得立马分享出去,造福广大同胞。” 大智:“这才像话。” 最终效果如下: 开发需要用到的工具如下: * Unity * EasyAR SDK(https://www.easyar.cn/view/download.html#download-nav2) * 发布需要使用的:安卓(Android SDK+JDK) / iOS(XCode) 开发的简要流程如下: * 创建Unity工程,导入EasyAR SDK * 申请EasyAR的liscense key,并配置到Unity中 * 在HelloAR_ImageTarget_Video的场景基础上进行改造,实现多图片的跟踪 * 测试、发布

    44 人正在学习 去看看 郑洪智

 

 近期 在做AR这一块,用EasyAR集成到iOS端,由于现在到项目已经上线,下一版本要做一个AR功能,于是迫于需求需要,自己研究和翻阅读好多集成到资料。

通过整理分出几个重要到模块,其中在这里指出Xcode9版本确实好坑,建议弃坑,该用稍微好点到版本Xcode9.1.

 

一模块.Unity3D导出iOS项目(UD,表示)。

二模块.从UD取出重要到三个文件。

三模块.新建一个iOS项目(ID,表示)

四模块.在ID配置Unity3D的环境

五模块.在ID创建Unity3D的控制器文件及代码

 

开始演示:

一模块.Unity3D导出iOS项目(UD,表示)。

1.在搞好Unity的代码开发后就可以倒出iOS版本了(如果没有AR项目,可以到EasyAR去找dome来做)。

2.导出到相关配置如标,按里面的配置好就好,注意【’允许使用相机?‘,要写,不然导出iOS后运行会崩溃】:(图是取来别人的图)

 

二模块.从UD取出重要到三个文件。

 1.三个目录,Classes,Libraries,Data。

 

三模块.新建一个iOS项目(ID,表示)

 1.引用UD项目里的三个文件,并集成到ID项目里。

 2.这里需要注意的是,Classes和Libraries目录作为Group引用,切记不要勾选copy。

 3.而Data目录不需要参与编译,作为folder引用进来即可。

文件结构如下:(可以不要创建文件夹放置,按照UD项目的结构来做)

 

四模块.在ID配置Unity3D的环境

 1.关闭bitcode。新版的Unity已经支持Bitcode但EasyAR并不支持,不关闭无法正常编译。如图:

 

2.修改Linking -> Other Linker Flags选项,添加参数 -weak_framework CoreMotion -weak-lSystem

3.修改头文件搜索目录,如图:

结构如:

"$(SRCROOT)/项目名称/Classes"

"$(SRCROOT)/项目名称/Libraries"

"$(SRCROOT)/项目名称/Libraries/libil2cpp/include"

"$(SRCROOT)/项目名称/Classes/Native"

"$(SRCROOT)/项目名称"

"$(SRCROOT)" 

 

4.修改库搜索目录,如图:

结构如:

"$(SRCROOT)/项目名称/Libraries"

"$(SRCROOT)/项目名称/Libraries/Plugins/iOS"

"$(SRCROOT)/项目名称"

 

 

5. 修改LLVM - Custom Complier Flags -> Other C Flags选项,添加两个参数: -DINIT_SCRIPTING_BACKEND=1 和 -DRUNTIME_IL2CPP=1

 

6.修改LLVM - Language -> C Language Dialect选项,选择C99

 

 

7.修改LLVM - Language - C++ -> C++ Language Dialect选项,选择 C++11

 

 8.添加三项自定义设置

  • MTL_ENABLE_DEBUG_INFO -> NO
  • UNITY_RUNTIME_VERSION -> 2017.1.1f1(当前你的Unity3d版本号,请自行替换)
  • UNITY_SCRIPTING_BACKEND -> il2cpp

 

 

9.新建一个PCH文件,并修改Precompile Prefix Header为YES,关联pch文件路径。此处新建文件名为 PrefixHeader.pch。

 

10.添加工程依赖(注意三个Optional)

 

五模块.在ID创建Unity3D的控制器文件及代码

  1.ID项目中,将Classes/下的main.mm文件里面的内容,复制全部到集成项目的Supporting Files/下的main.m文件中,然后删除Classes/main.mm,并且把文件后缀改成.mm。并且按照下图对内容进行修改

2.修改 UnityAppController文件

改之前:

改之后:(‘delegate.unityController’的unityController,是之后要建的自定义文件,用来处理AR界面处理的,不明白可以不管)

3.新建一个UnityController文件继承于UnityAppController用来处理AR界面处理(注意变成C++混编文件【把.m文件变成.mm文件】)

 


UnityController.mm文件如下:

 

//  Created by XY IOS on 2017/11/18.

//  Copyright © 2017年 陈诗友. All rights reserved.

//

 

#import "UnityController.h"

 

 

#import "UnityAppController.h"

#import "UnityAppController+ViewHandling.h"

#import "UnityAppController+Rendering.h"

 

#import "DisplayManager.h"

#import "UnityView.h"

 

#include "RegisterMonoModules.h"

#include "RegisterFeatures.h"

#include <csignal>

 

@interface UnityController()

 

@property (nonatomic, assign) BOOL isInitUnity;

 

@end

 

 

@implementation UnityController

 

+ (instancetype)instance

{

    return (UnityController *)[[UIApplication sharedApplication]valueForKeyPath:@"delegate.unityController"];

}

 

 

- (instancetype)init

{

    self = [super init];

    if (self) {

        self.isInitUnity = NO;

        // 注册Unity的事件

        [[NSNotificationCenter defaultCenteraddObserver:self selector:@selector(appDidBecomeActive:) name:UIApplicationDidBecomeActiveNotification object:nil];

        [[NSNotificationCenter defaultCenteraddObserver:self selector:@selector(appWillEnterForeground:) name:UIApplicationWillEnterForegroundNotification object:nil];

        [[NSNotificationCenter defaultCenteraddObserver:self selector:@selector(appWillResignActive:) name:UIApplicationWillResignActiveNotification object:nil];

        [[NSNotificationCenter defaultCenteraddObserver:self selector:@selector(appWillTerminate:) name:UIApplicationWillTerminateNotification object:nil];

        [[NSNotificationCenter defaultCenteraddObserver:self selector:@selector(appDidReceiveMemoryWarning:) name:UIApplicationDidReceiveMemoryWarningNotification object:nil];

        

    }

    return self;

}

- (void)appWillEnterForeground:(NSNotification *)notification {

    [self applicationWillEnterForeground:[UIApplication sharedApplication]];

}

 

- (void)appDidBecomeActive:(NSNotification *)notification {

    if (nil == self.unityView) {

        return;

    }

    [self applicationDidBecomeActive:[UIApplication sharedApplication]];

}

 

- (void)appWillResignActive:(NSNotification *)notification {

    [self applicationWillResignActive:[UIApplication sharedApplication]];

}

 

- (void)appWillTerminate:(NSNotification *)notification {

    [self applicationWillTerminate:[UIApplication sharedApplication]];

}

 

- (void)appDidReceiveMemoryWarning:(NSNotification *)notification {

    [self applicationDidReceiveMemoryWarning:[UIApplication sharedApplication]];

}

 

 

- (UIView *)playView

{

    return self.unityView;

}

 

static const int constsection = 0;

void UnityInitTrampoline();

void initMain() {

    @autoreleasepool

    {

//        UnityInitTrampoline();

//        UnityInitStartupTime();

        UnityInitTrampoline();

        UnityInitRuntime(0NULL);

        

        

        RegisterMonoModules();

        NSLog(@"-> registered mono modules %p\n", &constsection);

        RegisterFeatures();

        

        // iOS terminates open sockets when an application enters background mode.

        // The next write to any of such socket causes SIGPIPE signal being raised,

        // even if the request has been done from scripting side. This disables the

        // signal and allows Mono to throw a proper C# exception.

        std::signal(SIGPIPE, SIG_IGN);

        

    }

}

 

- (void)initUnity {

    

    if (!self.isInitUnity) {

        

        initMain();

        

        

        if ([UIDevice currentDevice].generatesDeviceOrientationNotifications == NO)

            [[UIDevice currentDevice] beginGeneratingDeviceOrientationNotifications];

        

        UnityInitApplicationNoGraphics([[[NSBundle mainBundlebundlePathUTF8String]);

        [self selectRenderingAPI];

        [UnityRenderingView InitializeForAPIself.renderingAPI];

        _window = nil;

        _unityView      = [self createUnityView];

        

        

        [DisplayManager Initialize];

        _mainDisplay    = [DisplayManager Instance].mainDisplay;

        [_mainDisplay createWithWindow: _window andView: _unityView];

        

        [super applicationDidBecomeActive:[UIApplication sharedApplication]];

        

        self.isInitUnity = YES;

    }

    

}

 

- (void)pauseUnity {

    

    //[self applicationWillResignActive:[UIApplication sharedApplication]];

    UnityPause(1);

}

 

- (void)startUnity {

    

    //[self applicationDidBecomeActive:[UIApplication sharedApplication]];

    UnityPause(0);

}

 

- (BOOL)isPaused {

    if (UnityIsPaused() == 1) {

        return YES;

    }

    else {

        return NO;

    }

}

@end

 

 

4.在ViewController 文件创建一个(sbtn)按钮[驱动AR], 一个view[AR容器],要注意一点要在AppDelegate.m文件初始化UnityController

 

#import "ViewController.h"

 

 

#import "UnityController.h"

 

 

@interface ViewController ()

 

@end

 

@implementation ViewController

 

- (void)viewDidLoad {

    [super viewDidLoad];

    [self initUI];

    // Do any additional setup after loading the view, typically from a nib.

}

 

- (void)initUI

{

//    self.view.backgroundColor = [UIColor whiteColor];

    UIButton *sbtn = [UIButton buttonWithType:UIButtonTypeCustom];

    sbtn.frame = CGRectMake((CGRectGetMaxX(self.view.frame) - 60 ) / 2, 150, 60, 40);

    sbtn.backgroundColor = [UIColor purpleColor];

    [sbtn setTitle:@"AR开始" forState:UIControlStateNormal];

    [sbtn addTarget:self action:@selector(Actions) forControlEvents:UIControlEventTouchDown];

    [self.view addSubview:sbtn];

    

//    UIButton *button1 = [UIButton buttonWithType:UIButtonTypeRoundedRect];

//    button1.frame = CGRectMake((CGRectGetMaxX(self.view.frame) - 60 ) / 2, 150 + 40, 60, 40);

//    [button1 setTitle:@"AR暂停" forState:UIControlStateNormal];

//    [self.view addSubview:button1];

//    button1.backgroundColor = [UIColor redColor];

//    [button1 addTarget:self action:@selector(clickHandler1:) forControlEvents:UIControlEventTouchUpInside];

 

    

    // 供Unity显示的View

//    UIView *view = [[UIView alloc] initWithFrame:CGRectMake(0, CGRectGetMaxY(sbtn.frame) + 50, CGRectGetWidth(self.view.frame), 400)];

    UIView *view = [[UIView alloc] initWithFrame:self.view.bounds];

    [view setBackgroundColor:[UIColor grayColor]];

    [view setTag:22];

    view.hidden = YES;

    [self.view addSubview:view];

    

 

    

 

}

- (void) clickHandler1:(id)sender

{

    if ([[UnityController instance] isPaused]) {

        [[UnityController instance] startUnity];

    }

    else {

        [[UnityController instance] pauseUnity];

    }

}

 

 

- (void)Actions

{

    NSLog(@"ar");

//    self.unityController = [[UnityController alloc]init];

    [self.view viewWithTag:22].hidden = NO;

    [[UnityController instance]initUnity];

    [UnityController instance].playView.frame = [self.view viewWithTag:22].bounds;

    [[self.view viewWithTag:22addSubview:[UnityController instance].playView];

 

//    AppDelegate *delegate = (AppDelegate *)[UIApplication sharedApplication].delegate;

 

}

- (void)didReceiveMemoryWarning {

    [super didReceiveMemoryWarning];

    // Dispose of any resources that can be recreated.

}

 

 

@end

 

5.在AppDelegate.m文件初始化UnityController

 

7.问题收集

(1)在使用统一摄像头的时候黑屏

问题表现为,在使用Unity打包出来的项目运行是正常的,但是集合到现有项目的时候,摄像头显示区域是黑屏。错误码是:EasyAR is running on an unsupported graphics device of type -4
解决的方法:

 

运行结果:

 

 

 

转载于:https://www.cnblogs.com/shenlaiyaoshi/p/7856577.html

2017-04-07 13:10:48 u012763405 阅读数 105
  • Unity开发AR创意礼物:会动的照片

    小新:“想想我给女神一个相册,每个照片背后都有一段我们美好的记忆,那女神不得老感动了,哈哈哈。” 大智:“不给你拉黑就是万幸了。我已经将撩妹绝学传授给你,你可不能吃独食。” 小新:“那必须的,我得立马分享出去,造福广大同胞。” 大智:“这才像话。” 最终效果如下: 开发需要用到的工具如下: * Unity * EasyAR SDK(https://www.easyar.cn/view/download.html#download-nav2) * 发布需要使用的:安卓(Android SDK+JDK) / iOS(XCode) 开发的简要流程如下: * 创建Unity工程,导入EasyAR SDK * 申请EasyAR的liscense key,并配置到Unity中 * 在HelloAR_ImageTarget_Video的场景基础上进行改造,实现多图片的跟踪 * 测试、发布

    44 人正在学习 去看看 郑洪智

  上一个博客主要讲了怎么成功运行HelloAR,这一次我们来自己增加识别图片就是target,同时自己加一个识别后出来的3D模型。

同时也是按照网上教程做的,想要看详细的点开一下优酷网址

http://v.youku.com/v_show/id_XMTQ5MDkxMDc5Ng==.html?from=s1.8-1-1.2

zyx大神提供。

 

【增加Target-image】:

这里面的Target-image主要保存在



 大家将自己的照片导入进去,我就导入我的校园卡照片进去,重新命名。

【添加照片到targets配置文件里面】:

配置文件就在上图图片旁边的targets.json文件。可以用记事本方式打开

 像上述方式将你的图片添加进去

包括名称格式,可以直接复制粘贴target图片已有的配置换成你自己的就好了。

同时将图片添加到:textture

 



 

【添加你自己的扫描后出来的立体模型】



 



 

 

复制粘贴一个现有的,将上面的图片改成自己之前导入的或者自己其他的图片,前提是要导入到textsture里面。

 

【禁用其他功能】:

 在这里我们复制粘贴idback这个功能,自己命名然后禁用前三个功能,像这样:


在这里把钩钩取消掉。

因为我们只想要单纯实现图片target识别功能。

【3D模型建立】:

 


在这里建立一个球体,自己拖动好位置,同时在右边
 

 



 materials里面的element0里面选择材料为我们在materials里面建立的zyy模型。

现在就大功告成了。

我们增加了可识别图片,同时增加了识别后加载的模型。

 

【效果图】:

开启unity3D运行,出现摄像头,将自己的target图片放入摄像头范围扫描:



 
 

搞定。大家想要做生动的可以放入立体人物模型什么的。

 

没有更多推荐了,返回首页