【iOS ARKit】协作Session

    使用 ARWorldMap,能解决使用者再次进入同一物理空间时的AR 场景恢复问题,也能在多人之间共桌AR 体验,但这种共享并不是实时的,在载入ARWorldMap 后,设备新检测到的环境信息和使用者所做操作不会实时共享,即在载入ARWorldMap后,用户A 所做的操作或者添加的虚拟物体不会在用户B的设备上体现。

     为解决这个问题,ARKit 3. 0 就提出了协作 Session (Collaborative Session)的概念,协作 Session 利用Multipeer Connectivity 近距离通信或者其他网络通信方法,通过实时共享 ARAnchor 的方式达到 AR体验实时共享的目的。

    ARWorldMap 通过地标(Landmark 也即是特征值信息)来恢复与更新用户姿态,ARWorldMap 也通过一系列的 ARAnchor 来连接虚实,并在 ARAnchor 下挂载虚拟物体。但在ARWorldMap 中,这些数据并不是实时更新的,即在ARWorldMap 生成之后用户新检测到的地标及所做的操作并不会共享,其他人也无法看到变更后的数据。在 ARWorldMap 之外用户新检测到的地标或者新建的 ARAnchor 并不会被共享,因此,AR WorldMap 只适用于一次性的数据共享,并不能做到实时交互共享。

     协作 Session 的出现就是为了解决这个问题,协作 Session 可以实时地共享 AR体验,持续性地共享ARAnchor 及环境理解相关信息,利用 Multipeer Connectivity 近距离通信框架,所有用户都是平等的,没有主从的概念,因此,新用户可以随时加入,老用户也可以随时退出,这并不会影响其他人的体验,也不会中断共享进程。实时共享意味着在整个协作 Session 过程中,任何一个用户做的变更都可以即时地反馈到所有参与方场景中,如一个用户新添加了一个 ARAnchor,其他人可以即时地看到这个 ARAnchor。通过协作Session 可以营造持续性的、递进的AR体验,可以构建无中心、多人AR应用,并且所有的物理仿真、场景变更、音效都会自动进行同步。

       在协作 Session设计时,为了达到去中心、实时共享目标,ARKit 团队将环境检测分成两部分进行处理,一部分用于存储用户自身检测到的环境地标及创建的 ARAnchor 等信息,叫作Local Map,另一部分用于存储其他用户检测到的环境地标及创建的 ARAnchor 等信息,叫作 External Map。

  

     下面以两个用户使用协作 Session 共享为例进行说明,在刚开始时,用户1与用户2各自进行环境检测与 ARAnchor 操作,这时他们相互之间没有联系,有各自独立的坐标系,如图8-7所示。在AR 应用进程中,用户1检测到的环境地标及创建的 ARAnchor 等信息(这些信息称为 Collaboration Data)会不断地实时共享给用户2,用户2会在其 External Map 里存储这些信息,反之亦然,用户1也会在其 External Map 里存储用户2检测到的环境地标及创建的 ARAnchor 等信息。随着探索的进一步推进,当用户1与用户2检测到的地标及 ARAnchor 有共同之处时(即有匹配的特征点),如图8-8所示,ARKit 会根据这些三维地标及ARAnchor信息解算出用户1与用户2之间的坐标转换关系,并且定位他们相互之间的位置关系。如果ARKit 解算成功,这时,用户1的Local Map 会与其External Map 融合成新的Local Map,即用户2探索过的环境会成为用户1环境理解的一部分,用户2也会进行同样的操作。这个过程大大地扩展了用户1与用户2的环境理解范围,即用户2 环境探索的部分也已成为用户1环境探索的一部分,用户1无须再去探索用户2已探索过的环境,对用户2亦是如此。因为此时环境信息已经进行了融合,用户1 自然就可以看到用户2 创建的 ARAnchor了。

     需要注意的是,虽然环境探索部分进行了融合,但是用户1与用户2的世界坐标系仍然是独立的。然而由于 ARAnchor 是相对于特定Local Map,在进行环境融合时 ARKit 已经解算出了之间的坐标转换关系,所以就能够在真实世界中唯一定位这些 ARAnchor。

       在图8-9中可以看到,使用协作 Session 的第一步是设置并建立网络连接,网络连接可以使用 MultipeerConnectivity 近距离通信框架,也可以使用任何其他可信的网络通信框架。在建立网络连接之后,需要启用协作 Session 功能,AR WorldTrackingConfiguration 配置类提供了一个isCollaborationEnabled 属性,该属性为布尔值类型,设置 true 即可启动协作 Session 功能。

      在 AR 应用运行时,ARKit 会周期性调用 session(_:didOutputCollaborationData:)方法,通过这个方法就可以将 AR运行时数据(Collaboration Data)共享给其他用户。但需要注意的是,这些 Collaboration Data数据会周期性地产生并积累,但不会自动发送,AR应用应当及时将这些数据发送给所有其他参与方进行共享,其他用户接收到 Collaboration Data 数据后,需要进行反序列化,并使用 update(with:)方法应用到ARSession 中。数据产生、发送、接收这个过程会在整个协作 Session 中持续进行,通过实时地数据分发、更新,就能够实现实时多用户的 AR共享

      在整个协作 Session 中,ARAnchor 起着非常重要的作用,通过实时网络传输,ARAnchor 在整个网络中生命周期是同步的,即用户1创建一个 ARAnchor后用户2可以实时地看到,用户1销毁一个 ARAnchor,用户2也会同步移除这个 ARAnchor。除此之外,每一个 ARAnchor 都有一个 Session Identifier 值,通过这个 Session Identifier 值就可以知道这个 ARAnchor 的创建者,在应用中,可以利用这个属性区别处理自己创建的 ARAnchor 和别人创建的ARAnchor,只有自己创建的 ARAnchor 才需要共享。

     在协作 Session 中,只有用户自己人工创建的 ARAnchor 会被共享,包括用户自己创建的子级ARAnchor,其他的如 ARImageAnchor、ARObjectAnchor、ARPlaneAnchor 等系统自动创建的锚点则不会被共享(此类锚点遵循 ARTrackable 协议)。

    在协作 Session 中,参与用户的位置信息非常关键,因为这涉及坐标系的转换及虚拟物体的稳定性,因此,ARKit 专门引人了一个 ARParticipantAnchor用于定位和描述用户信息。当用户接收并融合其他用户的数据后,ARKit会解算出用户之间的相互关系,最重要的就是坐标系转换关系。为直观地描述相互关系并减少运算,ARKit 会创建 ARParticipantAnchor 用于描述其他用户在自己世界坐标系中的位置与姿态。

     同时,为了实时精确捕捉其他用户的位置与姿态,ARParticipantAnchor 每帧都会更新。与所有其他可跟踪对象一样,每一个 ARParticipantAnchor 都有一个独立且唯一的 Identifier 值,ARParticipantAnchor 可以随时被添加、更新、移除,用于及时反映协作 Session 中参与者的加入、更新和退出。ARParticipantAnchor 会在协作 Session 中 Local Map 与 External Map 融合时创建,因此,ARParticipantAnchor 可以看作 AR 共享正常运行的标志。正是通过ARParticipantAnchor 与 ARAnchor,参与者都能在正确的现实环境位置中看到一致的虚拟物体。

       通过前面的讲述我们可以看到,共享体验在参与者都探索到公共的地标及 ARAnchor 后开始(通俗地讲就是手机扫描到公共的物理环境),但在不同的设备上匹配公共地标受很多因素影响,如角度、光照、遮挡等,正确快速匹配并不是一件简单的事情,因此,为更快地开始共享体验,参与者最好以相同的摄像机视角扫描同一片物理场景开始,如图8-10所示。另外最好确保当前 ARFrame. WorldMappingStatus 处于mapped 状态,这可以确保参与者看到的三维地标及时保存进 L.ocal Map 或 External Map 中,其他参考者可以本地化(Localize)这些三维坐标并更好地进行匹配,从而开始 AR 共享进程,除此之处,也可以检查这个属性以获取当前协作 Session工作状态。

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

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

