前言

关于AR和Unity的基础知识,请自行前往各自的文档中心进行科普。

本文以国产的HiAR SDK为例,日后将尝试高通的vuforia SDK

我的环境

基于Hi AR1.2.0 ( hiar_sdk_unity_20160809_v1.2.0_3c0e908.zip  ( 47.4 MB )  )

Unity3D 5.3.5f1 x64

Windows 7 x64

罗技摄像头(硬件),摄像头支架

制作识别图集

1. 在SDK的管理后台创建一个新应用,获取应用的AppkeySecret,在Unity中会用到。

2. 在SDK的管理后台中创建图集,并添加图片,完成之后发布图集

3. 把图集和应用进行关联

4. 在SDK的管理后台中下载本地识别包文件,一般是以图集为命名的unitypackage文件

导入识别图集到Unity

我创建的图集名称:xxdata

图集中有以下两张图片:

  • battleboard.png

  • card.png

下载的本地识别包文件(xxdata.unitypackage),在导入到Unity中的文件如下:

Editor
 HiAR
 ImageTargetTextures
 xxdata
 battleboard.png
 card.png
StreamingAssets
 HiAR
 xxdata.xml (里面是图集中的图片信息,一行是一张图片的数据,Key值是一个32位字符串)
 xxdata
 792c5ed97942d50f185be13ed9822b3c.db(32位的key和xxdata中对应)
 22b72d7e5b182ed15e9ede20268d8a6b.db

总结一下就是:

1. 在Editor\ImageTargetTextures\下有以图集命名的文件夹,文件夹中有图集中的图片文件

2. 在StreamingAssets\HiAR\目录下有以图集命名的xml文件图集命名的文件夹,文件夹下有图片Id命名的db文件

xxdata.xml文件内容如下:

<?xml version="1.0" encoding="UTF-8"?>
<HiAR>
<KeyItemList>
<KeyItem name="card" targetID="22b72d7e5b182ed15e9ede20268d8a6b" width="535" height="528" extName=".png" version="1.2.0"></KeyItem>
<KeyItem name="battleboard" targetID="792c5ed97942d50f185be13ed9822b3c" width="1024" height="1024" extName=".jpg" version="1.2.0"></KeyItem>
</KeyItemList>
</HiAR>

32位key值文件名的db文件

某种格式的文件,从里面可以看到HiScene AR Key,猜测db中存储了图片的识别点数据

图集中每个图片有对应的一个db文件,可知此db文件必然和图片有关联关系。

示例分析

简单识别

场景层次(Hierarchy)结构:

HiAR Camera (SDK的核心,绑定了两个脚本:HiAREngineBehaviour,TargetManagerBehaviour)

​  camera (3D相机,渲染3D GameObject,绑定的脚本:HiARCameraBehaviour)

Imager Target (识别点,可以有多个,绑定的脚本:ImageTargetBehaviour,实现这几个接口ITrackableEventHandler, ILoadBundleEventHandler, IRelativeMoveTarget)

​  识别成功:识别图移动时或者有遮挡时,Transform的属性会发生改变,并且ImageTarget下的Child会显示

​  识别失败:Transform属性无变化,并且ImageTarget下的Child会隐藏

camera source (一个MeshRenderer,硬件摄像头摄像到的图像实时渲染在此(类似于render texture?))

camera background (2D相机,渲染camera source的图形)

重点解释:

camera (3D相机 Clear Flags为Depth,拍摄场景中的3D GameObject)

camera background (2D相机,Clear Flags为Solid Clear,渲染物体摄像头拍摄的画面)

摄像头拍摄的图像显示在camera source(mesh renderer)上

摄像头拍摄的真实画面和引擎生成的三维物体进行叠加。

AR识别成功的应用

当识别图识别成功之后,执行一些操作,可以理解为Callback。

HiAR的例子是:识别成功之后,播放视频。

当然你可以在识别成功之后,生成一些模型和场景出来,这样就和开发其它游戏一样,可以对Scene中的GameObject进行控制,比如播放动画,打斗,特效之类的。

