Vuforia自定义识别

承接ARKit案例开发/宣传Demo开发/游戏开发  QQ:2118590660

ARKit入门到精通系列 (视频教程地址)

http://edu.manew.com/user/98138​​​​​​​

使用Unity版本2017.2 下载Unity的时候勾选 support Vuforia

没有勾选,在设置里 也可以下载

1.先到设置里勾选支持Vuforia

Vuforia自定义识别_第1张图片

2.到场景中导入ARCamera

Vuforia自定义识别_第2张图片

3.导入CameraImageBuilder 和 CameraImageTarget

Vuforia自定义识别_第3张图片

3.在CameraIamgeBuilder上边写脚本

 

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using Vuforia;
public class SimpleUDTHandler : MonoBehaviour,IUserDefinedTargetEventHandler {

	private UserDefinedTargetBuildingBehaviour m_TargetBuildingBehaviour;
	private ObjectTracker m_objectTracker;
	private DataSet m_builtDataSet;
	private bool m_udtInitialized = false;

	//这部分定义的是照相机拍摄下来图片的品质, 也就是说在图片拍摄下来之后通过这个方法返回一个枚举类型的
	//通过这个参数判断这张图片质量是否可用

	private ImageTargetBuilder.FrameQuality m_FrameQuality = ImageTargetBuilder.FrameQuality.FRAME_QUALITY_NONE;
	public ImageTargetBehaviour ImageTargetTemplate;



	#region IUserDefinedTargetEventHandler implementation
	//这个方法是用来进行初始化使用的
	public void OnInitialized ()
	{
		//这里用来实例化mObjectTracker里面的信息
		m_objectTracker = (ObjectTracker)TrackerManager.Instance.GetTracker();
		if (m_objectTracker != null) {
			//创建一个新的数据集, 放在本地用来存放用户拍摄的ImageTarget
			m_builtDataSet = m_objectTracker.CreateDataSet();
			//将数据及的状态变为激活状态(数据集仅在 没有跟踪图片的方法 没有运行的时候才是激活状态)
			m_objectTracker.ActivateDataSet(m_builtDataSet);
			//记录组件已经被初始化了
			m_udtInitialized = true;
		}
	}

	//IuserDefinedTargetEventHandler接口中OnFrameQualityChanged方法的实现
//这里需要注意:这个方法只是用来接收摄像头扫描的图片品质  具体判断方法是内部封装
	//ImageTargetBuilder.FrameQuality frameQuality 也就是图片的品质
	/*具体的方法是这样一个抽象类,内部识别的方法我们是看不到的;
    public abstract class ImageTargetBuilder
    {
        protected ImageTargetBuilder();
        public abstract bool Build(string targetName, float sceenSizeWidth);
        public abstract FrameQuality GetFrameQuality();
        public abstract TrackableSource GetTrackableSource();
        public abstract void StartScan();
        public abstract void StopScan();
        public enum FrameQuality
        {
            FRAME_QUALITY_NONE = -1,
            FRAME_QUALITY_LOW = 0,
            FRAME_QUALITY_MEDIUM = 1,
            FRAME_QUALITY_HIGH = 2
        }
    }
    */

	public void OnFrameQualityChanged (ImageTargetBuilder.FrameQuality frameQuality)
	{
//将获取的图片的品质传给m_FrameQuality
		m_FrameQuality = frameQuality;
	}

	//这个方法是初始化出现错误的时候才会被访问?  what?

	public void OnNewTrackableSource (TrackableSource trackableSource)
	{
		//首先关闭数据集
		m_objectTracker.DeactivateDataSet(m_builtDataSet);
		//下面这部分的作用是当数据及饱和 也就是满了的时候, 就会删除最开始创建的IamgeTarget一次类推

		if (m_builtDataSet.HasReachedTrackableLimit ()) {
			//此部分是用来加载出数据集中全部的ImageTarget对象
			IEnumerable trackables = m_builtDataSet.GetTrackables();
			Trackable oldest = null;
			foreach (Trackable trackable in trackables) 
				if (oldest == null || trackable.ID < oldest.ID)
					oldest = trackable;
				if (oldest != null) {
					m_builtDataSet.Destroy(oldest,true);
				}
		}
		//获取到已经追踪到的Tarckable 也就用户拍摄的ImageTarget并且实例他就可以了
		ImageTargetBehaviour imageTargerCopy = (ImageTargetBehaviour)Instantiate(ImageTargetTemplate);
		//将实例过的ImageTarget添加到相应的数据集当中
		m_builtDataSet.CreateTrackable(trackableSource,imageTargerCopy.gameObject);
		//将数据设置为激活的状态
		m_objectTracker.ActivateDataSet(m_builtDataSet);

	}
	#endregion

	// Use this for initialization
	void Start () {
		m_TargetBuildingBehaviour = GetComponent ();
		if (m_TargetBuildingBehaviour) {
			m_TargetBuildingBehaviour.RegisterEventHandler (this);
		}
	}
	
	// Update is called once per frame
	void Update () {
		
	}


	void OnGUI()
	{
		//判断是否进行了初始化,如果没有返回不再执行接下来的程序:
		if(!m_udtInitialized) return;
		//下面我们根据画面的质量来显示相应的界面. 如果用户拍摄的图片皮质在 中 高 状态下 我们就拍摄按键显示出来
		if (m_FrameQuality == ImageTargetBuilder.FrameQuality.FRAME_QUALITY_HIGH || m_FrameQuality == ImageTargetBuilder.FrameQuality.FRAME_QUALITY_MEDIUM) {
			if (GUILayout.Button ("UserDefineTarget")) {
				//如果点击了拍摄按钮 我们就执行创建Target按钮
				BuildNewTarget();
			}
		
		}

	}


	//创建ImageTarget按钮:
	public void BuildNewTarget(){

		//在这里我们可以自己定义 ImageTarget名字
	string newTargetName = "MyUserDefinedTarget";
		//调用创建方法
		m_TargetBuildingBehaviour.BuildNewTarget(newTargetName, ImageTargetTemplate.GetSize().x);
	}
}

4.将ImageTarget拖到 SimpleUDTHandler空白处

 

Vuforia自定义识别_第4张图片
5.将要识别出的模型放到ImageTarget下面

Vuforia自定义识别_第5张图片6.添加按钮,让按钮执行 SimpleUDTHandler里的 BuidNewTarget事件

Vuforia自定义识别_第6张图片7.到VuforiaConfiguration里配置 Key

 将没有用到的Datasets取消勾选

Vuforia自定义识别_第7张图片

8. 保存场景,到设置里更改 bundle ID,添加相机请求权限,然后导出

Vuforia自定义识别_第8张图片

你可能感兴趣的:(Unity)