首先来说一下我们公司的需求:有雷同的码农可以往下看,我们公司比较坑想让我写一个AR识别博物馆藏品功能这个比较蛋疼,(就是类似与扫二维码然后弹出详细信息的功能)。
当我看了官方demo的时候我发现有两个可以研究,说明一下我研究的是VuforiaSamples-6-2-61和vuforia-sdk-ios-6-2-6官方下载
这个是demo跑起来的首页
demo运行步骤:
1.demo识别图片都在【vuforia-sdk-ios-6-2-6 ->media】文件里面(对于大神这些都不是个事,但对于我这种菜菜就是这个事)
里面有没有功能的识别图片,对应的识别就可以了,再不行你就不要开发了回家种地吧。2.ImageTargets功能,这个功能官方的是上传一张图片,识别成功以后会显示一个3D模型,对于显示模型后面我给改成跳转到另一个Controller。(所以这个功能比较符合我们公司的需求)
3VuMark功能这个比较神奇,我之所以没有采用,问题就处在.svg图上,我们美工不会,我也没办法,下面就介绍ImageTargets功能里面的一些简单方法
官方的初始化方法啥的就不说了,照着写就行了,我说一个最关键的方法在ImageTargetsEAGLView.mm文件中
4.这个方法是AR相机不停地识别扫描,然后渲染的方法
- (void) renderFrameWithState:(const Vuforia::State&) state projectMatrix:(Vuforia::Matrix44F&) projectionMatrix {}
在介绍之前我还要简单的说一下使用方法:在识别界面手指双击会弹出菜单有三个Switch其中Flash就是开启闪光灯,其他两个就是在这个方法面用到的。
上面方法中有
if (offTargetTrackingEnabled) {
}else {}这一类的如果Switch(ExtendTracking)这个按钮出于开启状态,程序就会走if里面否则就是else,默认是else.
(const Vuforia::State&) state:这个是识别跟踪到数据状态(个人理解,具体是啥我也不知道)里面包含了,你上传到高通服务器上图片的信息。
(Vuforia::Matrix44F&) projectionMatrix:这个是将要显示的模型矩阵。(就是3D模型)
解释一下这个for循环:
for (int i = 0; i < state.getNumTrackableResults(); ++i) {【当你去识别你的图片的时候state才会不为空for循环才会被执行,否则里面的代码是不会被执行的】
其中state.getNumTrackableResults()这可是一个好东西呀是相机跟踪到的所有结果的数量(个人理解)
打印NSLog(@"state%d",state.getNumTrackableResults());这个你会发现跟你上传到服务器上面识别的图片数量一样,此时作为开发人员你就应该有想法了。
const Vuforia::TrackableResult* result = state.getTrackableResult(i);这一句
const Vuforia::Trackable& trackable = result->getTrackable();
这两句就是得到当前正在识别的可追踪的对象数据
打印NSLog(@"state %s",trackable.getName());
NSLog(@"state %d",trackable.getId());你会发现你上传的图片名字和id,这正是你正在扫描的那张图片OK,
现在一个重大的问题解决了,首先你知道协议方法是哪一个,如何区分你所上传的图片。
5.下面介绍一下
识别以后每次回调更新AR的方法,这方法自然在ImageTargetsViewController.mm控制器中
我理解成数据更新这个里面人家原有的看不懂,你可以不用动,直接在下面将上面的for循环写在后面
报错会报错原因是少了头文件#import<Vuforia/TrackableResult.h>添加以后应该就没啥问题了,
然后你就可以在控制区中拿到你想要区分数据。
6.下面就可以实现我们自己的东西了首先你要干的事情就不要再demo定义的方法里面实现了,他扫描的速度很快,异步啥的人家已经搞好,你现在要做的就是再开一个线程,然后知道如何启动AR扫描,如何关闭AR,暂停等。
启动:NSError *error = [[NSError alloc]init];
[vapp startAR:Vuforia::CameraDevice::CAMERA_DIRECTION_BACK error:&error];
停止:在- (void)viewWillDisappear:(BOOL)animated里面你可以参考一下,demo里面的
暂停:- (void) pauseAR {}调这个
恢复:- (void) resumer{}调这个
7.最后重点是Trackable.h文件这里面都是识别到的信息。你都可以用trackable.getId()这种方式访问。
时间匆忙来不及细细解说,都是我个人的看法,要是有不对的地方,请大家多多帮我指正,我是一个小菜菜,请不要用大神的标准来衡量,记住我很菜菜。
网友评论