专栏首页WeTest质量开放平台团队的专栏Pokémon GO国内玩不了?腾讯AR专家教你自己做!

Pokémon GO国内玩不了?腾讯AR专家教你自己做!

作者:zero,腾讯测试开发工程师。

WeTest导读

Pokémon Go一出,新鲜的玩法、经典的IP效应让这款使用了Unity以及AR技术的手游火遍了“大洋”南北。可惜的是这款新鲜的游戏还没有惠及中国市场的玩家们。腾讯内部的AR专家秉持着“一言不合就自己开发”的原则,自发对AR游戏进行了预研,本文将通过在Unity中对OpenCV及Vuforia库的使用,简单介绍制作AR游戏的一系列流程。

如果你在街头巷尾

看到这样拿着手机到处晃悠的景象

他们一定是在抓小精灵!


《Pokémon Go》采用AR技术 只需一台自带GPS功能的智能手机 就可以满世界地找小精灵 然后扔精灵球以捕获精灵

那么问题就来了

AR技术是什么?

增强现实(Augmented Reality,简称AR),是一种实时地计算摄影机影像的位置及角度并加上相应图像的技术,这种技术的目标是在屏幕上把虚拟世界套在现实世界并进行互动。简单的说,在Pokémon Go这款AR游戏中,精灵是虚拟的, 地图是真实的,虚拟的精灵出现在了真实的地图之中,给了玩家十分新鲜的体验。

于是

Pokemon Go拯救了无数的死宅们

大家上街抓

上厕所也抓

不过,Pokémon Go现在还拯救不了国内的死宅们

目前Pokémon Go在国内已被锁区 而解锁的时间还不确定。。。

然而!腾讯的技术大牛在遇到新鲜事物的时候是拦不住的!秉持着“一言不合就自己开发”的原则,大牛决定,自己做一个AR游戏!!

Pokémon Go的游戏引擎用到了Unity技术,在腾讯大牛预研的AR游戏中,分别用到了OpenCV及Vuforia库,下面将简单分享下两个库的使用。

想收服小萝莉吗?

一、OpenCV篇

OpenCV是英特尔发起并参与开发的计算机视觉库,在图像处理、模式识别及计算机视觉领域被广泛使用,这里就不做过多介绍了。

1.1 OpenCVForUnity

Unity有现成的OpenCV库,使用起来很方便。

具体使用方法:

1.导入OpenCV for Unity.unitypackage

2.将导入后OpenCVForUnity目录下的Plugins和StreamingAssets文件夹移到Assets目录下

OpenCVForUnity目录下的Samples里有很多写好的示例,比如阈值分割、霍夫变换检测直线、人脸检测等,如果想运行需要在Build Settings里添加好对应场景,其中有的需要用到摄像头。

1.2 OpenCV在Unity中的应用

背景是组里基于Unity做的一个AR小游戏——打飞碟,其中使用OpenCV实现了红外效果及人脸检测:

红外模式:

当场景中出现了半透明的敌机时,可开启红外模式看清隐形敌机的位置。

这里主要用OpenCV对摄像头获取的图像做了颜色变换:首先将图像转为灰度图(cvtColor),然后基于某个色谱,根据不同的灰度值映射为不同的颜色(applyColorMap)。

对于此类滤镜也可以通过Unity的Shader来做(如下图),相比OpenCV性能要好些,但OpenCV做图像处理更灵活,也可以尽量去优化:

1.限制图像的更新频率;

2.降低图像的分辨率(OpenCV可以用resize);

3.对于必要的Mat可以在类初始化时申请好空间,不用每次处理图像都申请再释放;

4.利用多线程(主要用在了人脸检测模块)。

好友助战:

遇到强大Boss时,可将摄像头对准好友(人脸),当检测到人脸时,会出现好友助战剧情,协助攻击Boss。

面具怪:

同好友助战模式也利用了人脸检测,当在图像中检测到人脸时,会出现附着在人脸上的面具怪,并跟随其移动。

首先,简单区分下人脸检测和人脸识别这两个概念:人脸检测是找到图像中人脸的位置、大小,而人脸识别不仅要检测出人脸,还要知道这人是谁。

OpenCVForUnity中的人脸检测示例用到了基于Haar特征及LBP特征的两种分类器来检测人脸(已经训练好的分类器,想自己训练或者自己实现性能更优的算法可以去咨询优图~),同时也用到了多线程来异步计算,对于在性能较差的移动设备上来实现人脸检测具有较好的参考性。

对于移动设备,人脸检测计算量较大(Unity本身开销已经不小了),所以不能对每帧图像都进行检测,可以利用多线程进行异步计算:

好友助战模式是检测到人脸后,在人脸上添加一些装饰物(copyTo用装饰物的PNG图片做掩膜)作为剧情的一部分;而面具怪则是根据检测到人脸的位置和大小来改变怪物的位置和大小。此外,如果进一步需要进行人脸识别,那不建议在移动设备上做,性能肯定吃不消了,可以用云,将计算放在服务器上。

二、Vuforia篇

Vuforia是高通的增强现实库,对unity支持好,使用起来简单方便,如下图所示为组内使用Unity+Vuforia开发的坦克大战AR版:通过识别预先设定的标志物(此处为lena头像),从而确定游戏世界所在的平面及大小,和实景结合展现出坦克大战游戏场景。

简要介绍下Vuforia在Unity中的使用:

