【开发指南】AR Foundation 扫描

开发平台:Unity 2020 版本以上
编程平台:Visual Studio 2022
面向平台:IOS 设备

一、本文聚焦问题点


  • 使用哪种 API 完成相机权限的获取
  • 如何进行画面跟踪对象的捕获。

  对深入了解AR的开发者尤为重要。但只是从应用目的上,只需要调用 “哪些API” 去实现AR扫图、扫物出像。所以本文的主要目的是围绕扫描出图的准备记录与应用案例进行记录与说明。

二、理解:AR Foundation 的扫描流程


在这里插入图片描述
  即便 AR Foundation 为我们已经准备好了可立刻投入至生产活动的预制体内容。从仅需要完成扫描一次出现图像的角度上,原配的预制体足以完成该过程。但仍然需要我们去完成一些 扫描 逻辑的处理工作。

三、准备工作:部署 AR 运行环境


3.1 相机关联管理:AR Session

  AR Session 是 AR Foundation 提供针对设备自主获取相机权限、配置画面刷新等内容的预制体对象。该对象在单个场景中要求仅唯一存在。复数存在的 AR Session 仅生效第一个。故在多场景应用 AR Session 被建议在第一个场景内创建,并使用 DontDestroyOnLoad(this.gameObject.root) 方法保留该对象。下面是该 AR Session 的具体描述:

描述 全局唯一的组件,用于管理AR相机画面与生命周期。
创建 工程场景内容,右键 ”XR -》AR Session“ 完成创建。
作用 提供 “相机权限获取” 的功能 + 管理 AR 画面刷新机制。

主要 API(在开发中,使用频率较高的几类):

  • stateChanged:监听设备状态。(唯一性)
    作用:检测当前设备是否支持 XR 功能。因为对于部分 Android 设备,并不支持AR应用的运行。
    注意:可用于持续监测状态,基于不同状态给予用户提示设备 不可运行、缺少支持的组件 等信息。
  • notTrackingReason:未跟踪缘由信息。
    作用:反馈图像跟踪过程中出现丢失的具体原因。
  • Reset():重设 AR Session。
    注意:每次重设,将销毁现有在跟踪信息对象,并恢复设备追踪参数至默认配置状态。
  • CheckAvailability():检查设备是否支持XR的状态。
  • Install():似乎是AR服务项,具体英文描述文档如下所示:该方法必须在 CheackAvailability() 方法确认设备可支持 AR 功能后调用。或许可绕过检查进行安装服务,但不支持的总不会真可以运行吧(括弧笑)
You must call <see cref="CheckAvailability"/> before trying to start the installation,
and the <see cref="state"/> must not be <see cref="ARSessionState.Unsupported"/>
or this method will throw <see cref="System.InvalidOperationException"/>.

四、跟踪管理器:Tracked Image/Object Manager


  AR Foundation 针对 “扫描识别” 功能,推出 Tracked Image Manager(识图)Tracked Object Manager(识物) 两种类型的扫描跟踪方式。该两种管理器将根据已注册的 Lib 文件,识别检测画面内容,对符合条件的对象,提供。

public void OnEnable() => this.ARTrackedImageManager.trackedImagesChanged += OnTrackedImagesChanged;

五、关于 Tracked Image Manager


主要核心API

public void OnEnable() {
    
     this.ARTrackedImageManager.trackedImagesChanged += OnTrackedImageAdded; }
  • trackedImagesChanged:追踪图像的委托事件。订阅该方法,将允许获取画面内所有跟踪对象的信息。
    • ARTrackedImagesChangedEventArgs:图像事件。提供 Add\Update\Remove 三个阶段的跟踪i信息。
      • eventArgvs.added:当记录的 Lib 出现在画面内。
      • eventArgvs.updated:当记录的 Lib 持续在画面内更新信息。
      • eventArgvs.removed:当记录的 Lib 从画面中消失。

  浅显的理解就是,我们期望扫描的对象发生进入、持续变化、离开相机画面时,返回配置的 Tracked Image、object Lib 信息。基于该三种阶段信息。去落实开发例如:扫描即刷新虚拟物体对象,将虚拟物体对象持续更新至当前被扫描物体图像的位置等内容。

