在AR Tracked Image Manager组件中,有一个Tracked Image Prefab属性,这个属性即为需要实例化的虚拟对象。默认,ARFoundation是支持多图像跟踪的,如下图所示。

但在AR应用运行时,只能有一个AR Tracked Image Manager组件运行(多个AR Tracked Image Manager组件会导致跟踪冲突),即只能设置一个Tracked Image Prefab,即不能实例化多个虚拟对象,这将极大的限制跟踪图像的实际应用,所以为了实例化多个虚拟对象,我们只能动态的修改Tracked Image Prefab属性。经过测试,我们发现在ARFoundation中,AR Tracked Image Manager组件在trackedImagesChanged事件触发之前就已经实例化了虚拟对象,因此我们的解决思路是:在AR Tracked Image Manager组件Tracked Image Prefab中设置第一个需要实例化的Prefab,然后在trackedImagesChanged事件里捕捉到图像added操作,更改Tracked Image Prefab为下一个需要实例化的Prefab,这样来达到动态调整虚拟对象的目的。如正常设置Tracked Image Prefab为Spider Prefab,在检测到Spider图像后,我们将Tracked Image Prefab修改为Cat Prefab,这样,再检测到Cat图像后就会实例化Cat Prefab了。具体代码如下:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.XR.ARFoundation;
public class MultiImageTracking : MonoBehaviour
ARTrackedImageManager ImgTrackedmanager;
public GameObject[] ObjectPrefabs;
private void Awake()
ImgTrackedmanager = GetComponent<ARTrackedImageManager>();
private void OnEnable()
ImgTrackedmanager.trackedImagesChanged += OnTrackedImagesChanged;
void OnDisable()
ImgTrackedmanager.trackedImagesChanged -= OnTrackedImagesChanged;
void OnTrackedImagesChanged(ARTrackedImagesChangedEventArgs eventArgs)
foreach (var trackedImage in eventArgs.added)
OnImagesChanged(trackedImage.referenceImage.name);
private void OnImagesChanged(string referenceImageName)
if (referenceImageName == "Spider")
ImgTrackedmanager.trackedImagePrefab = ObjectPrefabs[1];
Debug.Log("Tracked Name is .." + referenceImageName);
Debug.Log("Prefab Name is .." + ImgTrackedmanager.trackedImagePrefab.name);
if (referenceImageName == "Cat")
ImgTrackedmanager.trackedImagePrefab = ObjectPrefabs[0];
编译运行,效果如下图所示。


读者可能已经看到,这种方式其实有个很大的弊端,即必须要按顺序检测图像,因为我们无法在用户检测图像之前预测用户可能会检测的2D图像。为解决这个问题,就不能让AR Tracked Image Manager组件实例化对象,而由我们自己负责虚拟对象的实例化。将AR Tracked Image Manager组件下的Tracked Image Prefab属性清空,为MultiImageTracking脚本的ObjectPrefabs数组赋上相应的值,并编写如下代码。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.XR.ARFoundation;
public class MultiImageTracking : MonoBehaviour
ARTrackedImageManager ImgTrackedmanager;
public GameObject[] ObjectPrefabs;
private void Awake()
ImgTrackedmanager = GetComponent<ARTrackedImageManager>();
private void OnEnable()
ImgTrackedmanager.trackedImagesChanged += OnTrackedImagesChanged;
void OnDisable()
ImgTrackedmanager.trackedImagesChanged -= OnTrackedImagesChanged;
void OnTrackedImagesChanged(ARTrackedImagesChangedEventArgs eventArgs)
foreach (var trackedImage in eventArgs.added)
OnImagesChanged(trackedImage);
private void OnImagesChanged(ARTrackedImage referenceImage)
if (referenceImage.referenceImage.name == "Spider")
Instantiate(ObjectPrefabs[0], referenceImage.transform);
if (referenceImage.referenceImage.name == "Cat")
Instantiate(ObjectPrefabs[1], referenceImage.transform);
在上述代码中,我们根据参考图像的名字在被检测图像的位置实例化虚拟对象,实现了我们的要求,不再要求用户按顺序扫描图像。但现在又有一个新问题,我们不可能使用if-else或者switch-case语句遍历所有可能的模型,因此我们改用动态加载模型的方式,编写代码如下。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.XR.ARFoundation;
public class MultiImageTracking : MonoBehaviour
ARTrackedImageManager ImgTrackedManager;
private Dictionary<string, GameObject> mPrefabs = new Dictionary<string, GameObject>();
private void Awake()
ImgTrackedManager = GetComponent<ARTrackedImageManager>();
void Start()
mPrefabs.Add("Cat", Resources.Load("Cat") as GameObject);
mPrefabs.Add("Spider", Resources.Load("Spider") as GameObject);
private void OnEnable()
ImgTrackedManager.trackedImagesChanged += OnTrackedImagesChanged;
void OnDisable()
ImgTrackedManager.trackedImagesChanged -= OnTrackedImagesChanged;
void OnTrackedImagesChanged(ARTrackedImagesChangedEventArgs eventArgs)
foreach (var trackedImage in eventArgs.added)
OnImagesChanged(trackedImage);
private void OnImagesChanged(ARTrackedImage referenceImage)
Debug.Log("Image name:"+ referenceImage.referenceImage.name);
Instantiate(mPrefabs[referenceImage.referenceImage.name], referenceImage.transform);
为了实现代码所描述功能,我们还要完成两项工作,第一项工作是将Prefabs放到Resources文件夹中方便动态加载,第二项工作是保证mPrefabs中的key与RefImageLib参考图像库中的参考图像名一致。至此,我们已实现自由的多图像多模型功能。
以现实世界中的某物体、某介质为参照物,将AR内容固定到该参照物的相对位置,伴随参照物的移动而发生相对位置的改变,即所谓的AR跟踪。
2D图像追踪(ARKit和ARCore),通过检测环境中的特定2D图像,Tracked Image Manager可以自动创建表示所有已识别图像的GameObject,让你可以根据特定图像改动AR体验。...............
选择这两个游戏对象,为其添加碰撞体。在Hierarachy窗口的空白处单击鼠标右键,在弹出的菜单中选择Create>UI>Button,创建两个按钮来控制模型的放置和删除,分别命名为SureButton和DelButton,如图所示,并修改“Button”层级下的“Text”为对应的文本“确认”和“取消”,调整大小和位置。把两个Toggle拖拽到Canvas的层级下,选中两个“Toggle”,在其“Toggle(Script)”组件中的“Group”中,选择新建的空物体“Group”,如图所示。
视觉跟踪综述
目标跟踪是绝大多数视觉系统中不可或缺的环节。在二维视频跟踪算法中,基于目标颜色信息或基于目标运动信息等方法是常用的跟踪方法。从以往的研究中我们发现,大多数普通摄像头(彩色摄像头)下非基于背景建模的跟踪算法都极易受光照条件的影响。这是因为颜色变化在某种程度上是光学的色彩变化造成的。如基于体素和图像像素守恒假设的光流算法它也是假设一个物体的颜色在前后两帧...
2.添加一个序列化的库
①AR Session Origin→Assets下Scenes→右键→Create→XR→RefernceImageLibrary→Add Image添加识别图片→
再点击Add Ima
在ARFoundation中,平面(Plane)、特征点云(Point Cloud)、参考点(Reference Point)、增强图像(Tracked Image)、环境探头(Environment Probe)、人脸(Face)、3D物体(Tracked Object)这七类对象称为可跟踪对象(trackable),也即是说ARFoundation目前可以实时的跟踪处理这七类对象。当然,这...