【ARFoundation学习笔记】射线检测

2023-11-07 13:52

本文主要是介绍【ARFoundation学习笔记】射线检测,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

在这里插入图片描述


写在前面的话

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


文章目录

  • 射线检测
    • 射线检测概念
  • 小结


射线检测

射线检测是Unity中常见的一种物理检测方法,具体就不赘述了。除了Unity提供的Physics.Raycast()方法进行射线检测外,AR foundation还提供了AR RaycastManager组件专门用于AR中处理射线与平面、特征点的碰撞检测。

射线检测概念

射线检测通常用于在二维的屏幕上进行三维的物体检测,其简单原理就是从起始点向某一方向发射一条无限长的射线,这条射线一旦与物体的碰撞器接触就会触发检测事件。
在这里插入图片描述

假设要实现在手机屏幕上点击到AR plane之后,在对应位置产生一个小圆球(这就是第一章中使用到的案例),最好的方案就是射线检测。我们将摄像头的位置设置为初始点,而手指在屏幕上点击的位置视为基准点,构建一条穿过二点的射线,这条射线将触碰到其位置上的所有虚拟物体。往往射线检测的触发结果是从初始点开始触碰到的第一个物体。请看下述代码:

1using System.Collections.Generic;
2using UnityEngine;
3using UnityEngine.XR.ARFoundation;
4using UnityEngine.XR.ARSubsystems;
56[RequireComponent(typeof(ARRaycastManager))]
7public class AppControler : MonoBehaviour
8{
9public  GameObject spawnPrefab;
10static List<ARRaycastHit> Hits;
11private ARRaycastManager mRaycastManager;
12private GameObject spawnedObject = null;
13private void Start()
14{
15.       Hits = new List<ARRaycastHit>();
16.       mRaycastManager = GetComponent<ARRaycastManager>();
17}
1819void Update()
20{
21if (Input.touchCount == 0)
22return;
23var touch = Input.GetTouch(0);
24if (mRaycastManager.Raycast(touch.position, Hits, TrackableType.PlaneWithin  Polygon | TrackableType.PlaneWithinBounds))
25{
26var hitPose = Hits[0].pose;
27if (spawnedObject == null)
28{
29.             spawnedObject = Instantiate(spawnPrefab, hitPose.position, hitPose.rotation);
30}
31else
32{
33.             spawnedObject.transform.position = hitPose.position;
34}
35}
36}
37}

在上述代码中,Hits是一个ARRaycastHitList,它保存了所有射线Hit到的物体的信息。当触发点击事件时,mRaycastManager.Raycast从摄像头发射一条向着touch.position的射线,并返回所有触碰到的虚拟物体的姿态信息给Hits,并且设置了检测的可跟踪对象为TrackableType.PlaneWithinPolygon | TrackableType.PlaneWithinBounds(平面上的多边形或者平面带边界的平面包围盒,也就是摄像机内渲染出的可视化平面),并使用第一个检测到的平面物体的姿态信息Hits[0].pose来初始化预制体。

在ARFoundation中,目前射线检测只能用来检测平面和点云。ARFoundation中的射线检测与Unity中Physics模块使用的射线检测相似,但提供了独立的接口,在ARFoundation中使用射线检测需要ARRaycastManager组件,因为射线检测与被检测物体需要在同一个坐标空间中,所以该组件需要挂载在ARSessionOrigin对象上。
————————————————
版权声明:本文为CSDN博主「DavidWang」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/yolon3000/article/details/94458183

射线检测方法说明
public bool Raycast(Vector2 screenPoint, List hitResults, TrackableType trackableTypeMask = TrackableType.All)参数1为屏幕坐标点,参数2为所有与射线发生碰撞的对象列表,参数3为Trackable类型掩码(即只对该类或几类可跟踪对象进行射线检测),该方法的返回值为Bool型,true表示发生碰撞,false表示未发生碰撞。
public bool Raycast(Vector2 screenPoint, List hitResults, TrackableType trackableTypeMask = TrackableType.All)参数1为Ray类型的射线(包括位置与方向),参数2为所有与射线发生碰撞的对象列表,参数3为Trackable类型掩码(即只对该类或几类可跟踪对象进行射线检测),该方法的返回值为Bool型,true表示发生碰撞,false表示未发生碰撞。

trackableTypeMask 用来过滤需要进行碰撞检测的对象类型,Trackable类型其值可以是以下属性值的一个,也可以是几个,如果是几个,可以采用按位或,如TrackableType.PlaneWithinPolygon | TrackableType.FeaturePoint。

trackableType 属性说明
All这个值用于与放置的所有物体发生碰撞检测。如果我们填写这个值,那么在ARFoundation中,我们发射的射线将与场景中的所有平面、包围多边形、带法线的特征点进行碰撞检测。
FeaturePoint与当前帧点云中所有的特征点进行碰撞检测。
None此值用来表示trackableHit返回中没有碰撞发生,如果将此值传递给raycast,则不会得到任何碰撞结果。
PlaneWithinPolygon与已检测平面内的凸边界多边形进行碰撞检测。
PlaneWithinBounds与当前帧中已检测平面内的包围盒进行碰撞检测。
PlaneWithinInfinity与已检测到的平面进行碰撞检测,但这个检测不仅仅局限于包围盒或者多边形,而是可以与已检测到的平面的延展平面进行碰撞检测。
FeaturePointWithSurfaceNormal射线与评估平面进行碰撞检测,评估平面不一定能形成一个平面。
Planes射线与以上所有平面类型进行碰撞检测。
Image与2D图像进行射线检测。
Face与人脸进行射线检测。

ARRaycastHit类保存的是发生碰撞时检测到的碰撞体相关信息,其主要属性如下表所示。