涂涂乐

把识别图上的图像实时渲染在模型上(Material),类型涂鸦。

  1. 添加一个待涂包的模型,添加组件:HiARPaintShader:HiARPaint

  2. 硬件摄像头拍摄识别图(实时拍摄)

  3. 根据识别到的图,提取图像生成Material,动态地渲染。

  4. 期间会生成几个识别点

过程中如果有拍摄到其它物体,新生成的材质会实时更新

多图识别

多图识别,就是在简单识别的基础上添加多个ImageTarget

步骤:

  1. 在HiAR Camera(HiAREngine组件) 的属性面板勾选 MuiltTarget
  2. 在场景中添加多个ImageTarget,并为每一个ImageTarget选择识别图

动态加载

动态加载识别目标进行识别跟踪的功能,继承自TartgetDynamic

    void OnGUI()
{
if (GUI.Button(new Rect(30, 30, 200, 80), "Add Key"))
{
AddImageTarget(System.IO.Path.Combine(Application.streamingAssetsPath, Pic1Path), Pic1Key, 1024, 1024);
}
} //识别回调
public override void OnDynamicReco(RecoResult recoResult)
{
Debug.Log("识别成功。。。。。");
GameObject gameObject = null;
gameObject = new GameObject();
if (recoResult.keyType == KeyType.IMAGE)
{
gameObject.AddComponent<ImageTargetBehaviour>();
}
Debug.LogFormat("recoResult.keyType:{0}", recoResult.keyType);
Target target = gameObject.GetComponent<Target>();
if (target == null)
{
Debug.LogError("Get Target Null !");
return;
}
target.PixelWidth = recoResult.Width * 0.01f;
target.PixelHeight = recoResult.Height * 0.01f;
gameObject.transform.parent = transform.parent;
gameObject.SetActive(true); if (recoResult.KeyId.Equals(Pic1Key))
{
GameObject cube = GameObject.CreatePrimitive(PrimitiveType.Cube);
cube.transform.parent = gameObject.transform;
cube.transform.localScale = new Vector3(1.0f, 1.0f, 1.0f);
}
else
{
Debug.LogErrorFormat("recoResult.KeyId:{0} not equals :{1}", recoResult.KeyId, Pic1Key);
}
bindingGameObject(gameObject, recoResult.KeyId);
}

设置中心点

勾选 ImageTarget (ImageTargetBehaviour组件)的CenterPoint之后,带有物理引擎效果的物体运动就有了中心点。

