目前AR技术主流的门派为Metaio、QCAR( vuforia)、D'Fusion 而且都在与Unity 和 Html5 结合。花了两天时间研究了下各个SDK与Unity整合的情况,结论如下:
1、 Metaio SDK最靠谱,下载安装后就可以直接在unity里跑例子了,丰富的教学资源。免费(限制+水印) 与 付费授权结合 vuforia,
2、高通的AR解决方案,需要在他的网站上进行Target Manage,也就是图像预处理,这个挺扯的。不过支持立体贴图(铅块,立方体,圆台)。使用的时候需要自己先上传图片,等uvforia的网站处理好了再下回来给应用程序使用。不过识别度不高,我传了10多张都没成功。最新版本的更恶心,需要appkey了,在后面我们会说到
3、D'Fusion, 也有支持Unity的安装包,但是目前只支持到Unity3.5,现在Unity都4.2了啊,所以DF的例子我没有成功运行起来。
全球范围内还有十分多的AR SDK,如下页面显示了它们之间的区别,十分有用 http://socialcompare.com/en/comparison/augmented-reality-sdks
我主要关注跨平台、云端、自然图像识别这些方面,大家可以根据自己项目有针对性的进行选择。可以看出来Metaio不愧为AR技术的大牛品牌,顺带一提该公司技术支持是涵盖硬件软件的。
下面说下集成
高通的方面在这方面很坑,下载下来的demo是直接不能用的需要更改,改完以后还不行,说是key无效,下面是我的高通的流程,希望能给以你一些帮助
1、下载高通的SDK (记得下载IOS版本的SDK)
https://developer.vuforia.com/downloads/sdk
这里有安卓、iOS和u3d的SDK以及例子,SDK和例子可以分开下载,例子分为3种,核心样品、高级主题、最佳实践等
如果你觉得下载慢,也可以在我的github上面进行下载
https://github.com/149393437/Vuforia_AR
先要解决报错信息#import
这个是因为他的库和例子是分开导致没有加入,所以需要把SDK加入到工程里面,之后依然报错,需要在headerSearchPath里面添加路径,见图
注意此工程由于是现实增强,需要真机调试才可以,模拟器无法运行的!
程序界面如下图
运行后你会发现几乎所有的例子都无法运行,说是key错误,也就是你的数据没有配置
打开代码修改
在SampleApplicationSession类中131行初始化Appkey,原来这里啥也没写
QCAR::setInitParameters(mQCARInitFlags,"33a32261b4dd45e9afa12d2a4723bb46");
33a32261b4dd45e9afa12d2a4723bb46这段就是要替换为你自己的,什么~你不知道在哪吗?去官网注册一下账号密码,然后点击创建出来
第一步注册与登录
第二步创建一个标示
第三步添加扫描的特征码
接下来有几个步骤了,首先AR,你想看到效果吧,那么我们先在你的工程内找到资源包
打开imageTargets中的选择chips.jpg打开填写图片摘要(选填)填写图片摘要(选填)
然后运行demo在表格中选择第一个imagetargets,就会出现摄像机镜头,然后对着上面这张图片,你会惊喜的看到一个茶壶在上面,把手移动过去,诶呀,茶壶在上面,图片在下面,在把图片移动一下,诶呀,茶壶也跟着移动,在把手机移动,发现茶壶还是在原地,这就是AR (如果你是从官网下载的demo,茶壶的颜色应该和我的不一样~~呵呵)
那么让这个茶壶显示在你的指定的一个图形或者一个物体上呢,而不是默认的这个呢,前面我们说到一个特征码的事情
特征码是需要把文件上传到他的网站上面进行预处理后,给你一个特征码,所以这里比较麻烦,下图是我已经弄好的特征码,点击zhangcheng 你需要点击你的
然后点击Download Database 下载这个文件,这个文件夹包含2个文件 一个是dat 另一个是xml 这2个文件是标识了摄像头遇到什么物体,提取特征后进行显示模型的,我们需要的xml里面的一段数据 把这2个文件加入到工程内
打开工程,在imageTargetsViewController中doLoadTrackersData是加载标识数据的
把stonesAndChips修改为zhangcheng即可,那么这不算完,在imageTargetsEAGLView中第270行左右的位置 // Choose the texture based on the target name
int targetIndex = 0; // "stones"
if (!strcmp(trackable.getName(), "chips"))
targetIndex = 1;
elseif (!strcmp(trackable.getName(), "tarmac"))
targetIndex = 2;
那么其中chips和tarmac是怎么来的,请看下图
把chips和tarmac替换为cc和xx 这样AR里面的3D模型就在你指定的界面上显示了,无图无真相,上图
值得注意的是你在修改完程序以后,建议你先把手机上原本的程序先删除,程序clean后在进行操作,否则有时候会出错,也就是有数据残留
那么好了,我们学会了如何在指定的图片上显示茶壶了,但是茶壶真的不是我们想要的,我们想要的是一个我们需要的模型,那么模型从哪来?
有很多软件都可以做模型,我个人比较喜欢高达系列,所以我使用3DMax做了一个dynames的模型,然后点击导出,选择Obj格式的,这样一个模型的顶点坐标、法线、纹理就全都出来了,但是iOS不认识这些,我们需要把他转换为.h文件,.h文件里面写了3个数组,记录相关数字,这个文件非常大,没事不用去看了
因为高通ARsdk识别的是这类的头文件。头文件中包含了这个模型的坐标数据。提取这些坐标数据通过OpenGL进行渲染就可以绘制出图形。这是后话。现在介绍怎么将obj文件转为头文件。首先从网上下载ActivePerl和obj2opengl.pl。ActivePerl是一个perl的脚本解释器。obj2opengl.pl就是使用perl语言写的一个脚本程序。顾名思义,就可以知道这个脚本程序的作用就是将obj->opengl能够使用的头文件。这两个可以在下面这个链接下载:
http://download.csdn.net/detail/ggtaas/4998573
http://download.csdn.net/detail/ggtaas/4998714
ActivePerl解压之后直接安装,一般安装在c盘的perl文件夹下,然后将第二个压缩包解压得到的obj2opengl.pl文件拷贝进bin文件夹下。这样这个工具就可以用了。很简单吧。下面将你需要转换的obj文件也拷贝进bin文件夹中,例如是dynames.obj,再运行下面的dos命令就可以了,见下图:(图后续补充)
然后就有dynames.h文件 里面有3个C语言的数组和一个int值 在我们后续都会用到,没事就别去砍dynames.h 因为实在是太大了,几万行的数据,所以复制黏贴吧
dynames.h 一共是4个参数 其中3个是数组 dynamesVerts dynamesNormals dynamesTexCoords dynamesNumVerts 这些数据主要是在SampleApplication3DModel中进行赋值的 这里我主要加载了2个模型 蝎子和高达的,所以我用宏定义做了一下判断
- (int) numVertices {
if(XZorDYNAMES){
returndynamesNumVerts;
}else{
returnxzNumVerts;
}
}
- (float *)vertices {
if(XZorDYNAMES){
returndynamesVerts;
}else{
returnxzVerts;
}
}
- (float *)normals {
if(XZorDYNAMES){
returndynamesNormals;
}else{ returnxzNormals; }
}
- (float *)texCoords {
if(XZorDYNAMES){
returndynamesTexCoords;
}else{
returnxzTexCoords;
}
}
这样模型就修改好了,但是为什么加载不出来呢?查看代码发现在imageTargetsEAGLView中的renderFrameQCAR方法中offTargetTrackingEnabled是bool值,控制模型无法加载,可以设置为YES即可
什么?还没有?呵呵,那是你没看见,因为模型太小了,在最上面也就是60行左右的位置有个constfloat kObjectScaleOffTargetTracking = 150.0f;这个值是管放大的,所以可以设置为150,这样你就看到了一个黑乎乎的素模高达
那么上颜色怎么办textureFilenames中添加素材
由于vv.png我设置的是一张白色图片,所以你就看到了一个白色的高达了,关于iOS版本的AR就说到这里我的例子我共享在我的github上了,你可以直接下载,就能使用
https://github.com/149393437/Vuforia_AR
当然扫描时候选择扫描下面这个图
在最后也给出一些其他的教程资料
官方网站
https://developer.vuforia.com
高通中国
http://vuforia.arinchina.com/
u3d高通教程
http://www.unitymanual.com/labe/6821/
u3d教程
http://94it.net/a/jingxuanboke/2014/0719/370004.html