本文共 4409 字,大约阅读时间需要 14 分钟。
在AR开发过程中,很多人会觉得将识别图上传到官网数据库然后再从数据库下载这个过程难免有些繁琐,尽管有FrameMaker和云识别这些强大的功能,但还是会有人觉得麻烦。那么,如何在使用时实时创建识别图,就是本节我们要给大家介绍的新功能,自定义目标
识别。有必要提前介绍一下自定义目标识别的工作原理,打开摄像头开始扫描后,以扫描到的某一固定场景作为识别图,实现这一步骤的方法就是使用摄像头进行拍照,这时就需要一个触发拍照的指令,我们用一个Button来实现。所以最终的效果就是画面中会一直有一个Button,当我们扫描到我们要自定义的识别图时,按下Button,然后识别图创建完成,扫描该识别图,模型出现。1.插件下载访问,进入如下界面,并下载Vuforia SDK的Unity版本。public class UDTTest: MonoBehaviour,IUserDefinedTargetEventHandler
{void Start (){}public void OnFrameQualityChanged(ImageTargetBuilder.FrameQuality frameQuality) { }public void OnInitialized() { }public void OnNewTrackableSource(TrackableSource trackableSource) { }public void BuildNewTarget(){}
}
这个类中比较关键的是IUserDefinedTargetEventHandler这个接口,其中定义了OnFrame QualityChanged、OnInitialized和OnNewTrackableSource三个方法。我们实现这个接口中的三个方法,并将脚本附加到UserDefinedTargetBuilder上。首先需要声明一个UserDefinedTargetBuildingBehaviour类型的变量,接着在Start函数里将当前类注册为该类型事件。UserDefinedTargetBuildingBehaviour mTargetBuildingBehaviour;void Start (){ mTargetBuildingBehaviour = GetComponent(); if (mTargetBuildingBehaviour) { mTargetBuildingBehaviour.RegisterEventHandler(this); Debug.Log("Registering User Defined Target event handler."); }}
接下来要实现接口中的三个函数,首先是OnInitialized,用来初始化一些数据,我们在这个函数里写入下面的代码:
public void OnInitialized(){ mObjectTracker = TrackerManager.Instance.GetTracker(); if (mObjectTracker != null) { mBuiltDataSet = mObjectTracker.CreateDataSet(); mObjectTracker.ActivateDataSet(mBuiltDataSet); }}
这里用到两个新的变量,需要提前声明,如下:
ObjectTracker mObjectTracker;// 新定义的数据集添加到DataSet里DataSet mBuiltDataSet;接着是OnFrameQualityChanged这个函数,用来更新当前帧质量。我们在函数里写入下面的代码:public void OnFrameQualityChanged(ImageTargetBuilder.FrameQuality frameQuality){mFrameQuality = frameQuality;if (mFrameQuality == ImageTargetBuilder.FrameQuality.FRAME_QUALITY_LOW){ Debug.Log("Low camera image quality");}
}
这里的mFrameQuality 是一个用来记录当前帧图像质量的枚举类型,声明如下:ImageTargetBuilder.FrameQuality mFrameQuality = ImageTargetBuilder.FrameQuality.FRAME_QUALITY_NONE;最后也是最重要的一个方法OnNewTrackableSource的代码如下:public void OnNewTrackableSource(TrackableSource trackableSource) {mTargetCounter++;// Deactivates the dataset firstmObjectTracker.DeactivateDataSet(mBuiltDataSet);// Destroy the oldest target if the dataset is full or the dataset // already contains five user-defined targets.if (mBuiltDataSet.HasReachedTrackableLimit() || mBuiltDataSet.GetTrackables().Count() >= 5){ IEnumerabletrackables = mBuiltDataSet.GetTrackables(); Trackable oldest = null; foreach (Trackable trackable in trackables) { if (oldest == null || trackable.ID < oldest.ID) oldest = trackable; } if (oldest != null) { Debug.Log("Destroying oldest trackable in UDT dataset: " + oldest.Name); mBuiltDataSet.Destroy(oldest, true); }}// Get predefined trackable and instantiate itImageTargetBehaviour imageTargetCopy = (ImageTargetBehaviour)Instantiate(ImageTargetTemplate);imageTargetCopy.gameObject.name = "UserDefinedTarget-" + mTargetCounter;// Add the duplicated trackable to the data set and activate itmBuiltDataSet.CreateTrackable(trackableSource, imageTargetCopy.gameObject);// Activate the dataset againmObjectTracker.ActivateDataSet(mBuiltDataSet);
}
这个函数里需要提前声明的变量有两个,如下:int mTargetCounter;//声明一个公开的ImageTargetBehaviour,然后在Unity中赋值public ImageTargetBehaviour ImageTargetTemplate;最后一个就是我们自定义的函数BuildNewTarget,代码如下:public void BuildNewTarget(){mTargetBuildingBehaviour.BuildNewTarget("test", 50);
}
然后还需要返回Unity中进行一些细微的设置调整,将我们的脚本拖到UserDefined TargetBuilder下,并为ImageTargetTemplate进行赋值。然后在Button上添加点击事件,步骤如下。
转载地址:http://wkbbl.baihongyu.com/