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

news2025/1/13 13:28:28

介绍

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.coloradmin.cn/o/1609240.html

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

相关文章

局域网无法连接怎么办?

局域网连接是我们日常生活和工作中常用的方式之一&#xff0c;但有时我们可能会遇到局域网无法连接的问题。这给我们的工作和生活带来了很大的困扰。本文将介绍局域网无法连接的常见原因&#xff0c;并推荐一款名为【天联】的组网产品&#xff0c;它能够解决不同地区间的局域网…

Meta Llama 3 简介

文章目录 要点我们对 Llama 3 的目标最先进的性能模型架构训练数据扩大预训练规模指令微调与 Llama 3 一起建造系统级责任方法大规模部署 Llama 3Llama 3 的下一步是什么&#xff1f;立即尝试 Meta Llama 3 本文翻译自&#xff1a;https://ai.meta.com/blog/meta-llama-3/ 要点…

Android开发:应用百度智能云中的身份证识别OCR实现获取个人信息的功能

百度智能云&#xff1a; 百度智能云是百度提供的公有云平台&#xff0c;于2015年正式开放运营。该平台秉承“用科技力量推动社会创新”的愿景&#xff0c;致力于将百度在云计算、大数据、人工智能的技术能力向社会输出。 百度智能云为金融、城市、医疗、客服与营销、能源、制造…

jeecgflow之camunda工作流-并行网关

引言 书接上回&#xff0c;继续三国流程系列教程。 本文主要讲解并行网关。 并行网关允许流程中的多个任务同时执行&#xff0c;从而提高流程的执行效率。 并行网关会忽视序列流上的条件设置。 并行网关分为两部分。 Fork: 用于任务开始 Join:用于任务结束 体验文章demo演示站…

HarmonyOS-静态库(SDK)的创建和使用

文章目录 一、静态库&#xff08;SDK&#xff09;二、创建静态库1.新建静态库模块2. 开发静态库内容3. 编译静态库 三、使用静态库1. 配置项目依赖2. 在应用中使用静态库3. 注意事项 四、打包错误1. library引用本地har包错误 一、静态库&#xff08;SDK&#xff09; 在Harmon…

美团财务科技Java后端一面:面向对象、类加载过程、全限定类名相同的类是否可以同时被加载

更多大厂面试内容可见 -> http://11come.cn 美团财务科技Java后端一面&#xff1a;面向对象、类加载过程、全限定类名相同的类是否可以同时被加载 如何理解面向对象&#xff1f; 面向对象 是具有对象概念的编程范式&#xff0c;面向对象将程序实现分为了一个个独立的对象&…

Vue.js------Vue组件基础

能够理解Vue组件概念和作用能够掌握封装创建组件能力能够使用组件之间通信能够完成todo案例 一.Vue组件创建和使用 1.折叠面板-实现多个 创建一个文件夹demo 具体步骤请参考vue.js---vue基础 ⚫ 解决方案: 采用vue提供的单.vue文件-组件方式来封装一套然后复用 在component…

Hadoop的安装及配置

8.下面我们开始安装配置Hadoop 1&#xff09;首先下载hadoop-2.7.2的jar包 并添加到我们的jtxy1的/root/目录下 2&#xff09;yum install在线安装软件 yum install net-tools //支持ifconfig yum install vim //支持vim yum install glibc.i686 --java命令不好使 3&am…

人工智能论文GPT-3(2):2020.5 Language Models are Few-Shot Learners;微调;少样本Few-Shot (FS)

2 方法Approach 我们的基本预训练方法&#xff0c;包括模型、数据和训练&#xff0c;与GPT-2中描述的过程相似&#xff0c;只是模型规模、数据集规模和多样性&#xff0c;以及训练时长有所扩大&#xff0c;相对简单直接。 我们使用的上下文学习也与GPT-2相似&#xff0c;但在…

Web程序设计-实验03 JavaScript语言基础

题目 【实验主题】 素数问题求解。计算&#xff08;判断&#xff09; 1~100中哪些是素数、哪些是合数。 素数也称为质数&#xff0c;是只能被1及其自身整除的自然数。与素数相对应的是合数&#xff0c;合数可以被分解为若干个素数的乘积&#xff0c;这些素数称为这个合数的质…

