【ARFoundation自学01】搭建AR框架+检测平面+点击克隆立方体到地面=自信入门!

介绍

AR 的功能其实是个大手机系统厂商和眼镜设备厂商开发的功能,并不是Unity的功能,毕竟Unity没有自己的手机设备!比如谷歌公司的安卓开发了ARcore,让所有安卓8.0版本以上的用户能够在手机上体验AR功能!苹果推出了ARKit,让苹果用户能够在苹果手机上体验AR,还有一些眼镜厂商开发了相关的底层AR功能,比如微软Hololens2 苹果的VisionPro,magic leap!都在底层支持了AR!具体如下:

  1. ARCore 是由 Google 开发的,用于 Android 设备的增强现实平台。它允许开发者为 Android 设备创建增强现实应用。根据搜索结果678,ARCore 利用手机的摄像头和传感器来感知环境,并通过运动跟踪、环境理解、光照估计等技术,将虚拟内容与现实世界相结合。此外,ARCore 还支持增强图像(Augmented Images)、云锚点(Cloud Anchors)等功能,为用户带来更加丰富的AR体验。

  2. ARKit 是 Apple 推出的增强现实开发平台,专门用于 iOS 设备。根据搜索结果123,ARKit 经过多次迭代,提供了从简单的平面跟踪到人体追踪等丰富的功能。ARKit 2 引入了共享体验、持久增强现实体验、物体检测和图像追踪等功能,使得开发者能够创建更加生动和逼真的AR体验。

  3. 除了手机系统厂商,一些眼镜设备厂商也在开发底层的AR功能。例如,微软的 HoloLens 2 是一款混合现实(MR)设备,它通过先进的传感器和摄像头,为用户提供沉浸式的AR体验。而苹果的 VisionPro(如果指的是 Apple 的智能眼镜项目,目前尚未发布具体产品,因此可能是指未来或概念性产品)和 magic leap(一家AR眼镜公司,虽然与 Apple 无关,但也是AR领域的知名厂商)也在进行相关技术的研发。

  4. 还有华为手机的华为AR Engine

但是,我们开发AR不能学习那么多平台的底层开发工具去开发不同的平台!太累了!Unity作为带头大哥,干脆一口气在他们的底层基础上开发了一个让用户只需要在Unity写C# 就可以发布AR产品,走到哪里调用哪里的AR底层实现AR功能!自由穿梭在ARCore、ARKit、VisionPro、HoloLens 2、 magic leap之间,到哪里就用哪里的底层AR功能!这个面向用户的开发包就叫:

ARFoundation!

今天学第一课,Unity开发ARFoundation相关应用搭建ARFoundation框架!

1.首先安装ARFoundation包

包管理器,选择UnityRegistry-找到ARfoundation,下载导入!

2.然后设置XR

选择你未来发布到的使用设备平台,勾选对应底层插件!

我这里选择了安卓!

如果是URP渲染模式的场景,还需要在Graphics选择XR渲染管线设置!

3.基础AR场景框架搭建

3.1 创建老祖宗ARsession

右键创建XR-选择ARsession(每个工程都需要有它,他就像总管理,负责通信于不同设备底层AR框架,以及AR生命周期、管理调用底层设备的不同追踪功能)

创建完毕后就静静的放在这里。

3.2  创建XR Origin(老版本叫ARsession Origin)

哇!这个是虚拟世界通往现实世界的桥梁,奈何桥!负责把Unity中的虚拟物体坐标转换为现实世界的坐标!也是UnityAR摄像机所被管理的地方!

想象一下,AR Session Origin 就像是一位舞者在舞台上的位置和动作的记录员。在增强现实中,我们的虚拟世界(就像舞者)需要在现实世界(舞台)中找到自己的位置并进行表演。AR Session Origin 就是确保虚拟舞者能够准确地在现实世界的舞台上找到自己的位置,并根据舞台的大小和布局调整自己的动作。

  1. 空间转换:就像舞者需要知道自己在舞台上的哪个位置,AR Session Origin 帮助虚拟物体理解自己在现实世界中的具体位置。它是一个参考点,告诉虚拟物体:“这是你的起始点,现在根据这个点来定位自己。”

  2. 管理虚拟相机:想象一下,AR Session Origin 是一位导演,它指挥着虚拟相机,告诉它应该在哪里放置,以便捕捉到最佳的视角和画面。这样,无论舞者在舞台上如何移动,相机都能跟随并记录下每一个动作。

  3. 应用变换和缩放:如果舞台突然变大或变小,舞者需要调整自己的动作和表演范围。AR Session Origin 通过缩放和变换来告诉虚拟物体,现实世界的舞台现在是怎样的,你需要如何调整自己以适应这个新的舞台。

  4. 维护跟踪数据:AR Session Origin 就像是一位记录员,它记录下舞者在舞台上的每一个动作和位置变化,确保虚拟物体能够准确地反映现实世界中的动态。

  5. 定义原点位置:在表演开始之前,舞者需要知道舞台的中心点在哪里,这样他们才能围绕这个点进行表演。AR Session Origin 就是这个中心点,它定义了虚拟物体在现实世界中的起始位置。

