项目构思:
本项目计划以庆春节为主题,根据春节的习俗舞龙灯,制作AR交互视频,以此展示图像检测的部分功能,并与上节年夜饭交互模型结合,展示多图像追踪功能
项目设计:
(1)当摄像头识别到准备好的舞龙灯图片,如图所示,会显示一段视频,可以控制视频播放与暂停。
(2)实现多卡识别的效果,检测到年夜饭图片时会显示交互模型,检测到舞龙灯图片时,会显示交互视频。
项目实施:
打开上节做年夜饭的场景文件,Ctrl+D复制一个场景,打开新场景,选择上次编辑的参考图像库ReferenceImageLibrary,在Inspector窗口点击 “Add Image”添加准备好的舞龙灯的参考图片,如图所示
制作视频预制体:我们选择plane作为视频的载体,在Hierarachy窗口的空白处单击鼠标右键,在弹出的菜单中选择3D Object>Plane,如图所示,按下F2给Plane重命名为舞龙灯Video。
把资源中的舞龙灯MP4文件拖拽到sence窗口中的Plane对象上,如图004所示,在Video Player组件中取消勾选Play On Awake,如图所示。
4.在Hierarachy窗口的空白处单击鼠标右键,在弹出的菜单中选择UI>Button,新建一个控制视频播放的按钮,选择Button的子物体Text,如图所示,修改其Text属性为“播放”,在Rect Transform调整按钮的大小和位置, 如图所示
5.我们最终要实现的效果是当检测到舞龙灯的图片时,才会显示UI按钮,因此我们在Hierarchy窗口把Canvas拖拽到舞龙灯Video的子物体下,如图所示
6.新建一个C#脚本,命名为AR_PLAY,用于控制视频的播放与暂停,代码如下
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Video;
using UnityEngine.UI;
public class AR_PLAY : MonoBehaviour
{
public VideoPlayer v;
private Button button;
private Text text;
void Start()
{
button = this.GetComponent<Button>();
text=button.GetComponentInChildren<Text>();
}
void Update()
{
}
public void OnClick()
{
if (v.isPlaying)
{
text.text = "播放";
v.Pause();
}
else
{
text.text = "暂停";
v.Play();
}
}
}
7.将脚本挂载到Button上,并在属性面板进行赋值,然后单击On Click()下面的“+”号按钮,指定自己作为消息接收对象,选择AR_PLAY的On Click()函数作为响应按钮单击事件
的回调函数,如图所示。把“舞龙灯Video”拖入文件夹Prefabs中,这样视频的预制体就制作好了。
8.但一个AR应用只能有一个AR Tracked Image Manager组件运行,Tracked Image Prefab只能挂载一个Prefab。新建一个C#脚本,命名为MultiImageTrack ,用于实时改变Tracked Image Prefab,代码如下。
using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.XR.ARFoundation;
public class MultiImageTrack : MonoBehaviour
{
ARTrackedImageManager ImageManager;
public GameObject[] goPrefabs;
private void Awake()
{
ImageManager = GetComponent<ARTrackedImageManager>();
}
private void OnEnable()
{
ImageManager.trackedImagesChanged += OnTrackedImagesChanged;
}
private void OnDisable()
{
ImageManager.trackedImagesChanged -= OnTrackedImagesChanged;
}
private void OnTrackedImagesChanged(ARTrackedImagesChangedEventArgs eventArgs)
{
foreach (var trackedImage in eventArgs.added) {
OnImagesChanged(trackedImage);
}
}
private void OnImagesChanged(ARTrackedImage trackedImage)
{
if (trackedImage.referenceImage.name =="nianyefan") {
ImageManager.trackedImagePrefab = goPrefabs[1];
}
if (trackedImage.referenceImage.name =="wulongdeng")
{
ImageManager.trackedImagePrefab = goPrefabs[0];
}
}
}
9.将脚本挂载到AR Session Origin对象上,按顺序把年夜饭模型和舞龙灯视频放入goPrefabs数组。同时设置Max Number Of Moving Image为2,即指定可追踪的最大图像数为2,如图所示。
这样当扫描到年夜饭图片时,先实例化TrackedImagePrefab中的年夜饭模型,同时TrackedImagePrefab修改为舞龙灯视频Prefab,这样再检测到舞龙灯图片时,就实例化了舞龙灯视频Prefab。
项目测试:
打包成apk发布到手机运行,效果如下:
体会:
ARFoundation的图片识别感觉没有Vofuria好用,没有参考系,模型的大小和朝向比较难调,然后当扫描到图片,模型的Rotation是锁定的,本来尝试过挂载控制旋转脚本,转一下就恢复原来的Rotation,可能是我没有调节其中的一些参数嘛?希望可以有人帮助下解惑哈哈,下次尝试下ARFoundation的其他功能。
源码链接:
链接:https://pan.baidu.com/s/16oWWcDaYj68bIUAWBBDVZg?pwd=ox1m
提取码:ox1m