【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体验。而苹果的

### ARFoundation 中的平面检测使用指南 #### 什么是平面检测平面检测是指增强现实 (AR) 应用程序识别并追踪物理环境中水平或垂直平坦表面的能力。借助此功能,应用程序可以将虚拟对象稳定地放置在这些表面上[^1]。 #### 如何启用和平面检测交互? 为了实现这一目标,在 Unity 编辑器中配置 `ARRaycastManager` 和 `ARPlaneManager` 组件是必要的。前者用于执行射线投射来查找最近的平面;后者则负责管理和更新已发现的所有平面数据结构[^2]。 ```csharp // 获取 AR 平面管理器实例 var planeManager = FindObjectOfType<ARPlaneManager>(); if(planeManager != null){ // 启用/禁用特定类型的平面检测(如水平、垂直) planeManager.subsystem.requestedDetectionMode = UnityEngine.XR.ARSubsystems.PlaneDetectionModes.Horizontal; } ``` #### 可视化与自定义渲染 对于每一个新探测到的平面,默认情况下会有一个简单的矩形网格显示出来帮助用户理解空间布局。然而,开发者可以根据需求调整其外观甚至完全替换为其他形式的表现方式。 ```csharp using UnityEngine.XR.ARFoundation; public class CustomPlaneRenderer : MonoBehaviour { private void OnEnable() { var planes = FindObjectsOfType<ARPlane>(); foreach(var plane in planes){ Destroy(plane.gameObject); GameObject newPlaneGO = Instantiate(customPlanePrefab, transform.position, Quaternion.identity); newPlaneGO.transform.localScale = Vector3.one * Mathf.Sqrt(plane.extents.x * plane.extents.z); } } } ``` #### 锚定机制简介 当希望固定某个物体于某一位置而不随设备移动而改变相对关系时,则需要用到锚点概念。创建一个基于所选平面上的新锚点非常简单——只需调用相应 API 即可完成操作。 ```csharp using UnityEngine.XR.ARFoundation; void CreateAnchorAtTouchPosition(){ List<ARRaycastHit> hits = new List<ARRaycastHit>(); if(touchPhase == TouchPhase.Began && arRaycastManager.Raycast(touchPosition,hits,UnityEngine.XR.ARSubsystems.TrackableType.PlaneWithinPolygon)){ Pose hitPose = hits[0].pose; Anchor anchor = arSession.AddToSession(hitPose.position,hitPose.rotation); Instantiate(anchorableObject,anchor.transform); } } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Unity数字工匠

难题的解决使成本节约,求打赏

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值