【开发指南】AR Foundation 扫描

news2024/11/24 12:50:01

开发平台: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 完全沉浸无任何差异。显然此种设计方式是完全不可取用的。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/100301.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

C++PrimerPlus 第八章 函数探幽-8.5 函数模板

目录 8.5 函数模板 8.5.1 重载的模板 8.5.2 模板的局限性 8.5.3 显式具体化 8.5.3.1 第三代具体化&#xff08;ISO/ANSI C标准&#xff09; 8.5.3.2 显式具体化示例 8.5.4 实例化和具体化 8.5.5 编译器选择使用哪个函数版本 8.5.5.1 完全匹配和最佳匹配 8.5.5.2 部分…

计算机毕设Python+Vue学生风采网(程序+LW+部署)

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

【Python学习记录】numpy数组用法整理

✨ 博客主页&#xff1a;小小马车夫的主页 ✨ 所属专栏&#xff1a;Python学习记录 文章目录前言一、numpy数组创建1、numpy.array创建数组2、从已有数组中创建数组二、numpy创建数组初始化1、numpy.zero2、numpy.ones3、numpy.arange4、numpy.linspace5、numpy.random三、nump…

Mentor-dft 学习笔记 day44-Low-Power Design Test

Low-Power Testing Overview Tessent Scan支持启用低功耗测试的操作。 •在存在孤立cell的情况下插入专用包装cell。 •根据驱动的逻辑和电源域的优先级将专用包装单元分配给电源域。 低功耗设计流程包括以下步骤&#xff1a; 1.在CPF/UPF文件中指定低功耗数据规范。 2.在设计…

[附源码]计算机毕业设计Python的校园报修平台(程序+源码+LW文档)

该项目含有源码、文档、程序、数据库、配套开发软件、软件安装教程 项目运行 环境配置&#xff1a; Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术&#xff1a; django python Vue 等等组成&#xff0c;B/S模式 pychram管理等…

RequestResponse

Request Request继承体系 Request获取请求数据 获取请求数据 通用方式获取请求参数 WebServlet("/req1") public class req1 extends HttpServlet {Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOE…

电脑怎么隐藏文件夹?6个步骤完成!

在日常办公使用电脑的过程中&#xff0c;总会出现各种问题。比如&#xff1a;电脑怎么隐藏文件夹&#xff1f;当我们需要这些数据时&#xff0c;我们又该如何恢复&#xff1f;为了解决这些问题&#xff0c;小编在这里总结了6个操作步骤来隐藏文件夹数据的方法。让我们一起来看看…

【代码随想录】Day34链表:力扣203,707,206,142,面试0207

目录 基本知识 概念、类型、存储方式&#xff1a; 定义 操作 性能分析 经典方法 虚拟头结点 思路 例题&#xff1a;力扣203 链表的基本操作 思路 例题&#xff1a;力扣707 反转链表 思路 例题&#xff1a;力扣206 删除倒数第N个结点 思路&#xff1a; 例题&am…

jsp+ssm计算机毕业设计-东湖社区志愿者管理平台【附源码】

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; JSPSSM mybatis Maven等等组成&#xff0c;B/S模式 Mave…

[附源码]计算机毕业设计Python的在线作业批改系统(程序+源码+LW文档)

该项目含有源码、文档、程序、数据库、配套开发软件、软件安装教程 项目运行 环境配置&#xff1a; Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术&#xff1a; django python Vue 等等组成&#xff0c;B/S模式 pychram管理等…

tomcat 服务突然停止、日志排查以及解决方案

文章目录一、服务停止调研1. jvm排查2. 日志排查3. 推测与ssh会话有关二、ssh会话强制退出验证2.1. 手动强制关闭进程12.2. 手动强制关闭进程22.3. 总结归纳与解决方案一、服务停止调研 1. jvm排查 有可能是jvm配置参数导致的&#xff0c;然后在/var/log和/app/apache-tomcat…

2022 软件测试大题【太原理工大学】

大题应该是有两道&#xff0c;每道10分&#xff0c;具体是不是我也不知道&#xff0c;老师也不确定。① 白盒测试 —— 控制流图&#xff0c;给出一段代码&#xff0c;画出控制流图&#xff0c;根据公式求程序段的环形复杂度&#xff0c;求程序基本路径集合中的独立路径&#x…

永磁同步电机(PMSM)磁场定向控制(FOC)电流环PI调节器参数整定

文章目录前言一、调节器的工程设计方法二、电流环PI调节器的参数整定2.1.电流环的结构框图2.2.典型I型系统2.3.电流环PI参数整定计算公式三、电流环PI调节器设计实例3.1.永磁同步电机磁场定向的电流闭环控制3.2.电流环PI参数计算3.3.仿真分析总结前言 本章节采用工程设计的方法…

CommaFeed:仿Google Readerd的RSS阅读器

最近老苏身边中招的人也开始多起来了&#xff0c;大家要保重~ 本文开始于 9 月下旬&#xff0c;完成于 10 月下旬&#xff0c;目前正式版本还是老苏打包时用的 2.6.0&#xff0c;不过现在已经有了 3.0.0 RC1 什么是 CommaFeed &#xff1f; CommaFeed 是受 Google Reader 启发而…

CS144-Lab0解析

讲在开头 cs144建议我们使用Modern C来完成所有的lab&#xff0c;关于modern c的全面的用法可以在(http://isocpp.github.io/CppCoreGuidelines/CppCoreGuidelines)获取。 以下是一些代码规范&#xff1a; 不要使用malloc()和free()不要使用new和delete在不得不使用指针时应…

如何自动估算项目开发成本及报价,提高估算效率?

项目估算需要有科学专业的估算方法&#xff0c;需要有明确的量化指标&#xff0c;那么如何自动估算项目开发成本及报价&#xff1f; 第一步&#xff1a;功能点复杂程度的估算 CoCode需求分析工具&#xff0c;根据用户需求&#xff0c;使用COSMIC和IFPUG项目规模估算法&#xff…

数据结构C语言版 —— 队列+循环队列实现

文章目录队列1.概念2. 生活中队列应用3. 队列的实现初始化队列入队列出队列获取队头元素获取队尾元素获取队列中元素个数判断队列是否为空销毁队列2. 循环队列队列 1.概念 和栈相反&#xff0c;队列(queue)是一种先进先出的线性表&#xff0c;它只允许在一端进行插入&#xf…

C#-winform调用COM组件(COM组件由Qt开发)

一、场景介绍 在项目开发中,需要Qt与C#进行混合编程,完成项目开发。C#这边作为主框架,Qt负责编写插件,将功能模块通过COM组件的形式封装注册,再由C#调用、交互完成最终的项目。 程序开发环境: win10 64位 编译器: VS2017 Qt版本: Qt5.12.6 二、Qt封装COM组件 2.1 环境…

android flutter 安装

下载 flutter官网下载安装&#xff1a;https://flutter.dev/docs/development/tools/sdk/releases 将下载下来的zip安装包解压到想安装Flutter SDK的路径。注意&#xff0c;不要将flutter安装到需要一些高权限的路径&#xff0c;比如C:\Program Files\ 配置环境变量 添加fl…

案例教学 | 如何确定ADAMS简化模型的准确性,以及简化模型精度不够怎么办?

仿真建模过程中不可避免地对各种复杂元素进行简化处理。这种建模思路的终极目标是不牺牲仿真精度、还提升仿真效率。在Adams仿真建模过程中也有一些常见的简化方式&#xff0c;如非线性元素按线性建模、不考虑摩擦力、通过耦合约束等效传动关系等等。应用简化建模之前&#xff…