【ARFoundation自学01】搭建AR框架,检测平面点击位置克隆物体

本文主要是介绍【ARFoundation自学01】搭建AR框架,检测平面点击位置克隆物体,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

Unity开发ARFoundation相关应用首先安装ARFoundation包

然后设置XR

1.基础AR场景框架搭建

2.一个基本的点击克隆物体到识别的平面脚本

挂在XROrigin上

脚本AppController 脚本说明书

## 业务逻辑

`AppController` 脚本旨在实现一个基本的 AR 应用程序功能:用户通过触摸屏幕选择位置,然后在这个位置上克隆并放置一个预制的游戏对象。这个功能在 AR 应用程序中很常见,例如在游戏、教育或设计应用程序中,用户可以在现实世界的位置上放置虚拟物体。

代码:

using JetBrains.Annotations;
using System.Collections;
using System.Collections.Generic;
using Unity.VisualScripting;
using UnityEngine;
using UnityEngine.XR.ARFoundation;
using UnityEngine.XR.ARSubsystems;[RequireComponent(typeof(ARRaycastManager))]//当你在脚本中使用 [RequireComponent] 属性时,Unity编辑器会在编辑模式下自动检查并确保该组件存在于游戏对象上。如果该组件不存在,Unity会提示你添加它。这有助于避免在运行时出现错误,因为如果脚本依赖于某个组件,而该组件没有出现在游戏对象上,那么在游戏运行时尝试访问该组件的任何尝试都会导致错误或异常。
public class AppController : MonoBehaviour
{// 主要实现了用户点击位置,克隆游戏物体//1.获取用户点击位置,发射射线,碰撞到平面,返回坐标,克隆物体在此public GameObject OnePrefab;//将来被克隆放置的预制体static List<ARRaycastHit> ManyHits;//存储很多个 撞击物体后的相关信息private ARRaycastManager OneRaycastManager;//存储射线发射器组件private GameObject TempObj = null;//用户点击地面后!存储克隆在地面上被放置的物体void Start(){ManyHits = new List<ARRaycastHit>();//声明投射OneRaycastManager = this.gameObject.GetComponent<ARRaycastManager>();//获取脚本所在物体的ARRaycastManager组件}// 获取用户点击行为,void Update(){if (Input.touchCount == 0)//如果点击0{return;}// 获取第一个触摸点的信息Touch OneTouch = Input.GetTouch(0);//获取第一个触摸点//开始声明射线然后投射出去,物理引擎是用physic.Raycast。这里用ARRaycastManager投射,就像人扔东西一样//一边发射一边判断是否射中平面if (OneRaycastManager.Raycast(OneTouch.position, ManyHits, TrackableType.PlaneWithinPolygon | TrackableType.PlaneWithinBounds)){//AR射线管理器组件向触摸点的位置发射一根射线并且击中平面,射线追踪类型为虚拟多边形平面目标类型Debug.Log("射线发射成功, /射线击中了边界内的平面开始处理命中结果");Pose FirstHitPose = ManyHits[0].pose;//存储第一个击中目标信息,包括对方名字、交叉点坐标//开始克隆if (TempObj == null){TempObj = GameObject.Instantiate(OnePrefab, FirstHitPose.position, FirstHitPose.rotation);}else{TempObj.transform.position = FirstHitPose.position;}//为了防止重复点击,重复克隆,可以判断TempObj 是不是空}}
}

## 程序逻辑

1. **组件依赖**:
   - 脚本使用 `[RequireComponent(typeof(ARRaycastManager))]` 属性来确保游戏对象上存在 `ARRaycastManager` 组件。这个组件是 AR Foundation 的一部分,用于处理射线检测和跟踪。

2. **变量声明**:
   - `OnePrefab` 是一个公共变量,用于存储将要被克隆的预制体。
   - `ManyHits` 是一个静态列表,用于存储射线检测的结果。
   - `OneRaycastManager` 是 `ARRaycastManager` 类型的变量,用于存储获取到的 `ARRaycastManager` 组件。
   - `TempObj` 是一个 `GameObject` 类型的变量,用于存储克隆后放置在地面上的物体。

3. **初始化**:
   - 在 `Start` 方法中,脚本初始化 `ManyHits` 列表,并获取 `ARRaycastManager` 组件。

4. **射线检测与克隆**:
   - 在 `Update` 方法中,脚本首先检查是否有触摸事件发生(`Input.touchCount`)。
   - 如果有触摸事件,脚本获取第一个触摸点的信息,并使用 `OneRaycastManager` 进行射线检测。
   - 如果射线检测成功击中平面(`TrackableType.PlaneWithinPolygon | TrackableType.PlaneWithinBounds`),脚本将获取第一个命中点的 `Pose`。
   - 脚本随后检查 `TempObj` 是否为空。如果是空的,意味着这是第一次点击,脚本将实例化一个新的游戏对象并放置在命中点位置。
   - 如果 `TempObj` 不为空,脚本将更新其位置到新的命中点。

## 核心算法介绍

1. **射线检测**:
   - `ARRaycastManager.Raycast` 方法用于从用户触摸点发射射线,并检测射线是否击中了 AR 场景中的平面。
   - 射线检测的类型由 `TrackableType` 参数指定,这里使用了 `PlaneWithinPolygon` 和 `PlaneWithinBounds` 来限制射线只检测用户定义的特定平面区域。

2. **克隆与放置**:
   - 脚本使用 `GameObject.Instantiate` 方法来克隆预制体,并使用 `Pose` 来设置克隆物体的位置和旋转。
   - 通过检查 `TempObj` 的状态,脚本确保用户不会重复克隆物体,除非之前的克隆物体被移除或销毁。

## 使用说明