1.在官网注册账号后,首先注册一个License,并记下License Key;

2.下载Vuforia库导入到Unity中;

3.选取一张待识别图片上传到Target Manager,如下图所示

创建Database:

添加待识别图片:

4.生成库后,注意Rating的星级,越高越好(识别度越高);将库下载下来导入到Unity中。

5.在Unity中搜索ARCamera和ImageTarget,并拖到场景中,ARCamera中的App License Key填入刚才申请的License Key,Database Load Behaviour(Script)中勾选”Load QQ Database”(这里根据Database的名字有所不同)和”Activate”,在ImageTarget中的Database选择刚才申请的识别图片Database的名字(QQ),此时场景中会出现识别图片

6.根据识别图片(ImageTarget)的相对位置将游戏物体或场景作为ImageTarget的子物体进行摆放。

7.按照上述步骤即可在Unity中简单使用Vuforia库,如果有更多需求可以去了解下它的其他功能及API;例如,为了增强识别效果,可以加入摄像头的对焦:

Vuforia.CameraDevice.Instance.SetFocusMode(Vuforia.CameraDevice.FocusMode.FOCUS_MODE_TRIGGERAUTO);

在实际使用中,Vufroia库简单易用,识别准确度较高,对手机性能消耗适中,但构建的虚拟场景容易因环境干扰发生一定抖动,影响玩家游戏体验;可同时识别多个物体,但准确度有所降低;长时间游戏会导致摄像头发烫。

为了避免以上手游性能方面对游戏的负面影响,可以利用一些现成的测试工具进行深度的检测,腾讯游戏品质管理团队专门打造的工具“Cube”(☜点击可查看更多资讯)目前已经可以使用,“Cube”可以帮助开发者发现Unity手游内分类资源的占用情况,尤其是对Unity游戏场景中的FPS、CPU、PSS的变化趋势重点关注,帮助在Unity游戏开发过程中不断改善玩家的体验。目前功能还在免费开放中。

关于腾讯WeTest

腾讯WeTest是腾讯游戏官方推出的一站式游戏测试平台,用十年腾讯游戏测试经验帮助广大开发者对游戏开发全生命周期进行质量保障。 腾讯WeTest提供:兼容适配测试;云端真机调试;安全测试;耗电量测试;服务器压力测试;舆情监控等服务。

本文分享自微信公众号 - 腾讯WeTest(TencentWeTest),作者:zero

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2016-07-14

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 腾讯WeTest移动测试沙龙邀请【第二期】——Unity性能及测试开发沙龙,与你相约ChinaJoy!

    7月28日ChinaJoy期间,腾讯WeTest将联合Unity官方一起举办Unity性能及测试开发沙龙,分享手游上线前的适配兼容测试、单元测试、性能分析优化...

    WeTest质量开放平台团队
  • 腾讯WeTest移动测试沙龙邀请【第二期】——Unity性能及测试开发沙龙,与你相约ChinaJoy!

                     测试开发者的共同关注! 7月28日ChinaJoy期间,我们将举办Unity性能及测试开发沙龙,分享手游上线前的适配兼容测试...

    WeTest质量开放平台团队
  • 每当创业时,就会想起我!

    最近公司里的技术小K告诉我说:他要辞职去做游戏,让我别张扬。我心中暗笑,平时一副傻头傻脑的样子,啥事都要来问我意见,还想去做游戏,难道是要我去做他的狗头军师!...

    WeTest质量开放平台团队
  • 快手王华彦:端上视觉技术的极致效率及其短视频应用实践 | AI ProCon 2019

    快手用户日均上传1500万个视频,要把这些作品准确的分发给超2亿活跃用户,如果没有强大的AI技术系统去理解视频内容以及用户行为和需求,很难做到。

    AI科技大本营
  • 简单粗暴解读Cortex-M23/33(下)

    上篇文章,我们揭秘了 Cortex-M 家族的新成员、ARMv8-M 架构的两位先驱——传承自 Cortex-M0/M0+ 的 Cortex-M23 和传承自 ...

    GorgonMeducer 傻孩子
  • 【go】剑指offer: 删除链表结点O(1)时间复杂度

    给定单链表的头指针和一个结点指针,定义一个函数在O(1)时间删除结点,链表结点与函数的定义如下:

    陌无崖
  • 【DB笔试面试452】函数SUBSTR和INSTR有什么区别?

    SUBSTR和INSTR都是字符函数,SUBSTR是截取子串,而INSTR的作用是获取指定字符的位置。

    小麦苗DBA宝典
  • “365算法每日学计划”:06打卡-单向循环链表

    单向循环链表是单链表的另一种形式,其结构特点是链表中最后一个结点的指针不再是结束标记,而是指向整个链表的第一个结点,从而使单链表形成一个环。

    好好学java
  • 算法优化二——如何提高人脸检测正确率

    零、检测   接上篇博文继续探讨人脸检测的相关内容,本文会给出Opencv中自带的人脸检测的相关对比以及Opnev检测中常用的标注等相关操作。人脸检测是一个非常...

    深度学习思考者
  • 安永发布全球金融科技应用指数报告 中国领跑全球!

    近日,全球知名咨询机构安永发布《2017年金融科技应用指数报告》(EY FinTech Adoption Index 2017》,对全球20个主要经济体的金融...

    点滴科技资讯

扫码关注云+社区

领取腾讯云代金券