关于AR和Unity的基础知识,请自行前往各自的文档中心进行科普。ide
本文以国产的HiAR SDK为例,往后将尝试高通的vuforia SDK动画
基于Hi AR1.2.0 ( hiar_sdk_unity_20160809_v1.2.0_3c0e908.zip ( 47.4 MB ) )ui
Unity3D 5.3.5f1 x64code
Windows 7 x64orm
罗技摄像头(硬件),摄像头支架视频
1. 在SDK的管理后台建立一个新应用,获取应用的Appkey和Secret,在Unity中会用到。xml
2. 在SDK的管理后台中建立图集,并添加图片,完成以后发布图集blog
3. 把图集和应用进行关联继承
4. 在SDK的管理后台中下载本地识别包文件,通常是以图集为命名的unitypackage文件。接口
我建立的图集名称: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)上
摄像头拍摄的真实画面和引擎生成的三维物体进行叠加。
当识别图识别成功以后,执行一些操做,能够理解为Callback。
HiAR的例子是:识别成功以后,播放视频。
固然你能够在识别成功以后,生成一些模型和场景出来,这样就和开发其它游戏同样,能够对Scene中的GameObject进行控制,好比播放动画,打斗,特效之类的。
把识别图上的图像实时渲染在模型上(Material),类型涂鸦。
添加一个待涂包的模型,添加组件:HiARPaint,Shader:HiARPaint
硬件摄像头拍摄识别图(实时拍摄)
根据识别到的图,提取图像生成Material,动态地渲染。
期间会生成几个识别点
过程当中若是有拍摄到其它物体,新生成的材质会实时更新
多图识别,就是在简单识别的基础上添加多个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以后,带有物理引擎效果的物体运动就有了中心点。