项目效果
AugmentedImage
该项目是增强图像的例子,相机捕捉到数据库中的图像之后,将手机中显示的白色方框(下图左侧)对准图像,将会生成一个相框(下图右侧),该相框会根据图像的大小和位置,将图像包围住。
该相框会随着图像的移动而移动,紧紧跟随图像。
ARCore 最多可以同时跟踪 20 张图像,但 ARCore 不会同时检测或跟踪同一图像的多个实例,即相机捕捉到两张相同的图像,只会跟踪其中的一个。
下图是项目的节点,下面将分析各个节点的作用。
1、ARCore Device
该节点的详情可到此处了解:传送门
它需要ARCore会话配置文件中载入 AugmentedImage 数据库,如下图
那么如何创建 AugmentedImage 数据库呢?
选中需要识别的图像,图像的类型是 Default
,然后右键选择 Create > Google ARCore > AugmentedImageDatabase
创建数据库成功后,点击数据库后如下图,Quality 是图片的质量分数,满分为100,最后使用评分为75以上的图像,该评分是根据图像中的特征点数量来决定了,特征点数量越多,评分越高。可以通过
Session.GetTrackables<AugmentedImage>(_tempAugmentedImages, TrackableQueryFilter.Updated);
来获得当前相机捕捉到的图像,该语句会将捕获到的图像存储到 _tempAugmentedImages
集合中。
2、ExampleController
当相机捕捉到数据库中的图像后,会根据图像的大小和位置生成相框,具体的代码实现请看下面的注释。
namespace GoogleARCore.Examples.AugmentedImage
{
using System.Collections.Generic;
using System.Runtime.InteropServices;
using GoogleARCore;
using UnityEngine;
using UnityEngine.UI;
public class AugmentedImageExampleController : MonoBehaviour
{
// 识别到 augmented images 后实例化的预制体
public AugmentedImageVisualizer AugmentedImageVisualizerPrefab;
// 一个 UI 界面
public GameObject FitToScanOverlay;
// augmented images 的编号与它相应相框模型的实例
private Dictionary<int, AugmentedImageVisualizer> _visualizers
= new Dictionary<int, AugmentedImageVisualizer>();
// 存储 augmented images 的集合
private List<AugmentedImage> _tempAugmentedImages = new List<AugmentedImage>();
public void Awake()
{
Application.targetFrameRate = 60; // 设为 60 帧
}
public void Update()
{
// 按了返回键则退出程序
if (Input.GetKey(KeyCode.Escape))
Application.Quit();
// ARCore 正在进行追踪时,手机永不熄屏,没有在追踪时设置会原本的熄屏时间
if (Session.Status != SessionStatus.Tracking)
Screen.sleepTimeout = SleepTimeout.SystemSetting;
else
Screen.sleepTimeout = SleepTimeout.NeverSleep;
// 获得当前帧中的 augmented images
Session.GetTrackables<AugmentedImage>(
_tempAugmentedImages, TrackableQueryFilter.Updated);
foreach (var image in _tempAugmentedImages)
{
// AugmentedImageVisualizer 该脚本是挂载在相框中的
AugmentedImageVisualizer visualizer = null;
// 根据 augmented images 的编号 DatabaseIndex 获取对应的相框实例,将相框实例赋值到 visualizer
_visualizers.TryGetValue(image.DatabaseIndex, out visualizer);
// 如果当前的 image 是正在追踪的,且它是新识别到的 image,那么给它创建一个相框实例
if (image.TrackingState == TrackingState.Tracking && visualizer == null)
{
// 创建一个锚点以确保 ARCore 持续跟踪此增强图像
Anchor anchor = image.CreateAnchor(image.CenterPose);
// 实例化一个相框出来,并且它的父节点是上一条语句创建的锚点
visualizer = (AugmentedImageVisualizer)Instantiate(
AugmentedImageVisualizerPrefab, anchor.transform);
// 设置相框实例对应的 augmented images
visualizer.Image = image;
// 将 augmented images 的编号与相框实例绑定,添加到字典
_visualizers.Add(image.DatabaseIndex, visualizer);
}
else if (image.TrackingState == TrackingState.Stopped && visualizer != null)
{
// 当前 augmented images 停止追踪了,那么从字典中删除它的 k-v,并 Destroy 该 image 的相框
_visualizers.Remove(image.DatabaseIndex);
GameObject.Destroy(visualizer.gameObject);
}
}
// 如果当前有正在跟踪 augmented images ,那么就隐藏 UI界面 fit-to-scan overlay
foreach (var visualizer in _visualizers.Values)
{
if (visualizer.Image.TrackingState == TrackingState.Tracking)
{
FitToScanOverlay.SetActive(false);
return;
}
}
FitToScanOverlay.SetActive(true);
}
}
}