六、关于 AR Tracked Image


记录当前跟踪图像的数据类。当跟踪图像出现在设备相机画面中活动时,会通过 trackedImagesChanged(Action) 返回 added/updated/removed 三种状态下跟踪图像的数据信息内容。想要实现虚拟物体呈现于指定的物理模型位置上,需通过此接口访问。

主要 API

  • extents:2D图片的实际范围(取值 size 的一半)
  • size:2D图片的实际大小(尺寸)
  • nativePtr
  • referenceImage:物理环境下被用于跟踪的 Image 图片的详细信息。直指 Reference Image 配置文件
    • size:图像大小(米) 用于一些平台的需要以改善跟踪流程。
    • width:图像宽度(米)
    • height:图像高度(米)

程序开发:简版扫描器(传递数据信息)


/// <summary>
/// AR Foundation 扫描器
/// </summary>
public class ARScanner : MonoBehaviour
{
    
    
	[Tooltip("AR Tracked Images Manager")]
	public ARTrackedImageManager TrackedImageMgr;

	public void Awake() 
	{
    
    
	 	TrackedImageMgr = transform.TryGetComponent<ARTrackedImagesManager>("[AR] Session Orgin(Clone)");
	}

	public void OnEnable()
	{
    
    
		this.TrackedImageMgr.trackedImagesChanged += OnTrackedImageAdded;
		this.TrackedImageMgr.trackedImagesChanged += OnTrackedImageUpdated;
		this.TrackedImageMgr.trackedImagesChanged += OnTrackedImageRemoved;
	}

	public void Disable()
	{
    
    
		this.TrackedImageMgr.trackedImagesChanged -= OnTrackedImageAdded;
		this.TrackedImageMgr.trackedImagesChanged -= OnTrackedImageUpdated;
		this.TrackedImageMgr.trackedImagesChanged -= OnTrackedImageRemoved;
	}
	
	public void OnTrackedImageAdded(ARTrackdImagesChangedEventArgvs e)
	{
    
    
		var thisImagesAdded = e.added;
		foreach(var item in thisImagesAdded)
		{
    
    
			ARDataManager.SaveTF(item.referenceImage.name, item.transform);
			EventDispatcher.DispatchEvent("Refresh Self", );
		}
	}

	public void OnTrackedImageUpdated(ARTrackdImagesChangedEventArgvs e)
	{
    
    
		var thisImagesAdded = e.added;
		foreach(var item in thisImagesAdded)
		{
    
    
			ARDataManager.UpdateTF(item.referenceImage.name, item.transform);
			EventDispatcher.DispatchEvent("Update Position", item.referenceImage.name);
		}
	}
	
	public void OnTrackedImageRemoved(ARTrackdImagesChangedEventArgvs e)
	{
    
    
		var thisImagesAdded = e.added;
		foreach(var item in thisImagesAdded)
		{
    
    
			ARDataManager.RemoveTF(item.referenceImage.name, item.transform);
		}
	}
}
  • TryGetComponet:自定义扩展方法,用于检测当前 AR Tracked Image Manager 是否为空,空则索引场景内创建的对象。
  • 一般情况下,订阅 trackedImagesChanged 事件,将 Added/Updated/Removed 三周期统一规范至一个订阅即可。但考虑其运用目的,被拆分为三类事件进行订阅,以更好阅读与修改。
  • ARDataManager 是用于持久管理 Tracked Image(物理空间环境下,物理对象在虚拟空间环境下的位置信息)。以供后续 虚拟空间下的虚拟对象获取图像位置信息并同步至该位置处。

后记

  AR 的核心交互围绕物理空间信息与虚拟对象之间。即基于现实空间环境下的虚拟物体交互行为。特别注意的是,交互行为的方式并非完全依赖于虚拟空间环境。例如构建虚拟房间,通过平板扫描呈现在虚拟的房间内移动。其本质上与 VR 完全沉浸无任何差异。显然此种设计方式是完全不可取用的。

猜你喜欢

转载自blog.csdn.net/qq_51026638/article/details/127101246