Vuforia AR
同時追踨多張辨識圖
Revised on April 14, 2021
 Unity AR專案設定
 建立Vuforia AR Camera
 滙入Vuforia特徵資料庫
 加入AR辨識圖
 設定AR物件
 同時追踨多張辨識圖
 解析DefaultTrackableEventHandler程
式框架
 新增3D專案,AR multitargets
 選單命令File> Build Settings
 使用筆電或PC搭配Web Cam,可先選擇「PC, Mac & Linux Standalone」
方便測試;要使用手機實機測試,則選擇對應的手機平台
設定Unity AR專案 1/3
2
 點擊Build Settings對話視窗左下角「Player Settings…」按鈕
 勾選XR Settings項目中的Vuforia Augmented Reality Support,
安裝Vuforia Engine AR套件
如有警告訊息(大多是相容性問題),參照訊息內容修正設定即可
設定Unity AR專案 2/3
3
 Android平台設定
 確認修正Player Settings設定中的Other Settings>
Identification> Package Name
 設定Player Settings設定中的Other Settings> Identification>
Minimum API Level
 Vuforia Engine 8.X只支援Android 4.4之後版本;Vuforia Engine 9.X
只支援Android 7之後版本
 取消勾選Player設定中的Other Settings> Configuration>
Android TV Compatibility
設定Unity AR專案 3/3
4
 刪除場景中的Main Camera
 選單命令GameObject> Vuforia Engine> AR Camera,在場景加入
AR Camera
 點擊Open Vuforia Engine configuration按鈕
建立Vuforia AR Camera 1/3
5
 將Vuforia License Key貼入Global項目的App License Key欄
建立Vuforia AR Camera 2/3
6
 確定Play Mode項目中的Camera Device欄是目前使用的攝影機
建立Vuforia AR Camera 3/3
7
 選單命令Assets> Import Package> Custom Package…滙入從
Vuforia封裝下載的特徵資料庫package
滙入Vuforia特徵資料庫 1/2
8
 檢視ARCamera之Vuforia Engine Cofiguration設定,在
Databases項目中應看到您剛才滙入的辨識特徵資料庫名稱
滙入Vuforia特徵資料庫 2/2
9
 在場景加入AR辨識圖片
 選單命令GameObject> Vuforia Engine> Image Target
 Type = Predefined
 Database = unityAR (剛才滙入的特徵資料庫名稱)
 Image Target = baymax_ii (由特徵資料庫中選取辨識圖)
加入AR辨識圖片
10
 滙入AR動作3D模型baymax.unitypackage
設定AR動作模型 1/5
11
 檢視baymax模型中的Baymax_AmatureAction動畫,目前並未設定循
環動畫
 點擊Edit…按鈕,勾選Loop Time
 點擊Apply按鈕
設定AR動作模型 2/5
12
 拖曳AR動作模型(baymax)成為ImageTarget的子物件
 調整AR動作模型到欲顯現的相對位置和大小
設定AR動作模型 3/5
13
 選單命令Assets> Create> Animator Controller
 更名為baymaxController
 雙擊baymaxController開啟Animator編輯視窗,拖曳baymax模型中
的Baymax_AmatureAction動畫到Animator編輯視窗
設定AR動作模型 4/5
14
 將baymaxController拖曳到baymax的Animator元件之Controller
欄
 執行測試
設定AR動作模型 5/5
15
 選單命令GameObject> Vuforia Engine> Image Target,在場景
新增⼀張AR辨識圖
 Type = Predefined
 Database = unityAR (剛才滙入的特徵資料庫名稱)
 Image Target = iron_man (由特徵資料庫中選取辨識圖)
辨識圖預設位置為(0,0,0),所以兩張辨識圖會重疊在⼀起,實際上辨識圖
位置並不影響AR功能,因為AR Camera是以辦識圖為座標中心,但為了方便
設計階段檢視,可將辨識圖平移錯開位置
加入第二張AR辨識圖
16
 滙入AR動作3D模型ironmax.unitypackage
設定第二張辨識圖AR動作模型 1/5
17
 拖曳AR動作模型(ironman)成為ImageTarget的子物件
 調整AR動作模型到欲顯現的相對位置和大小
設定第二張辨識圖AR動作模型 2/5
18
 選單命令Assets> Create> Animator Controller
 更名為ironmanController
 雙擊ironmanController開啟Animator編輯視窗,拖曳Animations
中Run動畫到Animator編輯視窗
設定第二張辨識圖AR動作模型 3/5
19
 將ironmanController拖曳到ironman的Animator元件之