3.3 创建一个虚拟的美术模板来标记识别到的地面!AR Default Plane

继续右键XR-AR Default Plane 

这其实就是个美术资源,识别到地面以后,我们用一个网格标记出来,让用户知道地面被识别的!

因此我们创建它是需要把它做成预制体将来赋值给专门识别地面的脚本!

拖到Asset仓库生产预制体,然后场景的AR Default Plane 就可以删除了!

3.4 添加一个用于识别平面的功能性脚本组件!给XR Origin(老版本叫ARsession Origin)

记住:组件即功能!孙悟空72变就像他有了72个不同组件!这是UNITY的软件逻辑!

给XR Origin(老版本叫ARsession Origin)右边添加组件,搜AR Plane Manager! 添加完毕!

他只有一个变量,就是需要一个漂亮的3D美术图标记将来我识别到的地面!就是3.3 我们设置好的!

3.5 到这里框架搭建完毕! 到这里框架搭建完毕!发布出去就可以识别地面了!

4  自己写个脚本!实现在地面上点击克隆一个3D立方体!

这个脚本写好之后 挂在XROrigin上

4.1脚本AppController 脚本业务逻辑

业务逻辑

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

4.2 AppController 脚本代码:

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 是不是空}}
}

4.3 代码的程序逻辑

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` 不为空,脚本将更新其位置到新的命中点。

4.4 核心算法介绍

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

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

## 使用说明

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

## 注意事项

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

4.5 什么是TrackableType.PlaneWithinPolygon 

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

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

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

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

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

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

相关文章

2024红明谷杯——Misc 加密的流量

2024红明谷杯——Misc 加密的流量 写在前面&#xff1a; 这里是贝塔贝塔&#xff0c;照例来一段闲聊 打比赛但赛前一波三折&#xff0c;又是成功签到的一个比赛 说起来比赛全名叫红明谷卫星应用数据安全场景赛&#xff0c;但好像真的跟卫星的关系不大&#xff0c;没有bin方…

深入探索Python中的推导式:从列表到字典,全面解析数据结构的快速构建方法

文章目录 1. 列表推导式&#xff1a;快速构造列表1.1 基础用法1.2 条件筛选 2. 字典推导式&#xff1a;动态构建字典2.1 基础用法2.2 使用条件过滤 3. 集合推导式&#xff1a;有效去重与数据筛选3.1 基本语法与应用3.2 去重和转换3.2 使用条件过滤 4. 生成器推导式&#xff1a;…

基于CH32V103的多功能推杆设计

一、项目简介 “创意源于生活&#xff0c;工具始于懒惰。” 整体造型外观参考了最近比较火的夫妻游戏《双人成行》第一关里面那个吸尘器的推杆开关&#xff0c;结构中采用阻尼器/滚珠轴承等器件&#xff0c;使其非常具有质感和手感。功能上我构思不能只有电脑开关这么简单地一…

Jenkins CI/CD 持续集成专题三 Jenkins 使用shell脚本打包组件配置流程

第一步 新建任务 第二步 输入项目名称和选择自由风格的软件项目点击确定 第三步 配置下项目地址和账号密码 第四步 配置 build steps 选择 shell 脚本 第五步 shell 配置 &#xff08;注意shell 必须以#!/bin/sh开头&#xff0c;否则会报 找不到shell 命令的错&#xff09; …

【Web】DASCTF X CBCTF 2022九月挑战赛 题解

目录 dino3d Text Reverser cbshop zzz_again dino3d 进来是一个js小游戏 先随便玩一下&#xff0c;显示要玩够1000000分 直接console改分数会被检测 先是JSFinder扫一下&#xff0c;扫出了check.php 到js里关键词索引搜索check.php 搜索sn&#xff0c;发现传入的参数是…

3-羟基丙酸(3-HP)应用前景广阔 生物基3-羟基丙酸市场占比将不断提升

3-羟基丙酸&#xff08;3-HP&#xff09;应用前景广阔 生物基3-羟基丙酸市场占比将不断提升 合成技术是制约3-羟基丙酸规模化应用的重要因素。3-羟基丙酸合成技术包括化学合成法、生物合成法两大类&#xff0c;其中化学合成法是主流生产工艺&#xff0c;但化学合成法存在工艺复…

.netcore+vue新生分班系统的设计与实现

.netcore vue新生分班系统的设计与实现说明文档 运行前附加数据库.mdf&#xff08;或sql生成数据库&#xff09; 主要技术&#xff1a; 基于.net core架构和mysql数据库vue 东北石油大学新生分班系统的设计与实现 功能模块&#xff1a; 登录 注册学生 忘记密码 系统首顶 个…

完成学校官网页面制作

<!DOCTYPE html> <html lang"en"> <head> <meta charset"UTF-8"> <title>教务系统</title> <style> .wap{ margin:0 auto; width:955px; } .top{ height:150px; padding-left:85px; …

DHCP服务器配置故障转移后显示红色箭头、与伙伴服务器失去联系的解决方案

一、遇到的故障现象&#xff1a; &#xff08;主DHCP服务器与备用DHCP服务器连通性正常&#xff0c;在故障转移选项卡上却显示与伙伴失去联系、伙伴关闭&#xff0c;且ipv4协议旁边显示一个红色的小箭头&#xff09;&#xff0c;正常情况下是绿色 &#xff08;一&#xff09;…

外包干了6天,技术明显退步。。。

我是一名大专生&#xff0c;自19年通过校招进入湖南某软件公司以来&#xff0c;便扎根于功能测试岗位&#xff0c;一晃便是近四年的光阴。今年3月&#xff0c;我如梦初醒&#xff0c;意识到长时间待在舒适的环境中&#xff0c;已让我变得不思进取&#xff0c;技术停滞不前。更令…

金三银四面试题(二十):单例模式知多少?

设计模式也是面试中的热门考题&#xff0c;基本这个部分都是问问你知不知道XXX设计模式&#xff0c;有什么用&#xff0c;优缺点&#xff0c;然后再现场手写一个demo。很多时候是和spring一起考的&#xff0c;问问你知不知道spring框架用了哪些设计模式。今天我们来先看看单例模…

代码+视频,R语言对数据进行多重插补后回归分析

我们在临床做回顾性研究分析中经常要面对数据缺失的问题&#xff0c;如果数据缺失量大就会对我们的研究结果产生影响&#xff0c;近年来&#xff0c;对数据进行多重插补广泛应用于SCI论文中。我们在之前的文章中已经演示了使用SPSS对数据进行多重插补并分析。今天&#xff0c;我…

贪吃蛇的简单实现(c语言)

前言&#xff1a;学完了C语言的基础语法&#xff0c;和一点数据结构的知识&#xff0c;拿贪吃蛇来练练手&#xff0c;并熟悉以前的知识。写完之后&#xff0c;有一种成就感&#xff0c;为以后的学习饱满激情。 注意这里的讲解是由部分到整体的思路。 目录 控制台不能是终端&am…

ubuntu环境下使用g++把c++编译成汇编语言(暂时)

1. 引言 为了深入理解c&#xff0c;决定学习一些简单的汇编语言。使用ubuntu系统下g很容易将一个c的文件编译成汇编语言。本文使用此方法&#xff0c;对一个简单的c文件编译成汇编语言进行理解。 2.示例 文件名&#xff1a;reorder_demo.cpp #include<stdio.h>typede…

逻辑回归+分类的评估方式

一&#xff1a;什么是逻辑回归 解决二分类问题 二&#xff1a;损失及优化 三&#xff1a;逻辑回归API 四&#xff1a;案例 五&#xff1a;分类的评估方式 评估公式 分类评估API ROC与AUC&#xff08;介绍API&#xff09;衡量不平衡样本 ROC曲线的绘制 分类中解决类别不平衡

HackmyVM-----Boxing靶机

文章目录 正常打靶流程1.获取靶机IP地址2.获取靶机端口服务3.访问网页4.添加域名WindowsLinux 5.访问域名6.nc反弹shell 7.结束 正常打靶流程 1.获取靶机IP地址 ┌──(root㉿kali)-[/home/kali] └─# arp-scan -l Interface: eth0, type: EN10MB, MAC: 00:0c:29:10:3c:9b, …

Drive Scope for Mac:硬盘健康监测分析工具

Drive Scope for Mac是一款专为Mac用户设计的硬盘健康监测与分析工具&#xff0c;致力于保障用户的数据安全。这款软件功能强大且操作简便&#xff0c;能够实时检测硬盘的各项指标&#xff0c;帮助用户及时发现并解决潜在问题。 Drive Scope for Mac 1.2.23注册激活版下载 Driv…

linux 驱动-匹配2 (amba_bustype)

目录 1.实例分析 a. 设备树实例 b. 驱动实例 2. amba匹配流程 a. 创建amba_device b. 确定总线以及总线的匹配函数 c. 分析总线的匹配函数 1.实例分析 a. 设备树实例 serial7e201000 { compatible "brcm,bcm2835-pl011\0arm,pl011\0arm,primecell"; //创建am…

用Python自动化操作PPT,看完这篇文章就够了!

1.PPT自动化能干什么&#xff1f;有什么优势&#xff1f; 它可以代替你自动制作PPT它可以减少你调整用于调整PPT格式的时间它可以让数据报告风格一致总之就是&#xff1a;它能提高你的工作效率&#xff01;让你有更多时间去做其他事情&#xff01; 2.使用win32com操作ppt 官…

【探索Linux】P.32(自定义协议)

阅读导航 引言一、自定义协议概念二、自定义协议需要注意的事项三、自定义协议示例(跨网络计算器协议)✅协议代码&#xff08;Protocol.hpp&#xff09;1. 计算器协议简单介绍2. 序列化部分3. 反序列化部分4. 请求和响应数据结构5. 使用自定义协议 四、总结温馨提示 引言 在上…