ARFoundation项目学习记录(三)--基于图像检测的AR庆年应用开发(下)

项目构思:

本项目计划以庆春节为主题,根据春节的习俗舞龙灯,制作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

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值