相关文章

【MATLAB】 小波分解信号分解+FFT傅里叶频谱变换组合算法

有意向获取代码,请转文末观看代码获取方式~ 展示出图效果 1 小波分解算法 小波分解算法是一种数学方法,用于将信号分解为不同频率的小波成分。这种算法基于小波函数,可以用于信号处理、图像压缩和数据压缩等领域。小波分解算法的基本思想是…

LeetCode59. 螺旋矩阵 II(C++)

LeetCode59. 螺旋矩阵 II 题目链接代码 题目链接 https://leetcode.cn/problems/spiral-matrix-ii/ 代码 class Solution { public:vector<vector<int>> generateMatrix(int n) {vector<vector<int>> res(n, vector<int>(n, 0));int startx …

数据结构:栈和队列与栈实现队列(C语言版)

目录 前言 1.栈 1.1 栈的概念及结构 1.2 栈的底层数据结构选择 1.2 数据结构设计代码&#xff08;栈的实现&#xff09; 1.3 接口函数实现代码 &#xff08;1&#xff09;初始化栈 &#xff08;2&#xff09;销毁栈 &#xff08;3&#xff09;压栈 &#xff08;4&…

代码随想录算法训练营第27天—贪心算法01 | ● 理论基础 ● 455.分发饼干 ● 376. 摆动序列 ● 53. 最大子序和

