【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 方法,来指定射线检测的类型。这样,只有当射线击中了多边形区域内的平面时,射线检测才会返回命中结果。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Spring Cloud+Uniapp 智慧工地云平台源码 智慧工地云平台AI视频分析应用

目录 AI应用与环境治理 设备管理与危大工程 塔吊安全监管 智慧工地APP端 智慧工地硬件设备 智慧工地主要功能模块 智慧工地可以通过以下几个方面为建筑行业赋能&#xff1a; 1.提高工程效率 2.提高工程安全性 3.提高工程质量 4.提高工程管理效率 绿色施工 质量管理…

Codeforces Round 924 (Div. 2) --- E. Modular Sequence ---- 题解

E. Modular Sequence&#xff1a; 题目描述&#xff1a; 思路解析&#xff1a; 这里第一个一定要需要填充x&#xff0c;然后后面每一位填充 ai-1 y 或者 ai-1 % y&#xff0c;那么其实相当于除了第一位固定&#xff0c;后面每一位都可以表现为 a ki * y&#xff1b;其中 a …

Python 基于 OpenCV 视觉图像处理实战 之 OpenCV 简单人脸检测/识别实战案例 之十二 简单人脸识别

Python 基于 OpenCV 视觉图像处理实战 之 OpenCV 简单人脸检测/识别实战案例 之十二 简单人脸识别 目录 Python 基于 OpenCV 视觉图像处理实战 之 OpenCV 简单人脸检测/识别实战案例 之十二 简单人脸识别 一、简单介绍 二、简单人脸识别实现原理 三、简单人脸识别案例实现简…

RAID 磁盘阵列及RAID配置实战

目录 一.RAID磁盘阵列介绍 二.常用的RAID磁盘阵列的介绍 1.RAID 0 &#xff08;条带化存储&#xff09; 2.RAID 1&#xff08;镜像存储&#xff09; 3.RAID 5 4.RAID 6 5.RAID 10&#xff08;先做镜像&#xff0c;再做条带&#xff09; 6.RAID 01 &#xff08;先做条带…

Java代码执行顺序

Java代码的执行顺序 后面大量的涉及到了static&#xff0c;我曾经写过一篇static的博客&#xff0c;可以看一眼 我上次写了static的加载顺序&#xff0c;没看过的可以进去看一眼 JavaSE&#xff1a;static关键字详解 ---------------------分割线-------------------------…

魔方网表 存在 mailupdate.jsp接口 任意文件上传漏洞

声明&#xff1a; 本文仅用于技术交流&#xff0c;请勿用于非法用途 由于传播、利用此文所提供的信息而造成的任何直接或者间接的后果及损失&#xff0c;均由使用者本人负责&#xff0c;文章作者不为此承担任何责任。 简介 魔方网表mailupdate.jsp接口存在任意文件上传漏洞 …

Jenkins配置windows/linux从节点

背景&#xff1a; 环境&#xff1a;jenkins环境&#xff08;Ubuntu&#xff09; 节点机器&#xff1a;Linux、Windows 前置条件&#xff1a; 节点机器&#xff1a;安装java、allure、python 1 Linux节点管理机器添加 1.1 系统管理->节点列表->New Node 1.2 节点配置…

Python --- 在python中安装NumPy,SciPy和Matplotlib(Windows平台)

在python中安装NumPy&#xff0c;SciPy和Matplotlib(Windows平台) NumPy NumPy是Python的一个最常用最基本的扩展程序库之一&#xff0c;主要用于矩阵运算或数组计算。很多其他的python库都要依赖于NumPy才能跑。 NumPy的发展史&#xff1a; Matrix-sig 1995年&#xff0c;特殊…

RabbitMQ - Spring boot 整合 RabbitMQ

一、RabbitMQ 1、RabbitMQ 使用场景 1.1、服务解耦 假设有这样一个场景, 服务A产生数据, 而服务B,C,D需要这些数据, 那么我们可以在A服务中直接调用B,C,D服务,把数据传递到下游服务即可 但是,随着我们的应用规模不断扩大,会有更多的服务需要A的数据,如果有几十甚至几百个下…

系统调优助手,PyTorch Profiler TensorBoard 插件教程

0x1. 前言 使用PyTorch Profiler进行性能分析已经一段时间了&#xff0c;毕竟是PyTorch提供的原生profile工具&#xff0c;个人感觉做系统性能分析时感觉比Nsys更方便一些&#xff0c;并且画的图也比较直观。这里翻译一下PyTorch Profiler TensorBoard Plugin的教程并分享一些…

