By Henke
on Fri, 01/30/2015 - 12:54
Hi guys, I've been trying for a while to make a simple UDT app without much success. The code in the sample is way too complex for me to figure out how to customize. So I was happy when I discovered AlessandroB's description of how to make a simple app:
https://developer.vuforia.com/forum/faq/unity-how-do-i-create-simple-udt-app
Alas, I couldn't get the code working right! Had to poke around for a while before I figured out how to get it working. Turns out the issue was "ImageTracker" not working, switching out all the instances of ImageTracker for ObjectTracker fixed it. (Maybe "ImageTracker" got removed in the newer versions of the SDK?)
In order to save others the headache of figuring this stuff out, here's the full code. :)
using UnityEngine; using System.Collections; using System.Collections.Generic; using Vuforia; public class SimpleUDTHandler : MonoBehaviour, IUserDefinedTargetEventHandler { private UserDefinedTargetBuildingBehaviour mTargetBuildingBehaviour; private ObjectTracker mObjectTracker; private DataSet mBuiltDataSet; private int Built=0; private bool mUdtInitialized = false; private ImageTargetBuilder.FrameQuality mFrameQuality = ImageTargetBuilder.FrameQuality.FRAME_QUALITY_NONE; public ImageTargetBehaviour ImageTargetTemplate; void Start() { mTargetBuildingBehaviour = GetComponent<UserDefinedTargetBuildingBehaviour> (); if (mTargetBuildingBehaviour) { mTargetBuildingBehaviour.RegisterEventHandler (this); } } public void OnInitialized() { // look up the ObjectTracker once and store a reference mObjectTracker = TrackerManager.Instance.GetTracker<ObjectTracker>(); if (mObjectTracker != null) { // create a new dataset mBuiltDataSet = mObjectTracker.CreateDataSet(); mObjectTracker.ActivateDataSet(mBuiltDataSet); // remember that the component has been initialized mUdtInitialized = true; } } public void OnFrameQualityChanged(ImageTargetBuilder.FrameQuality frameQuality) { mFrameQuality = frameQuality; } public void OnNewTrackableSource(TrackableSource trackableSource) { // deactivates the dataset first mObjectTracker.DeactivateDataSet(mBuiltDataSet); // Destroy the oldest target if the dataset is full if (mBuiltDataSet.HasReachedTrackableLimit()) { IEnumerable<Trackable> trackables = mBuiltDataSet.GetTrackables(); Trackable oldest = null; foreach (Trackable trackable in trackables) if (oldest == null || trackable.ID < oldest.ID) oldest = trackable; if (oldest != null) { mBuiltDataSet.Destroy(oldest, true); } } // get predefined trackable (template) and instantiate it ImageTargetBehaviour imageTargetCopy = (ImageTargetBehaviour)Instantiate(ImageTargetTemplate); // add the trackable to the data set and activate it mBuiltDataSet.CreateTrackable(trackableSource, imageTargetCopy.gameObject); // Re-activate the dataset mObjectTracker.ActivateDataSet(mBuiltDataSet); } void OnGUI() { if (!mUdtInitialized) return; // If Frame Quality is medium / high => show Button to build target if (mFrameQuality == ImageTargetBuilder.FrameQuality.FRAME_QUALITY_HIGH || mFrameQuality == ImageTargetBuilder.FrameQuality.FRAME_QUALITY_MEDIUM) { if(Built == 0) { if (GUI.Button(new Rect(Screen.width/2-100, Screen.height - 100, 200, 90), "Build New Target")) { BuildNewTarget(); } } else if (Built == 1) { if (GUI.Button(new Rect(Screen.width/2-50, 20, 100, 40), "New Target")) { BuildNewTarget(); } } } } private void BuildNewTarget() { string newTargetName = "MyUserDefinedTarget"; Debug.Log ("build"); mTargetBuildingBehaviour.BuildNewTarget(newTargetName, ImageTargetTemplate.GetSize().x); Built = 1; } }
Building a Simple UDT App Update (Unity SDK4)
Thanks for sharing this;
I have updated the snippets in the FAQ to reflect the use of ObjectTracker in 4.0, and added a note at the bottom for those who are still on 3.0.