zoukankan      html  css  js  c++  java
  • AR For Unity3D之HiAR分析

    前言

    关于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. 在EditorImageTargetTextures下有以图集命名的文件夹,文件夹中有图集中的图片文件

    2. 在StreamingAssetsHiAR目录下有以图集命名的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之后,带有物理引擎效果的物体运动就有了中心点。

  • 相关阅读:
    计算机科学引论笔记
    Bootstrap实战 瀑布流布局
    前端性能和加载体验优化实践(附:PWA、离线包、内存优化、预渲染)
    Promise + Async&Await + Array.reduce + 函数递归 解决网络/接口请求的依次/排队不间断间隔访问
    webfunny前端监控新产品发布:点位系统上线,简单6步操作
    Java 全栈知识体系(2021 PDF 版本)
    Java 面试题及答案整理(2021最新版)持续更新中~~~
    python相关常见安装问题
    获取某一个数的2进制位数以及bitmask
    centos7下利用qemu搭建arm模拟器
  • 原文地址:https://www.cnblogs.com/zhaoqingqing/p/5893923.html
Copyright © 2011-2022 走看看