小功能丨Vuforia動態修改識別目標和3D物體
概要:
本章目標為不設定ImageTarget,Unity完成動態識別識別圖。
實現方法:
1、Vuforia官網上傳識別目標,下載unitypackage並匯入Unity
2、匯入Vuforia SDK,並將ARCamera放置到場景,啟用要識別的Datasets。由於激活了Datasets,這時,儘管沒有放置ImageTarget,運行遊戲,仍可看到Vuforia自動建立了多個帶有ImageTargetBehaviour的New Game Object
3、建立空物體TargetManager,新增TargetCreator指令碼,程式碼如下
using System.Collections.Generic; using UnityEngine; using Vuforia; public class TargetCreator : MonoBehaviour { //每張識別圖對應現實的3D物體 public GameObject[] targetPrefabs; public void ConfigTrackable(string targetKey) { if (targetPrefabs == null && targetKey == null) return; //獲取場景中所有的識別圖 //GetTrackableBehaviours:Returns all currently instantiated TrackableBehaviours except Words IEnumerable<TrackableBehaviour> trackables = TrackerManager.Instance.GetStateManager().GetTrackableBehaviours(); foreach (TrackableBehaviour behaviour in trackables) { if (behaviour.TrackableName == targetKey) { behaviour.gameObject.name = "ImageTarget"; //修改NewGameObject名稱為ImageTarget behaviour.gameObject.AddComponent<DefaultTrackableEventHandler>(); //新增事件處理指令碼 behaviour.gameObject.AddComponent<TurnOffBehaviour>(); //新增禁用渲染工具指令碼 foreach (GameObject prefab in targetPrefabs) { if (prefab.name.Equals(targetKey)) { GameObject obj = GameObject.Instantiate(prefab); obj.transform.parent = behaviour.transform; return; } } } } } }
程式碼解析:
1)、由behaviour.TrackableName == targetKey可以看出,我們在呼叫ConfigTrackable(string targetKey)方法時,要傳入的是識別圖的名稱
2)、由prefab.name.Equals(targetKey)可以看出,我們預製體的名稱,要=Vuforia上傳的識別圖的名稱
4、建立Button和InputField,如下圖所示
5、建立指令碼Skode_Identification,掛載到TargetManager,程式碼如下。將輸入框的text賦值到inputText,Button繫結Skode_Iden方法
using UnityEngine;
using UnityEngine.UI;
public class Skode_Identification : MonoBehaviour {
public Text inputText;
public void Skode_Iden()
{
GetComponent<TargetCreator>().ConfigTrackable(inputText.text);
}
}
6、測試(在PC端進行,要有攝像頭)
運行遊戲,輸入某識別圖的名稱,點選Button,將攝像頭對準要識別的圖片
在Hierarchy面板找到顯示出來的模型,此時該模型比例或許不是預期想要的大小,調整模型位置角度等,記下其Transform各資料,進行下一步的Vuforia DefaultTrackableEventHandler—OnTrackingFound等功能修改,接下來步驟由玩家根據自己要求自行修改
7、Enjoy
技術拓展:
本章是在Unity端直接實現,由Unity的該方法,在特殊情況下,也可進行Unity與安卓的互調。
呼叫參考連結:互調