美文网首页AR/VR/MR
AR开发之Vuforiar功能演示

AR开发之Vuforiar功能演示

作者: 明月海子 | 来源:发表于2019-05-30 20:53 被阅读32次

    项目介绍

    识别到卡片,可以对人物进行选择,缩放,删除,以及音效播放,特效展示等

    功能展示

    创建一个脚本,定义自己的功能,将DefaultTrackableEventHandler脚本在组件上删除,添加自己的脚本,MyDefaultTrackableEvetnHandler,大部分来自DefaultTrackableEventHandler,修改部分方法,实现属于自己的功能

    public class MyDefaultTrackableEventHandler : MonoBehaviour, ITrackableEventHandler
    {
    public GameObject AiXiPrefab;
    public GameObject bloodPrefab;
    public GameObject TonadoPrefab;
    private AudioSource auido;

    #region PROTECTED_MEMBER_VARIABLES
    protected TrackableBehaviour mTrackableBehaviour;
    protected TrackableBehaviour.Status m_PreviousStatus;
    protected TrackableBehaviour.Status m_NewStatus;
    
    #endregion // PROTECTED_MEMBER_VARIABLES
    
    #region UNITY_MONOBEHAVIOUR_METHODS
    
    protected virtual void Start()
    {
        mTrackableBehaviour = GetComponent<TrackableBehaviour>();//获取到物体的组件
        if (mTrackableBehaviour)
            mTrackableBehaviour.RegisterTrackableEventHandler(this);//注册委托
        auido = this.GetComponent<AudioSource>();   
    }
    
    protected virtual void OnDestroy()
    {
        if (mTrackableBehaviour)
            mTrackableBehaviour.UnregisterTrackableEventHandler(this);
    }
    
    #endregion // UNITY_MONOBEHAVIOUR_METHODS
    
    #region PUBLIC_METHODS
    public void OnTrackableStateChanged(//当状态改变的时候执行
        TrackableBehaviour.Status previousStatus,
        TrackableBehaviour.Status newStatus)
    {
        m_PreviousStatus = previousStatus;
        m_NewStatus = newStatus;
    
        if (newStatus == TrackableBehaviour.Status.DETECTED ||
            newStatus == TrackableBehaviour.Status.TRACKED ||
            newStatus == TrackableBehaviour.Status.EXTENDED_TRACKED)
        {
            Debug.Log("Trackable " + mTrackableBehaviour.TrackableName + " found");
            OnTrackingFound();//当识别到图片的时候
        }
        else if (previousStatus == TrackableBehaviour.Status.TRACKED &&
                 newStatus == TrackableBehaviour.Status.NO_POSE)
        {
            Debug.Log("Trackable " + mTrackableBehaviour.TrackableName + " lost");
            OnTrackingLost();//当丢失图片的时候调用
        }
        else
        {
            // For combo of previousStatus=UNKNOWN + newStatus=UNKNOWN|NOT_FOUND
            // Vuforia is starting, but tracking has not been lost or found yet
            // Call OnTrackingLost() to hide the augmentations
            OnTrackingLost();
        }
    }
    
    #endregion // PUBLIC_METHODS
    
    #region PROTECTED_METHODS
    
    protected virtual void OnTrackingFound()
    {
        //找到了需要识别的物体的时候
        if (!auido.isPlaying)
        {
            auido.Play();
        }
    
        GameObject AIXI = GameObject.Instantiate(AiXiPrefab,transform.position - new Vector3(0,0,0),transform.rotation);
        AIXI.transform.parent = this.transform;
    
        GameObject el = GameObject.Instantiate(bloodPrefab, transform.position, Quaternion.identity);
        el.transform.parent = this.transform;
        Destroy(el, 5f);
    
        GameObject e2 = GameObject.Instantiate(TonadoPrefab, transform.position, Quaternion.identity);
        e2.transform.parent = this.transform;
        Destroy(e2, 5f);
    }
    
    protected virtual void OnTrackingLost()
    {//丢失了需要识别的物体
        Destroy(GameObject.Find("Aixi(Clone)"));
        Destroy(GameObject.Find("RFX_Blood_Puddle(Clone)"));
        Destroy(GameObject.Find("RFX_Tonado_Flame(Clone)"));
    }   
    

    控制人物脚本

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

    public class Player : MonoBehaviour
    {
    public AudioClip welcomeClip;
    void Start()
    {
    Invoke("PlaywelcomeClip", 8.0f);
    }

    void Update()
    {
        if (transform.localPosition.y > 0)
        {
            return;
        }
        transform.Translate(new Vector3(0,0.2f,0) * Time.deltaTime);
    }
    
    private void PlaywelcomeClip()
    {
        AudioSource.PlayClipAtPoint(welcomeClip, transform.position);
    }
    

    }

    触屏操作

    public class TouchTap : MonoBehaviour
    {
    private float touchTime;
    private bool newTouch = false;

    void Update()
    {
        if (Input.GetMouseButton(0))
        {
            Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
            RaycastHit hitInfo;
            if (Physics.Raycast(ray,out hitInfo))
            {
                //双击屏幕
                //if (Input.touchCount == 1 && Input.GetTouch(0).phase == TouchPhase.Began)
                //{
                //    if (Input.GetTouch(0).tapCount == 2)//当一个手指双击屏幕
                //    {
                //        Destroy(hitInfo.collider.gameObject);
                //    }      
                //}
                //长按屏幕
                if (Input.touchCount == 1)//一个手指头点击
                {
                    Touch touch = Input.GetTouch(0);
                    if (touch.phase == TouchPhase.Began)//开始触摸点击
                    {
                        newTouch = true;
                        touchTime = Time.time;
                    }
                    else if (touch.phase == TouchPhase.Stationary)//当手指是静止的时候
                    {
                        newTouch = false;
                        Destroy(hitInfo.collider.gameObject);
                    }
                    else
                    {
                        newTouch = false;
                    }
                }
    
            }
    
        }
    }
    

    }

    滑动旋转

    public class Rotate : MonoBehaviour
    {
    float xSpeed = 150f;

    void Update()
    {
        if (Input.GetMouseButton(0))
        {
            if (Input.touchCount == 1)
            {
                if (Input.GetTouch(0).phase == TouchPhase.Moved)
                {
                    transform.Rotate(Vector3.up * Input.GetAxis("Mouse X") * -xSpeed * Time.deltaTime);
                }
            }
        }
    }
    

    }

    缩放

    public class EnLarge : MonoBehaviour
    {
    Vector2 oldPos1;
    Vector2 oldPos2;

    void Update()
    {
        if (Input.touchCount == 2)
        {
            if (Input.GetTouch(0).phase == TouchPhase.Moved || Input.GetTouch(1).phase == TouchPhase.Moved)
            {
                Vector2 temPos1 = Input.GetTouch(0).position;
                Vector2 temPos2 = Input.GetTouch(1).position;
                if (IsEnLarge(oldPos1, oldPos2, temPos1, temPos2))
                {
                    float oldScale = transform.localScale.x;
                    float newScale = oldScale * 1.025f;
                    transform.localScale = new Vector3(newScale, newScale, newScale);
                }
                else
                {
                    float oldScale = transform.localScale.x;
                    float newScale = oldScale / 1.025f;
                    transform.localScale = new Vector3(newScale, newScale, newScale);
                }
    
                oldPos1 = temPos1;
                oldPos2 = temPos2;
            }
        }
    }
    
    //判断手势缩放
    bool IsEnLarge(Vector2 oP1, Vector2 oP2,Vector2 nP1,Vector2 nP2)
    {
        float length1 = Mathf.Sqrt((oP1.x - oP2.x) * (oP1.x - oP2.x) + (oP1.y - oP2.y) * (oP1.y - oP2.y));
        float length2 = Mathf.Sqrt((nP1.x - nP2.x) * (nP1.x - nP2.x) + (nP1.y - nP2.y) * (nP1.y - nP2.y));
    
        if (length1 < length2)
        {
            return true;
        }
        else
        {
            return false;
        }
    }
    

    }

    聚焦功能,切换前后摄像头,打开闪光灯

    namespace Vuforia
    {
    public class CameraSetting : MonoBehaviour
    {

        void Start()
        {
            var vuforia = VuforiaARController.Instance;
            vuforia.RegisterVuforiaStartedCallback(OnVuforiaStarted);
            vuforia.RegisterOnPauseCallback(OnPaused);
    
        }
    
        private void OnVuforiaStarted()
        {
            CameraDevice.Instance.SetFocusMode(CameraDevice.FocusMode.FOCUS_MODE_CONTINUOUSAUTO);
        }
    
        private void OnPaused(bool isPaused)
        {
    
        }
    
        public void OnFocusModeClick()//自动对焦功能
        {
            CameraDevice.Instance.SetFocusMode(CameraDevice.FocusMode.FOCUS_MODE_CONTINUOUSAUTO);
        }
    
        public bool IsBack = false;
        public void SwitchCameraDirection()//切换手机的前置摄像头和后置摄像头
        {
            if (IsBack == false)
            {
                CameraDevice.Instance.Stop();
                CameraDevice.Instance.Deinit();
    
                CameraDevice.Instance.Init(CameraDevice.CameraDirection.CAMERA_FRONT);
                CameraDevice.Instance.Start();
                IsBack = true;
            }
            else
            {
                CameraDevice.Instance.Stop();
                CameraDevice.Instance.Deinit();
    
                CameraDevice.Instance.Init(CameraDevice.CameraDirection.CAMERA_BACK);
                CameraDevice.Instance.Start();
                IsBack = false;
            }
        }
    
        public bool IsLight = false;
        public void FlashTourch()//打开手机闪光灯
        {
            if (IsLight == false)
            {
                CameraDevice.Instance.SetFlashTorchMode(true);
                IsLight = true;
            }
            else
            {
                CameraDevice.Instance.SetFlashTorchMode(false);
                IsLight = false;
            }
        }
    
    }
    

    }

    手机截屏功能

    Y1.png

    using System.Collections;
    using System.Collections.Generic;
    using UnityEngine;
    using System.IO;
    using UnityEngine.UI;

    public class ScreenShot : MonoBehaviour
    {
    private Camera ARCamera;
    public GameObject OBJ;
    public Text text;

    void Start()
    {
        ARCamera = GameObject.Find("ARCamera").GetComponent<Camera>(); ;
        //Invoke("OnScreenShotClick", 10f);
    }
    
    public void OnScreenShotClick()
    {
        System.DateTime now = System.DateTime.Now;
        string times = now.ToString();
        times = times.Trim();//去掉字符串的空格
        times = times.Replace("/","-");//用-替换/
    
        string fileName = "ARScreenShot" + times + ".png";
    
        text.text = "设置路径";
        if (Application.platform == RuntimePlatform.Android)
        {
            text.text = "截屏开始";
            //包含UI截屏方式
            Texture2D texture = new Texture2D(Screen.width, Screen.height, TextureFormat.RGB24, false);
            texture.ReadPixels(new Rect(0, 0, Screen.width, Screen.height), 0, 0);
            texture.Apply();
            byte[] bytes = texture.EncodeToPNG();
            //规定写法,sdcard是手机的存储卡,DCIM是相册,Screenshots是手机截屏文件夹
            string destination = "sdcard/DCIM/Screenshots";           
            if (!Directory.Exists(destination))
            {
                Directory.CreateDirectory(destination);
            }           
            string pathSave = destination + "/" + fileName;
            File.WriteAllBytes(pathSave, bytes);
            OBJ.GetComponent<Material>().color = Color.red;
            text.text = "截屏成功";           
    
            //不包含UI的截屏方式
            //RenderTexture rt = new RenderTexture(Screen.width,Screen.height,1);
            //ARCamera.targetTexture = rt;
            //ARCamera.Render();
    
            //RenderTexture.active = rt;
    
            //Texture2D texture = new Texture2D(Screen.width, Screen.height, TextureFormat.RGB24, false);
            //texture.ReadPixels(new Rect(0, 0, Screen.width, Screen.height), 0, 0);
            //texture.Apply();
            //ARCamera.targetTexture = null;
            //RenderTexture.active = null;
            //Destroy(rt);
            //byte[] bytes = texture.EncodeToPNG();
            ////规定写法,sdcard是手机的存储卡,DCIM是相册,Screenshots是手机截屏文件夹
            //string destination = "sdcard/DCIM/Screenshots";
            //if (!Directory.Exists(destination))
            //{
            //    Directory.CreateDirectory(destination);
            //}
            //string pathSave = destination + "/" + fileName;
            //File.WriteAllBytes(pathSave, bytes);
    
        }
    }
    

    }

    提示:手机保持图片不成功,可能是由于Android保存权限问题

    相关文章

      网友评论

        本文标题:AR开发之Vuforiar功能演示

        本文链接:https://www.haomeiwen.com/subject/pwsbtctx.html