Controller欄
 取消勾選Apply Root Motion (使模型原地跑步)
設定第二張辨識圖AR動作模型 4/5
20
 執行測試
 辨識圖同時出現時,只有其中⼀張會觸發AR動作模型
設定第二張辨識圖AR動作模型 5/5
21
 選取AR Camera
 點擊Open Vuforia Engine configuration按鈕
 將Global項目中的Max Simultaneous Tracked Images值調整為2
註:同時追踨過多辨識圖,會影響辨識運算效能,建議不要超過5
設定使用多重辨識物 1/2
22
 執行測試
 辨識圖同時出現時,兩張都會觸發AR動作模型
設定使用多重辨識物 2/2
23
 ImageTargetBehaviour程式腳本負責運行時追蹤圖像目標作業
 而ImageTargetBehaviour繼承自TrackableBehaviour,要獲得追
蹤行為的狀態,就要先取得所追蹤目標的TrackableBehaviour
 要處理追蹤行為狀態改變事件,必須實作ITrackableEventHandle介
面的OnTrackableStateChanged方法,並將實作
ITrackableEventHandle介面的物件註冊到所追蹤目標的
TrackableBehaviour中
解析DefaultTrackableEventHandler 1/7
24
using UnityEngine;
using Vuforia;
public class DefaultTrackableEventHandler:MonoBehaviour, ITrackableEventHandler
{
#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);
}
protected virtual void OnDestroy() {
if (mTrackableBehaviour)
mTrackableBehaviour.UnregisterTrackableEventHandler(this);
}
#endregion // UNITY_MONOBEHAVIOUR_METHODS
解析DefaultTrackableEventHandler 2/7
25
實作ITrackableEventHandle介面
#region PUBLIC_METHODS
/*Implementation of the ITrackableEventHandler function called when the
tracking state changes. */
public void OnTrackableStateChanged(
TrackableBehaviour.Status previousStatus,
TrackableBehaviour.Status newStatus) {
m_PreviousStatus = previousStatus;
m_NewStatus = newStatus;
Debug.Log("Trackable " + mTrackableBehaviour.TrackableName +
" " + mTrackableBehaviour.CurrentStatus +
" -- " + mTrackableBehaviour.CurrentStatusInfo);
if (newStatus == TrackableBehaviour.Status.DETECTED ||
newStatus == TrackableBehaviour.Status.TRACKED ||
newStatus == TrackableBehaviour.Status.EXTENDED_TRACKED) {
OnTrackingFound();
}
else if (previousStatus == TrackableBehaviour.Status.TRACKED &&
newStatus == TrackableBehaviour.Status.NO_POSE) {
OnTrackingLost();
}
解析DefaultTrackableEventHandler 3/7
26
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
解析DefaultTrackableEventHandler 4/7
27
#region PROTECTED_METHODS
protected virtual void OnTrackingFound() {
Debug.Log("OnTrackingFound");
if (mTrackableBehaviour) {
var rendererComponents =
mTrackableBehaviour.GetComponentsInChildren<Renderer>(true);
var colliderComponents =
mTrackableBehaviour.GetComponentsInChildren<Collider>(true);
var canvasComponents =
mTrackableBehaviour.GetComponentsInChildren<Canvas>(true);
foreach (var component in rendererComponents) // Enable rendering:
component.enabled = true;
foreach (var component in colliderComponents) // Enable colliders:
component.enabled = true;
foreach (var component in canvasComponents) // Enable canvas':
component.enabled = true;
}
}
解析DefaultTrackableEventHandler 5/7
28
protected virtual void OnTrackingLost() {
Debug.Log(" OnTrackingLost ");
if (mTrackableBehaviour) {
var rendererComponents =
mTrackableBehaviour.GetComponentsInChildren<Renderer>(true);
var colliderComponents =
mTrackableBehaviour.GetComponentsInChildren<Collider>(true);
var canvasComponents =
mTrackableBehaviour.GetComponentsInChildren<Canvas>(true);
foreach (var component in rendererComponents) // Disable rendering:
component.enabled = false;
foreach (var component in colliderComponents) // Disable colliders:
component.enabled = false;
foreach (var component in canvasComponents) // Disable canvas':
component.enabled = false;
}
}
#endregion // PROTECTED_METHODS
}
解析DefaultTrackableEventHandler 6/7
29
解析DefaultTrackableEventHandler 7/7
30

Vuforia AR 同時追踨多張辨識圖