即席查询笔记

文章目录 一、Kylin4.x1、Kylin概述1.1 定义1.2 Kylin 架构1.3 Kylin 特点1.4 Kylin4.0 升级 2、Kylin 环境搭建2.1 简介2.2 Spark 安装和部署2.3 Kylin 安装和部署2.4 Kylin 启动环境准备2.5 Kylin 启动和关闭 3、快速入门3.1 数据准备3.2 Kylin项目创建入门3.3 Hive 和 Kylin…

Qt Debug模式下应用程序输出界面乱码【已解决】

Qt Debug模式下应用程序输出乱码 一、问题描述二、解决方法三、相关测试 一、问题描述 源码为utf-8编码. Qt Creator在Debug模式下运行程序&#xff0c;下方应用程序输出界面显示乱码. 但正常运行无乱码&#xff1a; 二、解决方法 尝试修改文件编码、执行编码无果… 可参考…

架构师系列-搜索引擎ElasticSearch(十)- 索引别名及重建

索引别名 别名&#xff0c;有点类似数据库的视图&#xff0c;别名一般都会和一些过滤条件相结合&#xff0c;可以做到即使是同一个索引上&#xff0c;让不同人看到不同的数据。 别名的作用 在开发中&#xff0c;一般随着业务需求的迭代&#xff0c;较老的业务逻辑就要面临更新…

小型燃气站3D可视化:打造安全高效的燃气新时代

随着科技的不断进步&#xff0c;越来越多的行业开始融入3D可视化技术&#xff0c;燃气行业也不例外。 小型燃气站作为城市燃气供应的重要节点&#xff0c;其安全性和运行效率至关重要。传统的燃气站管理方式往往依赖于人工巡检和纸质记录&#xff0c;这种方式不仅效率低下&…

JVM 讲解 (主要类加载其以及流程和机制(双亲委派))

JVM有什么用&#xff1f; 说白了&#xff0c;就是我们编写 Java 代码&#xff0c;编译 Java 代码&#xff0c;目的不是让它在 Linux、Windows 或者 MacOS 上跑&#xff0c;而是在 JVM 上跑。&#xff08;保证只要有JVM这个东西&#xff0c;就可以跨平台使用Java) 可以把JVM想象…

事务的传播行为介绍和事务失效

常用的就下图介绍的这两种&#xff0c;REQUIRED 支持当前事务&#xff0c;如果不存在&#xff0c;就新建一个&#xff0c;EQUIRES_NEW 如果有事务存在&#xff0c;挂起当前事务&#xff0c;创建一个新的事务 同一个service中必须用代理对象调用&#xff0c;否则失效

ADOP 万兆电口光模块:SFP+转RJ45端口解决方案

&#x1f335;在数据中心的接入层中&#xff0c;大多数服务器网卡&#xff08;NIC&#xff09;和存储设备都采用10GBASE-T RJ45端口&#xff0c;而与之相连的TOR&#xff08;机架顶部&#xff09;交换机通常配备SFP端口&#xff0c;且二者无法直接相连。为了解决该问题&#xf…

软考高级架构师:项目配置管理中产品配置例题

题目 项目配置管理中&#xff0c;产品配置是指一个产品在其生命周期各个阶段所产生的各种形 式和各种版本的文档、计算机程序、部件及数据的集合。该集合中的每一个元素 称为该产品配置中的 一个配置项&#xff0c; ( )不属于产品组成部分工作成果的配置项。 A需求文档 B设计文…

Redis中的事务(二)

事务 事务的实现 执行事务 当一个处于事务状态的客户端向服务器发送EXEC命令时&#xff0c;这个EXEC命令将立即被服务器执行&#xff0c;服务器会遍历这个客户端的事务队列&#xff0c;执行队列中保存的所有命令&#xff0c;最后将执行命令所得的结果全部返回给客户端。 例…

3、MYSQL-一条sql如何在MYSQL中执行的

MySQL的内部组件结构 大体来说&#xff0c;MySQL 可以分为 Server 层和存储引擎层两部分。 Server层 主要包括连接器、查询缓存、分析器、优化器、执行器等&#xff0c;涵盖 MySQL 的大多数核心服务功能&#xff0c;以及所有的内置函数&#xff08;如日期、时间、数学和加密函…