AR For Unity3D之HiAR分析的更多相关文章

  1. 【Unity3D】简要分析unity3d中剪不断理还乱的yield

    在学习unity3d的时候很容易看到下面这个例子: void Start () { StartCoroutine(Destroy()); } IEnumerator Destroy(){ yield ...

  2. 高通AR增强现实Unity3D

    AR: 增强现实,台湾翻译叫做扩张实境 1.注册.然后下载sdk(注册账号主要是为了第3步中制作识别图而用的) 下载地址:https://developer.vuforia.com/resources ...

  3. 承接VR外包|AR外包|Unity3D外包|UE4外包(内附案例演示)

    北京团队长年承接VR/AR项目外包 咨询QQ:372900288  微信:liuxiang0884

  4. Unity3d底层数据传递分析

    WeTest 导读 这篇文章主要分析了在Mono框架下,非托管堆.运行时.托管堆如何关联,以及通过哪些方式调用.内存方面,介绍了什么是封送,以及类和结构体的关系和区别. 一.托管交互(Interop) ...

  5. 虚拟现实外包—动点飞扬软件专门承接VR/AR场景、游戏、项目外包

    VR外包AR外包公司(虚拟现实外包公司)承接虚拟现实项目开发(企业.教育.游戏.企业大数据展示等) 有VR/AR.Unity3D项目.游戏外包业务欢迎 联系我们 QQ:372900288 TEL:13 ...

  6. 再谈AR中的图像识别算法

    之前在<浅谈移动平台创新玩法>简单的猜测了easyar中使用的图像识别算法,基于图片指纹的哈希算法的图片检索 .后再阿里引商大神的指点下,意识到图片检测只适用于静态图片的识别,只能做AR脱 ...

  7. 修改ActiveReports验证文字“给不能为 null 的参数指定一个 null 值”

    转:http://gcdn.gcpowertools.com.cn/showtopic-13759.html ActiveReports官方网站:http://www.gcpowertools.com ...

  8. 【DSP开发】利用CCS5.4开发基于DSP6455的JPEG2000图像解压缩过程

    [DSP开发]利用CCS5.4开发基于DSP6455的JPEG2000图像解压缩过程 声明:引用请注明出处http://blog.csdn.net/lg1259156776/ 说明:前端是时间基于VS ...

  9. GJM : Unity3D HIAR 目录导航

    感谢您的阅读.喜欢的.有用的就请大哥大嫂们高抬贵手"推荐一下"吧!你的精神支持是博主强大的写作动力以及转载收藏动力.欢迎转载! 版权声明:本文原创发表于 [请点击连接前往] ,未经 ...

随机推荐

  1. Unity3D 5.x 简单实例 - 孤岛场景搭建

    1,如果我们的Unity 5.X 是从这个地址下载的,安装后不会有资源包,则需要从Unity3D官网下载资源包: Standard Assets (Unity 5.x) 下载 下载后安装后,Unity ...

  2. 在DirectShow中支持DXVA 2.0(Supporting DXVA 2.0 in DirectShow)

    这几天在做dxva2硬件加速,找不到什么资料,翻译了一下微软的两篇相关文档.并准备记录一下用ffmpeg实现dxva2,将在第三篇写到.这是第二篇.,英文原址:https://msdn.microso ...

  3. 使用Enyim.Caching访问阿里云的OCS

    阿里云的开放式分布式缓存(OCS)简化了缓存的运维管理,使用起来很方便,官方推荐的.NET访问客户端类库为 Enyim.Caching,下面对此做一个封装. 首先引用最新版本 Enyim.Cachin ...

  4. float包裹性与破坏性及清除浮动几种方法

    1. “清除浮动” ??准确的描述应该是“清除浮动造成的影响”  学习视频录制推荐的教程<CSS深入理解之float浮动> 2.如何清除浮动造成的影响??? 栗子 块级div元素包含一个内 ...

  5. CSS3过渡详解-遁地龙卷风

    第二版 0.环境准备 (1)过渡需要浏览器的支持,使用这些属性要加上浏览器厂商的前缀,我用的chrome49已经不需要前缀了, -o- Opera -webkit- Safari.Chrome -mo ...

  6. 第一次react-native项目实践要点总结

    今天完成了我的第一个react-native项目的封包,当然其间各种环境各种坑,同时,成就感也是满满的.这里总结一下使用react-native的一些入门级重要点(不涉及环境).注意:阅读需要语法基础 ...

  7. js数组中数字从小到大排列

    function findMin(start,arr){ var iMin = 99999; var iMinIndex = -1; for(var i = start;i<arr.length ...

  8. SharePoint 2013 文档上传的多种形式

    SharePoint 2013 中的某些功能需要使用 ActiveX 控件.这会在不支持 ActiveX 的浏览器上产生限制.目前只有 32 位版本的 Internet Explorer 支持此功能. ...

  9. [Android]Android端ORM框架——RapidORM(v1.0)

    以下内容为原创,欢迎转载,转载请注明 来自天天博客:http://www.cnblogs.com/tiantianbyconan/p/4748077.html  Android上主流的ORM框架有很多 ...

  10. Google C++单元测试框架GoogleTest---TestFixture使用

    一.测试夹具(Test Fixtures):对多个测试使用相同的数据配置 如果你发现自己写了两个或更多的测试来操作类似的数据,你可以使用测试夹具.它允许您为几个不同的测试重复使用相同的对象配置. 要创 ...