사용 방법
  1. 빈 GameObject에 DynamicDataSetLoader.cs(아래 스크립트)를 추가한다.
  2. Inspector에 멤버 변수를 채운다
    Augmentation Object - 마커 하위 오브젝트로 추가될 오브젝트를 넣는 곳
    Data Set Name - DataSet의 이름을 적는 곳
사용 결과
씬이 프로그램이 실행될 때 활성화 되지 않은 DataSet을 로드 시키고, 그안에 있는 마커를 하나씩 로딩한다.
단, 1000개 이상의 마커는 1000개만 생성됨)

응용 방법
마커가 많을 경우 기능별 분류를 통해 DataSet을 분류 해놓고 특정 상황마다 DataSet을 로딩하면 된다.
DynamicDataSetLoader.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
using UnityEngine;
using System.Collections;
 
using Vuforia;
using System.Collections.Generic;
 
 
public class DynamicDataSetLoader : MonoBehaviour
{
    // specify these in Unity Inspector
    public GameObject augmentationObject = null;  // you can use teapot or other object
    public string dataSetName = "";  //  Assets/StreamingAssets/QCAR/DataSetName
 
    // Use this for initialization
    void Start()
    {
        // Vuforia 6.2+
        VuforiaARController vac = VuforiaARController.Instance;
        vac.RegisterVuforiaStartedCallback(LoadDataSet);
    }
 
    void LoadDataSet()
    {
 
        ObjectTracker objectTracker = TrackerManager.Instance.GetTracker<ObjectTracker>();
 
        DataSet dataSet = objectTracker.CreateDataSet();
 
        if (dataSet.Load(dataSetName))
        {
 
            objectTracker.Stop();  // stop tracker so that we can add new dataset
 
            if (!objectTracker.ActivateDataSet(dataSet))
            {
                // Note: ImageTracker cannot have more than 100 total targets activated
                Debug.Log("<color=yellow>Failed to Activate DataSet: " + dataSetName + "</color>");
            }
 
            if (!objectTracker.Start())
            {
                Debug.Log("<color=yellow>Tracker Failed to Start.</color>");
            }
 
            int counter = 0;
 
            IEnumerable<TrackableBehaviour> tbs = TrackerManager.Instance.GetStateManager().GetTrackableBehaviours();
            foreach (TrackableBehaviour tb in tbs)
            {
                if (tb.name == "New Game Object")
                {
 
                    // change generic name to include trackable name
                    tb.gameObject.name = ++counter + ":DynamicImageTarget-" + tb.TrackableName;
 
                    // add additional script components for trackable
                    tb.gameObject.AddComponent<DefaultTrackableEventHandler>();
                    tb.gameObject.AddComponent<TurnOffBehaviour>();
 
                    if (augmentationObject != null)
                    {
                        // instantiate augmentation object and parent to trackable
                        GameObject augmentation = (GameObject)GameObject.Instantiate(augmentationObject);
                        augmentation.transform.parent = tb.gameObject.transform;
                        augmentation.transform.localPosition = new Vector3(0f, 0f, 0f);
                        augmentation.transform.localRotation = Quaternion.identity;
                        augmentation.transform.localScale = new Vector3(0.005f, 0.005f, 0.005f);
                        augmentation.gameObject.SetActive(true);
                    }
                    else
                    {
                        Debug.Log("<color=yellow>Warning: No augmentation object specified for: " + tb.TrackableName + "</color>");
                    }
                }
            }
        }
        else
        {
            Debug.LogError("<color=yellow>Failed to load dataset: '" + dataSetName + "'</color>");
        }
    }
}
cs




지페가 구겨져있어서 그런지 몰라도 간혈적으로 내부 라이브러리가 마커가 잡힌 이벤트를 연속으로 보내서 오브젝트가 번갈아 보이는 현상이 발생함

테스트를 다른것으로 해봐야 될듯

이벤트 처리를 위해 ITrackableEventHandler를 추가한다.
1
public class TargetTracker : MonoBehaviour, ITrackableEventHandler
cs


해당 타겟의 TrackableBehaviour 컴포넌트를 받아 해당 스크립트에서 이벤트를 구독할 수 있도록 등록한다.
1
2
3
4
5
mTrackableBehaviour = GetComponent<TrackableBehaviour>();
            if (mTrackableBehaviour)
            {
                mTrackableBehaviour.RegisterTrackableEventHandler(this);
            }
cs


ITrackableEventHandler의 OnTrackableStateChanged 메소드를 구현해야 한다.(이부분에서 마커 트렉킹에 대한 정보가 나온다)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
public void OnTrackableStateChanged(TrackableBehaviour.Status previousStatus, TrackableBehaviour.Status newStatus)
        {
            print("Test");
            if (newStatus == TrackableBehaviour.Status.DETECTED || newStatus == TrackableBehaviour.Status.TRACKED ||
                       newStatus == TrackableBehaviour.Status.EXTENDED_TRACKED)
            {
                print("TargetTracker : onTrackingFound");
                OnTrackingFound();
            }
            else
            {
                print("TargetTracker : onTrackingLost");
                OnTrackingLost();
            }
        }
cs



전체소스

TargetTracker.cs

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
using UnityEngine;
using System;
using System.Collections;
namespace Vuforia
{
    public class TargetTracker : MonoBehaviour, ITrackableEventHandler
    {
        private TrackableBehaviour mTrackableBehaviour;
        public event Action OnTrackingFound = () => { };
        public event Action OnTrackingLost = () => { };
 
        void Start()
        {
            mTrackableBehaviour = GetComponent<TrackableBehaviour>();
            if (mTrackableBehaviour)
            {
                mTrackableBehaviour.RegisterTrackableEventHandler(this);
            }
        }
 
        public void OnTrackableStateChanged(TrackableBehaviour.Status previousStatus, TrackableBehaviour.Status newStatus)
        {
            print("Test");
            if (newStatus == TrackableBehaviour.Status.DETECTED || newStatus == TrackableBehaviour.Status.TRACKED ||
                       newStatus == TrackableBehaviour.Status.EXTENDED_TRACKED)
            {
                print("TargetTracker : onTrackingFound");
                OnTrackingFound();
            }
            else
            {
                print("TargetTracker : onTrackingLost");
                OnTrackingLost();
            }
        }
        
 
    }
}
cs








마커가 인식되면 생성될 오브젝트안에 들어갈 스크립트

targetTrackListener.cs

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
using UnityEngine;
using System.Collections;
using System.Collections.Generic;
using System;
 
namespace Vuforia
{
 
    public class targetTrackListener : MonoBehaviour
    {
 
        public bool visiToggle;
 
        private TargetTracker targetObject = null;
 
        void Start()
        {
            targetObject = GameObject.Find("ImageTarget (1)").GetComponent<TargetTracker>();
            targetObject.OnTrackingFound += trackingFound;
            //targetObject.OnTrackingLost+= trackingLost;
        }
 
 
        void onDestroy()
        {
            targetObject.OnTrackingFound -= trackingFound;
            //targetObject.OnTrackingLost-= trackingLost;
        }
 
 
        public void trackingFound()
        {
            if (visiToggle)
            {
                gameObject.SetActive(false);
                visiToggle = false;
            }
            else
            {
                gameObject.SetActive(true);
                visiToggle = true;
            }
        }
 
 
    }
 
}
cs


+ Recent posts