ARRaycastHit 属性说明
Distancefloat类型,获取从射线源到命中点的距离
trackableId发生碰撞的可跟踪对象ID。
PosePose类型,获取射线击中的物体在Unity世界坐标中的姿态。
hitTypeTrackable类型,获取命中的可跟踪对象,即前文所述的七种可跟踪类型之一(实际上,目前ARFoundation只能对平面与特征点做射线检测)。
sessionRelativeDistance在Session空间中从射线起点到碰撞点的距离。
sessionRelativePose在Session空间碰撞点的姿态。

小结

使用AR RaycastHit可以用来专门处理AR空间中的射线检测信息。由于姿态信息都保存在了AR Session Rigion组件上,因此AR Raycast Manager也要挂载在该对象上。

AR RaycastHit可以获取到三维空间上所有的射线触碰到的姿态信息。我们总结了两个射线检测方法以及其参数信息,使用射线检测来实现一些基本的功能。
(作者本人的博客比官方文档写的详细多了)

这篇关于【ARFoundation学习笔记】射线检测的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/364063

相关文章

Python如何实现PDF隐私信息检测

《Python如何实现PDF隐私信息检测》随着越来越多的个人信息以电子形式存储和传输,确保这些信息的安全至关重要,本文将介绍如何使用Python检测PDF文件中的隐私信息,需要的可以参考下... 目录项目背景技术栈代码解析功能说明运行结php果在当今,数据隐私保护变得尤为重要。随着越来越多的个人信息以电子形

Java深度学习库DJL实现Python的NumPy方式

《Java深度学习库DJL实现Python的NumPy方式》本文介绍了DJL库的背景和基本功能,包括NDArray的创建、数学运算、数据获取和设置等,同时,还展示了如何使用NDArray进行数据预处理... 目录1 NDArray 的背景介绍1.1 架构2 JavaDJL使用2.1 安装DJL2.2 基本操

SpringBoot使用Apache Tika检测敏感信息

《SpringBoot使用ApacheTika检测敏感信息》ApacheTika是一个功能强大的内容分析工具,它能够从多种文件格式中提取文本、元数据以及其他结构化信息,下面我们来看看如何使用Ap... 目录Tika 主要特性1. 多格式支持2. 自动文件类型检测3. 文本和元数据提取4. 支持 OCR(光学

HarmonyOS学习(七)——UI(五)常用布局总结

自适应布局 1.1、线性布局(LinearLayout) 通过线性容器Row和Column实现线性布局。Column容器内的子组件按照垂直方向排列,Row组件中的子组件按照水平方向排列。 属性说明space通过space参数设置主轴上子组件的间距,达到各子组件在排列上的等间距效果alignItems设置子组件在交叉轴上的对齐方式,且在各类尺寸屏幕上表现一致,其中交叉轴为垂直时,取值为Vert

Ilya-AI分享的他在OpenAI学习到的15个提示工程技巧

Ilya(不是本人,claude AI)在社交媒体上分享了他在OpenAI学习到的15个Prompt撰写技巧。 以下是详细的内容: 提示精确化:在编写提示时,力求表达清晰准确。清楚地阐述任务需求和概念定义至关重要。例:不用"分析文本",而用"判断这段话的情感倾向:积极、消极还是中性"。 快速迭代:善于快速连续调整提示。熟练的提示工程师能够灵活地进行多轮优化。例:从"总结文章"到"用

【前端学习】AntV G6-08 深入图形与图形分组、自定义节点、节点动画(下)

【课程链接】 AntV G6:深入图形与图形分组、自定义节点、节点动画(下)_哔哩哔哩_bilibili 本章十吾老师讲解了一个复杂的自定义节点中,应该怎样去计算和绘制图形,如何给一个图形制作不间断的动画,以及在鼠标事件之后产生动画。(有点难,需要好好理解) <!DOCTYPE html><html><head><meta charset="UTF-8"><title>06

学习hash总结

2014/1/29/   最近刚开始学hash,名字很陌生,但是hash的思想却很熟悉,以前早就做过此类的题,但是不知道这就是hash思想而已,说白了hash就是一个映射,往往灵活利用数组的下标来实现算法,hash的作用:1、判重;2、统计次数;

综合安防管理平台LntonAIServer视频监控汇聚抖动检测算法优势

LntonAIServer视频质量诊断功能中的抖动检测是一个专门针对视频稳定性进行分析的功能。抖动通常是指视频帧之间的不必要运动,这种运动可能是由于摄像机的移动、传输中的错误或编解码问题导致的。抖动检测对于确保视频内容的平滑性和观看体验至关重要。 优势 1. 提高图像质量 - 清晰度提升:减少抖动,提高图像的清晰度和细节表现力,使得监控画面更加真实可信。 - 细节增强:在低光条件下,抖

零基础学习Redis(10) -- zset类型命令使用

zset是有序集合,内部除了存储元素外,还会存储一个score,存储在zset中的元素会按照score的大小升序排列,不同元素的score可以重复,score相同的元素会按照元素的字典序排列。 1. zset常用命令 1.1 zadd  zadd key [NX | XX] [GT | LT]   [CH] [INCR] score member [score member ...]

【机器学习】高斯过程的基本概念和应用领域以及在python中的实例

引言 高斯过程(Gaussian Process,简称GP)是一种概率模型,用于描述一组随机变量的联合概率分布,其中任何一个有限维度的子集都具有高斯分布 文章目录 引言一、高斯过程1.1 基本定义1.1.1 随机过程1.1.2 高斯分布 1.2 高斯过程的特性1.2.1 联合高斯性1.2.2 均值函数1.2.3 协方差函数(或核函数) 1.3 核函数1.4 高斯过程回归(Gauss