SEO之搜索引擎的工作原理(三)

初创企业需要建站的朋友看这篇文章&#xff0c;谢谢支持&#xff1a;我给不会敲代码又想搭建网站的人建议 &#xff08;接上一篇。。。&#xff09; 排名 经过搜索引擎蜘蛛抓取页面&#xff0c;索引程序计算得到倒排索引后&#xff0c;搜索引擎就准备好可以随时处理用户搜索了…

基于Echarts的超市销售可视化分析系统(数据+程序+论文

本论文旨在研究Python技术和ECharts可视化技术在超市销售数据分析系统中的应用。本系统通过对超市销售数据进行分析和可视化展示&#xff0c;帮助决策层更好地了解销售情况和趋势&#xff0c;进而做出更有针对性的决策。本系统主要包括数据处理、数据可视化和系统测试三个模块。…

通义千问:官方开放API开发基础

目录 一、模型介绍 1.1主要模型 1.2 计费单价 二、前置条件 2.1 开通DashScope并创建API-KEY 2.2 设置API-KEY 三、基于DashScope SDK开发 3.1 Maven引入SDK 3.2 代码实现 3.3 运行代码 一、模型介绍 通义千问是由阿里云自主研发的大语言模型&#xff0c;用于理解和分…

JVM虚拟机(九)如何开启 GC 日志

目录 一、引言二、开启 GC 日志三、解析 GC 日志四、优化建议 一、引言 在 Java 应用程序的运行过程中&#xff0c;垃圾收集&#xff08;Garbage Collection&#xff0c;简称 GC&#xff09;是一个非常重要的环节。GC 负责自动管理内存&#xff0c;回收不再使用的对象所占用的…

贵阳市人民政府副市长刘岚调研珈和科技

4月9日&#xff0c;贵阳市人民政府副市长、党组成员刘岚一行到珈和科技走访调研&#xff0c;珈和科技总经理冷伟热情接待了考察团&#xff0c;就企业算力需求与合作&#xff0c;特色产业园区建设&#xff0c;科技成果转化落地等方面进行深入交流。 贵阳市教育局局长李波&#…

智能商品计划系统如何提升鞋服零售品牌的竞争力

国内鞋服零售企业经过多年的发展&#xff0c;已经形成了众多知名品牌&#xff0c;然而近年来一些企业频频受到库存问题的困扰&#xff0c;这一问题不仅影响了品牌商自身&#xff0c;也给长期合作的经销商带来了困扰。订货会制度在初期曾经有效地解决了盲目生产的问题&#xff0…

Vue加载glb / gltf模型(如何在vue中使用Three.js,vue使用threejs加载glb模型)

简介&#xff1a;Three.js 是一个用于在 Web 上创建和显示 3D 图形的 JavaScript 库。它提供了丰富的功能和灵活的 API&#xff0c;使开发者可以轻松地在网页中创建各种 3D 场景、模型和动画效果。可以用来展示产品模型、建立交互式场景、游戏开发、数据可视化、教育和培训等等…

RISC-V微架构验证

对于RISC-V处理器因其灵活性和可扩展性而受到广泛关注&#xff0c;但如果没有高效验证策略&#xff0c;错误的设计实现可能会影响RISC-V的继续推广。 在RISC-V出现之前&#xff0c;对于大多数半导体公司来说&#xff0c;处理器验证几乎成为一门屠龙之技。专业知识被浓缩到少数几…

基于afx透明视频的视觉增强前端方案

作者 | 青玉 导读 本文介绍了增长前端团队自研的Webview框架下透明视频视觉增强方案&#xff0c;该方案在保证对视觉进行高度还原的同时可投入更少的开发成本&#xff0c;还能获得更优的前端性能表现。文章首先分析了市面上动画方案的优缺点&#xff0c;然后详细介绍了透明视频…

stm32实现hid鼠标

启动CubelMX 选择芯片&#xff08;直接输入stm32f103zet6) 设置时钟 如下图 usb设置 配置usb设备 调试端口设置 配置时钟 项目输出设置 打开工程&#xff08;后记&#xff1a;此工程含有中文不能编译通过) 配置项目 配置调试器 编译无法通过 删除路径中的中文&#xff0c;以及…