理论基础 https://programmercarl.com/%E8%B4%AA%E5%BF%83%E7%AE%97%E6%B3%95%E7%90%86%E8%AE%BA%E5%9F%BA%E7%A1%80.html 贪心算法的本质&#xff1a;由局部最优推到全局最优贪心算法的套路&#xff1a;无固定套路 455.分发饼干 https://programmercarl.com/0455.%E5%88%8…

【毕业设计推荐】基于MATLAB的水果分级系统设计与实现

一、课题介绍 现在商业行为中&#xff0c;在水果出厂前都需要进行质量检测&#xff0c;需要将不同等级的水果进行分级包装&#xff0c;以保证商业利益最大化。可是传统方法都是依靠人工进行检测&#xff0c;效率低下&#xff0c;主观成分大&#xff0c;并不能很好客观地评价出货…

Qt中的QGraphicView和QGraphicScene简单使用

概述&#xff1a;我们利用QGraphicView和QGraphicScene来实现一个简单的视频播放器&#xff0c;然后上面悬浮一些操作的控件&#xff0c;看看怎么来实现。 1、CcTestVideoPlayer类 模拟播放器类&#xff0c;继承QGraphicScene 1.1 CcTestVideoPlayer.h #pragma once#include…

【ArcGIS】重采样栅格像元匹配问题:不同空间分辨率栅格数据统一

重采样栅格像元匹配问题&#xff1a;不同空间分辨率栅格数据统一 原始数据数据1&#xff1a;GDP分布数据2.1&#xff1a;人口密度数据2.2&#xff1a;人口总数数据3&#xff1a;土地利用类型 数据处理操作1&#xff1a;将人口密度数据投影至GDP数据&#xff08;栅格数据的投影变…

SpringBoot案例(黑马学习笔记)

这个案例呢&#xff0c;就是Tlias智能学习辅助系统。 参考接口文档完成后端功能的开 发&#xff0c;然后结合前端工程进行联调测试即可。 完成后的成品效果展示&#xff1a; 准备工作 需求&环境搭建 需求说明 部门管理 部门管理功能开发包括&#xff1a; ● 查询部门列…

亚信安慧AntDB数据库与流式处理的有机融合

流式处理的概念 2001年9月11日&#xff0c;美国世贸大楼被袭击&#xff0c;美国国防部第一次将“主动预警”纳入国防的宏观战略规划。而IBM作为当时全球最大的IT公司&#xff0c;承担了大量基础支撑软件研发的任务。其中2009年正式发布的IBM InfoSphere Streams&#xff0c;就是…

