【ARFoundation学习笔记】平面检测

在这里插入图片描述


写在前面的话

本系列笔记旨在记录作者在学习Unity中的AR开发过程中需要记录的问题和知识点。难免出现纰漏,更多详细内容请阅读原文。


文章目录

  • 平面检测属性
    • 可视化平面
    • 平面检测的开关控制
      • 显示与隐藏已检测平面


平面检测属性

AR中检测平面的原理:AR Foundation对摄像机获取的图像进行分析处理,分离图像中的特征点(这些特征点往往是图像中明暗、强弱、颜色变化较大的点);利用VIO和IMU跟踪这些特征点的三维空间信息;在跟踪过程中,对特征点信息进行处理,并尝试用空间中位置相近或者符合一定规律的特征点构建平面,如果成功就是检测出了平面。平面有位置、方向和边界信息,AR Plane Manager负责检测平面以及管理这些检测出来的平面,但它并不负责渲染平面。

在AR Plane Manager中,我们可以设置平面检测的方式,如水平平面(Horizontal)、垂直平面(Vertical)、水平平面&垂直平面(Everything)或者不检测平面(Nothing),检测平面也是一个消耗性能的工作,而根据应用需要选择合适的检测方式可以优化应用性能。

平面本身是一个Trackable对象,因此在AR Session Origin上检测到的时候,AR Plane Manager会实例化一个平面Prefab并挂载AR Plane组件。


可视化平面

在这里插入图片描述

AR Plane Manager只负责平面的检测,并不负责平面的渲染。平面渲染通常在检测构建的Prefab上执行,预制体上的脚本如上所示:

红框中的顶点偏差阈值表示只有偏差值在阈值范围内的特征点才被归为同一平面,因此阈值越小检测越精确。AR Plane Mesh Visualizer组件主要是从边界特征点与其他特征点三角化生成一个平面网格,而这个网格由Mesh Renderer进行渲染。默认平面预制体还有一个Line Renderer用于渲染边缘。

书中示例了自定义Shader和渲染脚本以实现定制化的平面渲染。


平面检测的开关控制

