這幾天做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);
}
}
}
具體效果動圖查看群共享!