27. U3D 高通AR

Posted zpy1993-09

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了27. U3D 高通AR相关的知识,希望对你有一定的参考价值。

 

 

1,高通AR流程

技术图片

 

HiAR_各种功能案例:

技术图片

 

 

 

 HiAR SDK:Unity Package包形式:http://pan.baidu.com/s/1jItIyjW

AR  脱卡(小明离开背景图片时也会显示出来)

技术图片

 

 

 

脚本挂ImageTarget上

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class OutOfCardScript : ImageTargetBehaviour
{

    // 脱卡的物体
    public GameObject Target;
    //记录脱卡时距离摄像机的远近
    Vector3 camPos = new Vector3 (0, 0, 15);
    //记录开始的旋转角度
    Quaternion rot;

    void Start ()
    {
        base.Start ();
        //获取到脱卡的物体Target
        Target = transform.Find ("xiaoliang_model").gameObject;
        //记录开始的旋转
        rot = Target.transform.localRotation;
        //设置模型隐藏
        Target.SetActive (false);
    }

    //重写父类的方法
    public override void OnTargetFound (RecoResult recoResult)
    {
        base.OnTargetFound (recoResult);
        //Debug.Log ("找到目标对象1111");
    }
    //追踪目标对象
    public override void OnTargetTracked (RecoResult recoResult, Matrix4x4 pose)
    {
        base.OnTargetTracked (recoResult, pose);
        //如果已经识别,就设置当前模型目标为ImageTarget的子物体
        //并且设置相关坐标
        if (Target.activeSelf) {
            //设置父物体
            Target.transform.parent = transform;
            //设置位置
            Target.transform.localPosition = Vector3.zero;
            //设置旋转
            Target.transform.localRotation = rot;
        }
    }
    //目标对象丢失
    public override  void OnTargetLost (RecoResult recoResult)
    {
        //Debug.Log ("目标对象丢失");
        base.OnTargetLost (recoResult);
        //设置相关坐标
        Target.SetActive (true);
        Target.transform.parent = Camera.main.transform;
        Target.transform.localPosition = camPos;
        Target.transform.localRotation = rot;
    }
}

 

AR 动态加载(点击按钮加载不同的物体)

技术图片

 

 

 

_______________
这个脚本不用挂
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System .IO;

public class androidPathScript : MonoBehaviour
{

    public     IEnumerator SetAndroidPath (string keyId, string fullPath)
    {
        //预编译
        #if UNITY_ANDROID 

        WWW www = new WWW (Application.streamingAssetsPath + keyId);
        yield return www;
        //判断安卓运行环境下是否存在该文件
        if (!Directory.Exists (Application.persistentDataPath + "/Data")) {
            //如果不存在,创建这样一个路径
            Directory.CreateDirectory (Application.persistentDataPath + "/Data");
        }
        //将当前这个文件写入这个路径下
        File.WriteAllBytes (Application.persistentDataPath + "/Data/" + keyId, www.bytes);
        #endif 
    }

    void Start ()
    {
        StartCoroutine (SetAndroidPath ("1d547122f7788bce3766d34065e7f4b9.db", "/HiAR/picture_01/1d547122f7788bce3766d34065e7f4b9.db"));
        StartCoroutine (SetAndroidPath ("2799d80c498feb62a8876bffb011b034.db", "/HiAR/sample/2799d80c498feb62a8876bffb011b034.db"));
    }
}

AR 点击按钮动态加载视频

技术图片

 

 

 技术图片

 

 

 

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System .IO;
using hiscene;
using UnityEngine.UI;
using UnityEngine.Networking.Types;
using UnityEngine.Video;


public class DynamicLoadVideoScript : TartgetDynamicBehaviour
{
    //播放视频的材质
    public Material videoMate;

    public override void OnDynamicReco (RecoResult recoResult)
    {
        //创建一个空物体
        GameObject gameObject = null;
        gameObject = new GameObject ();
        //当前动态识别的是图片的时候
        if (recoResult.keyType == KeyType.IMAGE) {
            //给空物体添加扫描图片的所需要的组件
            gameObject.AddComponent <ImageTargetBehaviour> ();
        }
        //获取识别目标
        Target target = gameObject.GetComponent <Target > ();
        target.PixelWidth = recoResult.Width * 0.01f;
        target.PixelHeight = recoResult.Height * 0.01f;
        gameObject.transform.parent = transform.parent;
        gameObject.SetActive (true);


        //开始加载视频
        StartCoroutine (Loading ());
        //判断当前识别的目标卡片是否是播放视频的卡片
        if (recoResult.KeyId.Equals ("1d547122f7788bce3766d34065e7f4b9")) {
            //创建视频
            string path = null;
            #if UNITY_EDITOR
            path = Application.streamingAssetsPath + "/video.mp4";
            #elif  UNITY_ANDROID 
            path =Application.persistentDataPath + "/Data/video.mp4";
            #endif
            GameObject video = CreateVideoPlayerAction (path, recoResult.Width, recoResult.Height);
            //将video设置为目标识别物体(ImageTarget)的子物体
            video.transform.parent = gameObject.transform;
        }
        //绑定ImageTarget和识别目标的KeyID;
        bindingGameObject (gameObject, recoResult.KeyId);
    }

