您的位置:首页 > 移动开发 > Unity3D

easyAR unity3d识别拍照图片

2017-07-08 13:04 423 查看


左边红色箭头指向了一个脚本TargetOnTheFly。



这个图片中,gameObject左边加载了两个脚本。

FilesManager:用来进行拍照的。

ImageTargetManager:用来动态创建GameObject,来追踪拍出来的照片的

其中TargetOnTheFly的关键代码:

private void Awake()
{
imageManager = FindObjectOfType<ImageTargetManager>();
imageCreater = FindObjectOfType<FilesManager>();
}
void OnGUI()
{
if (StartShowMessage)
{
if (!isShowing)
StartCoroutine(showMessage());
StartShowMessage = false;
}

GUI.Box(new Rect(Screen.width / 2 - 250, 30, 500, 60), "The box area will be used as ImageTarget. Take photo!", skin.GetStyle("Box"));
GUI.Box(new Rect(Screen.width / 4, Screen.height / 4, Screen.width / 2, Screen.height / 2), "", skin.GetStyle("Box"));

if (isShowing)
GUI.Box(new Rect(Screen.width / 2 - 65, Screen.height / 2, 130, 60), "Photo Saved", skin.GetStyle("Box"));

if (GUI.Button(new Rect(Screen.width / 2 - 80, Screen.height - 85, 160, 80), "Take Photo", skin.GetStyle("Button")))
imageCreater.StartTakePhoto();

if (GUI.Button(new Rect(Screen.width - 160, Screen.height - 85, 150, 80), "Clear Targets", skin.GetStyle("Button")))
{
imageCreater.ClearTexture();
imageManager.ClearAllTarget();
}
}


其中

imageManager = FindObjectOfType<ImageTargetManager>();
imageCreater = FindObjectOfType<FilesManager>();


发现并获取ImageTargetManager和FilesManager对象。

为什么可以直接FindObjectOfType呢?肯定其他的地方加载了这两个object,下面会说明。

if (GUI.Button(new Rect(Screen.width / 2 - 80, Screen.height - 85, 160, 80), "Take Photo", skin.GetStyle("Button")))
imageCreater.StartTakePhoto();


这句话是按下”Take Photo”按钮的时候,拍照。

if (GUI.Button(new Rect(Screen.width - 160, Screen.height - 85, 150, 80), "Clear Targets", skin.GetStyle("Button")))
{
imageCreater.ClearTexture();
imageManager.ClearAllTarget();
}


当按下Clear Targets按钮的时候清楚对象追踪和拍的照片文件。

上面提到肯定有两个地加载了ImageTargetManager和FilesManager对象。

在那呢?如下图:



在右侧创建了Empty的GameObject,取名叫SampleManager。

然后添加了两个组件ImageTargetManager和FilesManager。

所以以后就可以直接find了。这种是静态创建的。

ImageTargetManager的关键代码:

void Update()
{
var imageTargetName_FileDic = pathManager.GetDirectoryName_FileDic();
foreach (var obj in imageTargetName_FileDic.Where(obj => !imageTargetDic.ContainsKey(obj.Key)))
{
GameObject imageTarget = new GameObject(obj.Key);
var behaviour = imageTarget.AddComponent<DynamicImageTagetBehaviour>();
behaviour.Name = obj.Key;
behaviour.Path = obj.Value.Replace(@"\", "/");
behaviour.Storage = StorageType.Absolute;
behaviour.Bind(ARBuilder.Instance.ImageTrackerBehaviours[0]);
imageTargetDic.Add(obj.Key, behaviour);
}
}


上面是动态的安卓照片的key创建了gameObject,然后添加了DynamicImageTagetBehaviour类型的组件,最后绑定了ARBuilder.Instance.ImageTrackerBehaviours[0](tracker),当检测到图片的时候就能够识别拍照的图片了。

等等识别图片后,显示什么样的模型在哪配置的?

答案:就是DynamicImageTagetBehaviour。

DynamicImageTagetBehaviour的关键代码如下:

public class DynamicImageTagetBehaviour : ImageTargetBehaviour
{
private GameObject subGameObject;

protected override void Awake()
{
base.Awake();
subGameObject = Instantiate(Resources.Load("EasyAR", typeof(GameObject))) as GameObject;
subGameObject.transform.parent = transform;
}
}


加载了Resources目录下的EasyAR prefabs,转成了GameObject类型,

然后

subGameObject.transform.parent = transform;


让这个gameObject跟着识别出来的图像走。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  unity3d easyAR