- 将 `AppController` 脚本附加到一个游戏对象上,并确保该游戏对象上有 `ARRaycastManager` 组件。
- 在 Unity 编辑器中,将你希望克隆的预制体拖拽到 `OnePrefab` 变量上。
- 运行应用程序,通过触摸屏幕来选择位置并放置克隆的物体。

## 注意事项

- 确保你的 AR 设备或模拟器已经正确设置并支持 AR Foundation。
- 调整射线检测的类型和参数,以适应你的应用程序需求。
- 如果需要限制克隆物体的数量,可以添加额外的逻辑来管理 `TempObj` 的生命周期。

TrackableType.PlaneWithinPolygon 是什么意思

TrackableType.PlaneWithinPolygon 是 Unity AR Foundation 中的一个枚举值,用于指定射线检测(Raycast)的目标类型。这个枚举值是 TrackableType 的一个成员,它定义了射线检测可以击中的跟踪目标类型。

在 AR 应用中,平面(Plane)是指由 AR 系统识别的环境表面,通常是水平或垂直的表面,如地板、墙壁或桌面。PlaneWithinPolygon 特指那些被定义为多边形边界内的平面。这意味着射线检测将只寻找并返回位于用户定义的多边形区域内的平面。

使用 TrackableType.PlaneWithinPolygon 可以限制射线检测的结果,使其只返回特定区域内的平面,这对于某些特定的 AR 场景和交云操作非常有用。例如,你可能只想在用户放置的特定区域(如一个虚拟房间的地面上)进行交互,而不是任何可见的平面。

在实际使用中,你可以将 TrackableType.PlaneWithinPolygon 作为参数传递给 ARRaycastManager.Raycast 方法,来指定射线检测的类型。这样,只有当射线击中了多边形区域内的平面时,射线检测才会返回命中结果。

这篇关于【ARFoundation自学01】搭建AR框架,检测平面点击位置克隆物体的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

Python pandas库自学超详细教程

《Pythonpandas库自学超详细教程》文章介绍了Pandas库的基本功能、安装方法及核心操作,涵盖数据导入(CSV/Excel等)、数据结构(Series、DataFrame)、数据清洗、转换... 目录一、什么是Pandas库(1)、Pandas 应用(2)、Pandas 功能(3)、数据结构二、安

Python极速搭建局域网文件共享服务器完整指南

《Python极速搭建局域网文件共享服务器完整指南》在办公室或家庭局域网中快速共享文件时,许多人会选择第三方工具或云存储服务,但这些方案往往存在隐私泄露风险或需要复杂配置,下面我们就来看看如何使用Py... 目录一、android基础版:HTTP文件共享的魔法命令1. 一行代码启动HTTP服务器2. 关键参

Python Web框架Flask、Streamlit、FastAPI示例详解

《PythonWeb框架Flask、Streamlit、FastAPI示例详解》本文对比分析了Flask、Streamlit和FastAPI三大PythonWeb框架:Flask轻量灵活适合传统应用... 目录概述Flask详解Flask简介安装和基础配置核心概念路由和视图模板系统数据库集成实际示例Stre

Olingo分析和实践之OData框架核心组件初始化(关键步骤)

《Olingo分析和实践之OData框架核心组件初始化(关键步骤)》ODataSpringBootService通过初始化OData实例和服务元数据,构建框架核心能力与数据模型结构,实现序列化、URI... 目录概述第一步:OData实例创建1.1 OData.newInstance() 详细分析1.1.1

Linux系统性能检测命令详解

《Linux系统性能检测命令详解》本文介绍了Linux系统常用的监控命令(如top、vmstat、iostat、htop等)及其参数功能,涵盖进程状态、内存使用、磁盘I/O、系统负载等多维度资源监控,... 目录toppsuptimevmstatIOStatiotopslabtophtopdstatnmon

Spring 框架之Springfox使用详解

《Spring框架之Springfox使用详解》Springfox是Spring框架的API文档工具,集成Swagger规范,自动生成文档并支持多语言/版本,模块化设计便于扩展,但存在版本兼容性、性... 目录核心功能工作原理模块化设计使用示例注意事项优缺点优点缺点总结适用场景建议总结Springfox 是

springboot项目打jar制作成镜像并指定配置文件位置方式

《springboot项目打jar制作成镜像并指定配置文件位置方式》:本文主要介绍springboot项目打jar制作成镜像并指定配置文件位置方式,具有很好的参考价值,希望对大家有所帮助,如有错误... 目录一、上传jar到服务器二、编写dockerfile三、新建对应配置文件所存放的数据卷目录四、将配置文

python3如何找到字典的下标index、获取list中指定元素的位置索引

《python3如何找到字典的下标index、获取list中指定元素的位置索引》:本文主要介绍python3如何找到字典的下标index、获取list中指定元素的位置索引问题,具有很好的参考价值,... 目录enumerate()找到字典的下标 index获取list中指定元素的位置索引总结enumerat

C++ 检测文件大小和文件传输的方法示例详解

《C++检测文件大小和文件传输的方法示例详解》文章介绍了在C/C++中获取文件大小的三种方法,推荐使用stat()函数,并详细说明了如何设计一次性发送压缩包的结构体及传输流程,包含CRC校验和自动解... 目录检测文件的大小✅ 方法一:使用 stat() 函数(推荐)✅ 用法示例:✅ 方法二:使用 fsee

如何使用Haporxy搭建Web群集

《如何使用Haporxy搭建Web群集》Haproxy是目前比较流行的一种群集调度工具,同类群集调度工具有很多如LVS和Nginx,本案例介绍使用Haproxy及Nginx搭建一套Web群集,感兴趣的... 目录一、案例分析1.案例概述2.案例前置知识点2.1 HTTP请求2.2 负载均衡常用调度算法 2.