15public void TogglePlaneDetection()
16{
17.       m_ARPlaneManager.enabled = !m_ARPlaneManager.enabled;
18string planeDetectionMessage = "";
19if (m_ARPlaneManager.enabled)
20{
21.          planeDetectionMessage = "禁用平面检测";
22SetAllPlanesActive(true);
23}
24else
25{
26.          planeDetectionMessage = "启用平面检测";
27SetAllPlanesActive(false);
28}34void SetAllPlanesActive(bool value)
35{
36foreach (var plane in m_ARPlaneManager.trackables)
37.          plane.gameObject.SetActive(value);
38}

对书内的代码进行了小小的裁剪。对于平面而言,我们可以通过设置平面物体的Active状态来控制平面的显示。还记得我们说平面是受Manager自动管理的,因此如果我们手动销毁平面可能会引发异常。

显示与隐藏已检测平面

直接关闭平面检测的话,那么程序后续也不会再检测新的平面。有时我们想要隐藏已检测平面的同时保留平面检测功能,以便在显示平面检测时直接显示那些新检测的平面,而不是重新开始检测。

1using System.Collections;
2using System.Collections.Generic;
3using UnityEngine;
4using UnityEngine.XR.ARFoundation;
5using UnityEngine.UI;
67public class PlaneDisplay : MonoBehaviour
8{
9public Text m_TogglePlaneDetectionText;
10private ARPlaneManager m_ARPlaneManager;
11private bool isShow = true;
12private List<ARPlane> mPlanes;
13void Start()
14{
15.       m_ARPlaneManager = GetComponent<ARPlaneManager>();
16.       mPlanes = new List<ARPlane>();
17.       m_ARPlaneManager.planesChanged += OnPlaneChanged;
18}
19void OnDisable()
20{
21.       m_ARPlaneManager.planesChanged -= OnPlaneChanged;
22}
23.    #region 显示与隐藏检测的平面
24public void TogglePlaneDisplay()
25{
26string planeDisplayMessage = "";
27if (isShow)
28{
29.          planeDisplayMessage = "隐藏平面";
30}
31else
32{
33.          planeDisplayMessage = "显示平面";
34}
35for (int i = mPlanes.Count - 1; i >= 0; i--)
36{
37if (mPlanes[i] == null || mPlanes[i].gameObject == null)
38.             mPlanes.Remove(mPlanes[i]);
39else
40.             mPlanes[i].gameObject.SetActive(isShow);
41}
42if (m_TogglePlaneDetectionText != null)
43.          m_TogglePlaneDetectionText.text = planeDisplayMessage;
4445.       isShow = !isShow;
46}
4748private void OnPlaneChanged(ARPlanesChangedEventArgs arg)
49{
50for (int i = 0; i < arg.added.Count; i++)
51{
52.          mPlanes.Add(arg.added[i]);
53.          arg.added[i].gameObject.SetActive(isShow);
54}
55}
56.    #endregion
57}

上述代码实现了在不关闭平面检测时隐藏已检测平面的功能。原理就是对平面变化的委托添加一个OnPlaneChanged的处理事件,并从附带的事件参数中获取检测到的平面信息,保存在一个私有的List<ARPlane>中。由于PanelManager中对平面的检测由Manager进行自动管理,因此附带参数Args会产生变化,例如增加新的面,更新已有的面,删除过期的面。

所以我们切换平面检测状态的时候,还需要检测参数Args回传的面是否依旧存在,若不存在,则应当移除。否则切换已经过期的面的状态会引发异常。

37if (mPlanes[i] == null || mPlanes[i].gameObject == null)
38.             mPlanes.Remove(mPlanes[i]);

事件注册与撤销一定是成双成对的,上述代码在Start()方法中进行了注册,在OnDisable()方法中撤消了注册,如果事件没有在适当的时机撤销会引发难已排查的错误。

在这里插入图片描述

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

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

相关文章

security

Java Security 是一个用于在 Java 平台上提供安全性的框架。下面是 Java Security 的一些主要知识点&#xff1a; 1. 加密和解密&#xff1a;Java Security 提供了一组加密和解密 API&#xff0c;可以实现各种加密标准&#xff0c;如 AES、DES、RSA 等。 2. 数字签名&#xf…

socks5代理和https代理有什么不同?各自有哪些优点?

socks5代理和https代理是两种不同的代理服务&#xff0c;它们在实现方式、安全性和协议特点等方面存在差异。下面我们来详细了解一下这两种代理的优点。 一、socks5代理的优点 1. 速度快 socks5代理采用了TCP协议&#xff0c;能够有效地减少网络延迟和数据传输速度慢的问题&…

LeetCode 2586. 统计范围内的元音字符串数:模拟

【LetMeFly】2586.统计范围内的元音字符串数&#xff1a;模拟 力扣题目链接&#xff1a;https://leetcode.cn/problems/count-the-number-of-vowel-strings-in-range/ 给你一个下标从 0 开始的字符串数组 words 和两个整数&#xff1a;left 和 right 。 如果字符串以元音字母…

请求服务器数据API

请求服务器数据API 一、简介二、wx.request(object)三、HTTP域名的服务器配置 一、简介 用来请求服务器数据发起的是HTTPS请求&#xff0c;同时它需要在微信公众平台配置HTTPS服务器域名,一个月可申请三次修改&#xff0c;否则无法使用wx.request请求服务器数据。WebSocket会话…

nn.embedding函数详解(pytorch)

提示&#xff1a;文章附有源码&#xff01;&#xff01;&#xff01; 文章目录 前言一、nn.embedding函数解释二、nn.embedding函数使用方法四、模型训练与预测的权重变化探讨 前言 最近发现prompt工程(如sam模型)&#xff0c;也有transform的detr模型等都使用了nn.Embedding函…

c语言经典算法—二分查找,冒泡,选择,插入,归并,快排,堆排

一、二分查找 1、前提条件&#xff1a;数据有序&#xff0c;随机访问&#xff1b; 2、实现&#xff1a;递归实现&#xff0c;非递归实现 3、注意事项&#xff1a; 循环退出条件:low <high,low high.说明还有一个元素&#xff0c;该元素还要与key进行比较 mid的取值&#xf…

UE5 新特性 Nanite 开启

啥也不说&#xff0c;只能说&#xff0c;真的牛&#xff0c;在自己的项目上&#xff0c;从10几20的帧数&#xff0c;直接彪到了70 适用场景&#xff1a; 大场景&#xff0c;三角面足够多 在Project Setting里面 将这几个勾未true 勾上这个&#xff0c;放入场景即可

持续持续集成部署-k8s-配置与存储-配置管理:Secret 的应用

持续持续集成部署-k8s-配置与存储-配置管理:Secret 的应用 1. 简介2. 创建 Secret3. docker-registry 的使用1. 简介 与 ConfigMap 类似,用于存储配置信息,但是主要用于存储敏感信息、需要加密的信息,Secret 可以提供数据加密、解密功能。 在创建 Secret 时,要注意如果要…

【电子通识】USB Logo的标识含义

USB 图标的设计灵感是来自罗马神话中的海神尼普顿(Neptune)&#xff08;也是海王星的名字&#xff09;的武器「三叉戟」&#xff0c;一支强有力的三齿鱼叉。不过&#xff0c;为了避免鱼叉形状的设计暗示人们拿着自己的USB 存储设备到处乱插&#xff08;叉&#xff09;。设计师对…

使用vscode + lldb + codelldb调试可执行程序

主要是lauch.json的编写 // filename: lauch.json {// Use IntelliSense to learn about possible attributes.// Hover to view descriptions of existing attributes.// For more information, visit: https://go.microsoft.com/fwlink/?linkid830387"version": …

机器学习模型,超级全面总结!

机器学习是一种通过让计算机自动从数据中学习规律和模式&#xff0c;从而完成特定任务的方法。按照模型类型&#xff0c;机器学习可以分为两大类&#xff1a;监督学习模型和无监督学习模型。 附注&#xff1a;除了以上两大类模型&#xff0c;还有半监督学习和强化学习等其他类…

Vue3响应式核心API 使用注意点

目录 1&#xff0c;和 vue2 的对比2&#xff0c;核心 API 介绍1&#xff0c;reactive 和 readonly2&#xff0c;ref3&#xff0c;监听数据watchEffectwatch 4&#xff0c;判断和转换判断转换 1&#xff0c;和 vue2 的对比 vue2 的响应式原理通过 defineProperty 实现&#xff…

Texlive安装

下载4.8G的iso文件 解压 或 装载后&#xff0c;以管理员身份运行(.bat)文件。 运行以下两句代码进行Texlive相关升级 tlmgr option repository otan tlmgr update --self --all 运行以下三行代码&#xff0c;检查是否安装成功 latex -v xelatex -v pdflatex -v 如果有异常…

安全防御——三、网络安全理论知识

安全防御 一、安全防御1、网络安全常识及术语资产网络安全网络空间&#xff08;Cyberspace&#xff09;漏洞0day1day后门exploit攻击安全策略安全机制社会工程学APT&#xff08;最新&#xff09; 2、为什么会出现网络安全问题3、什么样的网络是安全的&#xff1f; 二、威胁模型…

基于单片机的智能扫地机设计

概要 本文主要设计一个简单的智能扫地机。该扫地机的核心控制元器件是stc89c52&#xff0c;具有编写程序简单&#xff0c;成本普遍较低&#xff0c;功能较多&#xff0c;效率特别高等优点&#xff0c;因此在市场上得到很大的应用。除此之外&#xff0c;该扫地机能够自动避开障碍…

【Java 进阶篇】JSP EL 详解

在 Java Web 开发中&#xff0c;JavaServer Pages&#xff08;JSP&#xff09;是一种强大的技术&#xff0c;用于创建动态 Web 应用程序。JSP 的一个关键方面是 Expression Language&#xff08;EL&#xff09;表达语言&#xff0c;它允许您在 JSP 页面中嵌入 Java 代码&#x…

关于卷积神经网络的多通道

多通道输入 当输入的数据包含多个通道时&#xff0c;我们需要构造一个与输入通道数相同通道数的卷积核&#xff0c;从而能够和输入数据做卷积运算。 假设输入的形状为n∗n&#xff0c;通道数为ci​&#xff0c;卷积核的形状为f∗f&#xff0c;此时&#xff0c;每一个输入通道都…

记CVE-2022-39227-Python-JWT漏洞

文章目录 前言影响版本漏洞分析Newstar2023 Week5总结 前言 在Asal1n师傅的随口一说之下&#xff0c;说newstar week5出了一道祥云杯一样的CVE&#xff0c;于是自己也是跑去看了一下&#xff0c;确实是自己不知道的一个CVE漏洞&#xff0c;于是就从这道题学习到了python-jwt库…

机器视觉 opencv 深度学习 驾驶人脸疲劳检测系统 -python 计算机竞赛

文章目录 0 前言1 课题背景2 Dlib人脸识别2.1 简介2.2 Dlib优点2.3 相关代码2.4 人脸数据库2.5 人脸录入加识别效果 3 疲劳检测算法3.1 眼睛检测算法3.2 打哈欠检测算法3.3 点头检测算法 4 PyQt54.1 简介4.2相关界面代码 5 最后 0 前言 &#x1f525; 优质竞赛项目系列&#x…

在MacBook上实现免费的PDF文件编辑

之前我想对PDF文件进行简单处理&#xff08;比如删页面、添空白页、调整页面顺序&#xff09;&#xff0c;要么是开wps会员【花钱贵】&#xff0c;下载&#xff08;盗版&#xff09;Adobe Acrobat【macOS不好下载】&#xff0c;要么用福昕阅览器登陆学生账号&#xff08;学校买…