杰理-按键多次按下识别多击

杰理-按键多次按下识别多击 #define ALL_KEY_EVENT_CLICK_ONLY 0 //是否全部按键只响应单击事件

自动化测试高效学习路线指导,提高你百倍自学效率

前言 从各方来的朋友&#xff0c;能够相聚这篇文章是大家的缘分&#xff0c;也是我的荣幸。 接下来&#xff0c;我要开始和大家讲讲如何从0开始学Python自动化测试。 不论是转行自动化测试还是功能测试进阶自动化还是开发转自动化测试的伙伴&#xff0c;这篇自动化测试工程师…

Zookeeper客户端命令、JAVA API、监听原理、写数据原理以及案例

1. Zookeeper节点信息 指定服务端&#xff0c;启动客户端命令&#xff1a; bin/zkCli.sh -server 服务端主机名:端口号 1&#xff09;ls / 查看根节点下面的子节点 ls -s / 查看根节点下面的子节点以及根节点详细信息 其中&#xff0c;cZxid是创建节点的事务id&#xff0c…

Rocky Linux 运维工具 firewall-cmd

一、firewall-cmd​的简介 ​​firewall-cmd​是基于firewalld的防火墙管理工具。用户可以使用它来配置、监控和管理防火墙规则&#xff0c;包括开放端口、设置服务规则等。 二、firewall-cmd​​的参数说明 序号参数描述1​​–zone指定防火墙区域2–add-portxxx/tcp允许特定…

tkinterFrame框架+标签框架LabelFrame+Toplevel窗口的使用

1.在tkinter中&#xff0c;Frame是一个容器小部件用于组织和管理其他小部件。它可以作为一个独立的可见区域&#xff0c;也可以作为其他小部件的父容器。 import tkinter as tk import tkinter.ttk as ttk import tkinter.messagebox as mbm tk.Tk() m.title("tkinter L…

MSSQL渗透测试

目录 mssql数据库连接提权至服务器权限 拿到目标的IP地址&#xff0c;我们先对IP地址进行信息收集&#xff0c;收集信息资产&#xff0c;同时使用nmap对IP地址进行扫描 nmap -sC -sV IP从扫描的结果中&#xff0c;我们能知道目标服务器是windows操作系统&#xff0c;使用的是m…

DAY10-内容安全过滤技术概述

文件过滤技术流程: 应用行为控制技术具体:

W-TinyLFU 算法实现

前言 不同于常见的 LRU 或 LFU&#xff0c;Window TinyLFU 是一种非常高效的缓存设计方案。先来看下 LRU 和 LFU 算法的缺点&#xff1a; LFU 缺点&#xff1a; 需要为每个记录项维护频率信息&#xff0c;这将消耗大量的内存空间可能存在旧数据长期不被淘汰&#xff08;一开…

让AI给你写代码,初体验(二)-写一个flask应用

这里我们准备让AI做一个稍微复杂一点任务&#xff0c;写一个前后应用&#xff0c;具体&#xff1a; 前台用html输入股票代码&#xff0c;后台通过akshare的接口程序获取该股票的实时价格&#xff0c;然后返回显示在html 我们先用AI对话看一下&#xff0c;AI会给我们什么编码建…

柯桥会计培训学校,会计职称考试,考中级会计怎么证明工作年限?

中级会计考试是会计从业人员的重要考试之一&#xff0c;对于中级考生来说&#xff0c;工作年限证明是必不可少的一步。因此&#xff0c;在考中级会计之前&#xff0c;需要对如何证明工作年限进行了解和掌握。 为大家整理了工作年限证明相关信息&#xff0c;一起来看看吧~ 一、…

Rocky Linux 运维工具 ls

一、ls 的简介 ​​ls​ 用于列出当前目录下的文件和目录&#xff0c;以及它们的属性信息。通过 ​ls​命令可以查看文件名、文件大小、创建时间等信息&#xff0c;并方便用户浏览和管理文件。 二、ls 的参数说明 序号参数描述1-a显示所有文件&#xff0c;包括以 ​.​开头的…