AR開發--(一)圖片識別

這幾天做AR的項目,所以用到了手勢識別的功能,雖然之前已經通過相關的設計進行了相關的開發。但是本著技術的角度,我們需要更先進的技術支撐來滿足以后需求。所以將代碼貢獻出來,作為參考!

攝像頭淘寶貨,28包郵!

那我們實現了什么功能?
第一:用戶的手直接跟熊進行交互。
第二:點擊多次后會有煙花噴灑
第三:在屏幕上位置能夠不被后面的背景遮擋!

弊端:
第一:用戶的交互是不可預知的。所以盡可能拓展用戶點擊效果的豐富性
第二:讓熊實時跟隨我們的手指移動,還沒有實現。
第三:沒有手勢操作。不能夠根據用戶的手勢進行更多的交互。

所以手勢識別的必要性就展示出來了!我會在第二篇教程中一步一步教大家集成手勢識別系統!

1、先說怎么實現這種效果:

我們使用的EasyAR SDK包。圖片識別通過內置的案例進行復制,修改。核心就是內部的Json文本。

2、認知SDK

首先要了解SDK內部的核心代碼腳本。

Paste_Image.png

此腳本中我自己添加了有一個bool值用來實現識別圖片后,讓模型的永留。

說說里面的方法:
首先根據目標尋找事件添加類似事件
在目標丟失事件中添加相關的類似事件
在目標加載事件中添加相關的類似事件
在目標不加載事件中添加相關類似事件

識別的本質實在Json中加載具體的圖片,然后從SteamingAssets中獲取里面圖片的名字,這樣就可以識別了!

Paste_Image.png

具體的SteamingAssets中添加了我們Json中的圖片

緊接著給我們的游戲對象添加如下圖腳本

Paste_Image.png

然后給其中添加我們的動畫以及腳本控制,如果通過射線那么就需要添加碰撞器,關于碰撞器你可以查看我之前的Collider詳解
關于射線檢測可以加群找我獲取相關資料(點擊打開鏈接后面數字就是群號)

Paste_Image.png

然后運行(必須要有攝像頭,淘寶自己找,20多,如果需要可以加群獲取相關鏈接)
代碼貼出如下

  public Camera ARCamera;
    void Update () {
        if (Input.GetMouseButtonDown(0))
        {
            Ray ray = ARCamera.ScreenPointToRay(Input.mousePosition);
            RaycastHit hit;
            if(Physics.Raycast(ray, out hit))
            {
                if (hit.transform.tag == "Ground")
                {
                    Debug.Log(hit.point);
                    transform.position = new Vector3(hit.point.x,hit.point.y+25f,hit.point.z);
                }
            }
        }
    }
using UnityEngine;

namespace EasyAR
{
    public class EasyImageTargetBehaviour : ImageTargetBehaviour
    {
        public bool isActive;
        protected override void Awake()
        {
            base.Awake();
            TargetFound += OnTargetFound;
            TargetLost += OnTargetLost;
            TargetLoad += OnTargetLoad;
            TargetUnload += OnTargetUnload;
        }

        protected override void Start()
        {
            base.Start();
            HideObjects(transform);
        }

        void HideObjects(Transform trans)
        {
            for (int i = 0; i < trans.childCount; ++i)
                HideObjects(trans.GetChild(i));
            if (transform != trans)
                gameObject.SetActive(false);
        }

        void ShowObjects(Transform trans)
        {
            for (int i = 0; i < trans.childCount; ++i)
                ShowObjects(trans.GetChild(i));
            if (transform != trans)
                gameObject.SetActive(true);
        }

        void OnTargetFound(ImageTargetBaseBehaviour behaviour)
        {
            ShowObjects(transform);
            isActive = true;
            Debug.Log("Found: " + Target.Id);
        }

        void OnTargetLost(ImageTargetBaseBehaviour behaviour)
        {
            if (isActive == false)
            {
                HideObjects(transform);
            }
            Debug.Log("Lost: " + Target.Id);
        }

        void OnTargetLoad(ImageTargetBaseBehaviour behaviour, ImageTrackerBaseBehaviour tracker, bool status)
        {
            Debug.Log("Load target (" + status + "): " + Target.Id + " (" + Target.Name + ") " + " -> " + tracker);
        }

        void OnTargetUnload(ImageTargetBaseBehaviour behaviour, ImageTrackerBaseBehaviour tracker, bool status)
        {
            Debug.Log("Unload target (" + status + "): " + Target.Id + " (" + Target.Name + ") " + " -> " + tracker);
        }
    }
}

具體效果動圖查看群共享!

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 173,593評論 25 708
  • 發現 關注 消息 iOS 第三方庫、插件、知名博客總結 作者大灰狼的小綿羊哥哥關注 2017.06.26 09:4...
    肇東周閱讀 12,259評論 4 61
  • 深處戈壁腹地,嬌麗如花者,克拉瑪依,可謂明珠之城。 艾青說,克說瑪依是戈壁的美人。一點也不過分。如若有幸看到今日的...
    自在寬哥閱讀 352評論 0 2
  • 很久不和你聯系,也很久不再寫文章。 尚律說,楊,我看了你的博客,文采飛揚。一看就是愛情帶來的靈感。 我笑,像很久以...
    藍藍蓮花閱讀 297評論 0 0
  • “唉……” 葉子對著簡書皺著眉,遲遲不見落筆。 略:寫文章,從熟悉的事物寫起,感情自然流露,內心才能產生自信,寫作...
    寫作喚醒教練一一葉小問閱讀 337評論 1 1