    //加载视频的协程方法
    IEnumerator Loading ()
    {
        #if UNITY_ANDROID 
        //通过www找到视频资源
        WWW www = new WWW (Application.streamingAssetsPath + "/video.mp4");
        yield return www;

        //判断安卓运行环境下是否存在Data的路径
        if (!Directory.Exists (Application.persistentDataPath + "/Data")) {
            //创建这个路径
            Directory.CreateDirectory (Application.persistentDataPath + "/Data");
        }
        //将视频文件写入安卓的可读取路径
        File.WriteAllBytes (Application.persistentDataPath + "/Data/video.mp4", www.bytes);
        #endif


    }


    //创建视频播放的方法
    GameObject CreateVideoPlayerAction (string videoPath, int imgWidth, int imgHeight)
    {
        //创建一个Plane
        GameObject videObject = GameObject.CreatePrimitive (PrimitiveType.Plane);
        //设置名字
        videObject.name = "VideoPlayer";
        //设置缩放
        videObject.transform.localScale = new Vector3 (imgWidth * 0.001f, 0, imgHeight * 0.001f);
        //设置为隐藏状态
        videObject.SetActive (false);
        //添加视频播放的脚本组件
        videObject.AddComponent <VideoPlayerBehaviour> ();

        //设置视频播放的材质
        videObject.GetComponent <MeshRenderer > ().material = videoMate;

        //获取脚本组件,添加播放资源
        VideoPlayerBehaviour videoPlayer =    videObject.GetComponent <VideoPlayerBehaviour> ();
        //播放路径设置
        videoPlayer.AbsolutePath = videoPath;
        //是否是本地视频资源
        videoPlayer.IsLocal = true;
        //是否透明
        videoPlayer.IsTransparent = true;
        //设置可见
        videObject.SetActive (true);
        //返回视频播放对象
        return videObject;
    }

    void OnGUI ()
    {
        if (GUI.Button (new Rect (30, 30, 220, 100), "播放视频")) {
            #if UNITY_EDITOR
            AddImageTarget (Application.streamingAssetsPath + "/HiAR/picture_01", "1d547122f7788bce3766d34065e7f4b9", 854, 480);
            #elif UNITY_ANDROID 
            AddImageTarget (Application .persistentDataPath  +"/Data","1d547122f7788bce3766d34065e7f4b9",854,480);
            #endif
        }
    }
}

AR 获取系统摄像机

效果:虚体物体和现实相融合

修改Image的透明度

技术图片

 

 

 

Canvas身上挂脚本,另一个设置如下

技术图片

 

 

 技术图片

 

 

 

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine .UI;
using UnityEngine.Networking.Types;

public class SystemCameraScript : MonoBehaviour
{
    //展示摄像头内容的图片
    public Image image;

    void Start ()
    {
        //获取摄像头
        StartCoroutine (RequestCamera ());
    }

    IEnumerator RequestCamera ()
    {
        //协程返回用户权限
    
        yield return Application.RequestUserAuthorization (UserAuthorization.WebCam);
        //如果用户有权限
        if (Application.HasUserAuthorization (UserAuthorization.WebCam)) {
            //获取所有的摄像头设备
            WebCamDevice[] deveices = WebCamTexture.devices;
            //定义一个记录摄像头的编号
            int index = -1;
            for (int i = 0; i < deveices.Length; i++) {
                if (deveices [i].isFrontFacing) {
                    index = i;
                    break;
                }
            }
            //根据摄像头名字,创建一个摄像机图像,展示到UI界面上
            WebCamTexture texture = new WebCamTexture (deveices [index].name);
            image.canvasRenderer.SetTexture (texture);
            //启动摄像头
            texture.Play ();
        }
    }
}

AR 获得系统的麦克风(录音)

创建一个空物体起名Microphone,身上挂一下一个脚本和一个Audio Source

技术图片

 

 

 

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class GetSystemMicrophoneScript : MonoBehaviour
{

    // 存放声音的声音片段
    AudioClip clip;
    Audiosource audioSource;

    void Start ()
    {
        audioSource = GetComponent <AudioSource > ();
    }
    
    // 开始录音
    void StartRecord ()
    {
        //null:表示系统默认的麦克风,
        //false:是否循环录制 ,
        //30:录制的时间长短,
        //8000:声音的频率
        clip = Microphone.Start (null, false, 30, 8000);
    }
    //停止录音
    void StopRecord ()
    {
        Microphone.End (null);
        //播放声音
        audioSource.PlayOneShot (clip);
    }

    void Update ()
    {
        if (Input.GetKeyDown (KeyCode.Space)) {
            StartRecord ();
        }
        if (Input.GetKeyUp (KeyCode.Space)) {
            StopRecord ();
        }
    }
}

AR   小球在图片上跳动

创建一个物理材质,设置如下,挂在Image Target上和小球上

技术图片

 

 

 技术图片

 

 

 

 

 

 在小球上添加Rigidbody,和物理材质

技术图片

 

 在Image Target上添加Mesh Collider

技术图片

 

 

 

技术图片

 

以上是关于27. U3D 高通AR的主要内容,如果未能解决你的问题,请参考以下文章

AR 高通 下载插件注册账户创建License Key

Unity Vuforia(高通)AR全流程

高通AR9344 5.8GHz大功率无线户外CPE

高通AR9342 5.8GHz大功率无线户外CPE

高通AR9341 2.4GHz大功率无线户外CPE

GJM : Unity3D 高通Vuforia SDK AR 开发