Unity AR平面跟踪

在上一篇博客中,我们了解了 2D 图像跟踪,让我们看看 Unity 如何更轻松地检测现实世界中的平面,并使用该平面放置或生成任何对象。

最著名的生活场景是宜家。你可能知道宜家如何通过移动应用程序将数字家具放置在我们的客厅中。

NSDT工具推荐: Three.js AI纹理开发包 - YOLO合成数据生成器 - GLTF/GLB在线编辑 - 3D模型格式在线转换 - 可编程3D场景编辑器 - REVIT导出3D模型插件 - 3D模型语义搜索引擎 - Three.js虚拟轴心开发包 - 3D模型在线减面 - STL模型在线切割 

我们将尝试构建类似的东西,源码可以从这里下载。

1、Unity 的设置

在 Unity 中,创建一个项目并选择一个空的 3D 模板。

首先,我们需要配置 Player Build Settings,将 Build 平台切换到你最喜欢的设备,然后从 Package Manager 添加包 AR Foundation 和设备特定的插件包,如 ARCore 或 ARKit,在本例中,我使用了 iOS 设备,因此下载了 ARKit XR 插件。你可以从此处查看配置步骤。

接下来,删除 3D 模板添加的 MainCamera 对象,并将 AR 体验的必需对象添加到你的场景、AR 会话和 AR 会话原点。

在 AR Session Origin 内部,有一个 AR Camera,将其标记为 MainCamera。

到目前为止,我们已经完成了 Unity 的 AR 开发设置。

接下来,我们必须为平面检测和将物体放置在检测到的平面上设置一些东西。因此,让我们首先为平面检测进行非常基本的设置,然后我们可以在稍后将物体放置在平面上时进行即兴发挥。

2、平面检测

为此,我们需要将 AR Plane Manager(一个预定义的脚本)作为组件添加到 AR Session Origin 中。

它有 3 个字段,Script 包含它自己的脚本,Plane Prefab,这是我们需要添加平面特征的游戏对象的地方,然后每当 AR 摄像头检测到现实世界中的表面或平面时,该 Prefab 就会绘制在这些表面上。检测模式,默认为 Everything,意味着管理器将检测每种类型的平面,无论是垂直还是水平,可以根据我们的要求进行设置。比如只有垂直或只有水平。

添加 AR Plane Manager 后,我们需要将一些游戏对象分配给 Plane Prefab 字段。

我们有 3 种方法可以做到这一点,我们可以使用 Unity Asset Store 中提供的各种 3D 平面网格,或者我们可以使用 AR Foundation 提供的默认 AR 平面,或者我们可以构建自定义平面并添加平面组件,如网格过滤器、网格渲染器、线渲染器等。

为此,我选择默认 AR 平面,可以在 XR 子菜单中找到。

就这样,我们完成了,现在将该 AR 平面从层次结构拖到 Assets 的文件夹结构中,现在它变成了预制件,并将其从层次结构中移除。

最后,将该预制件拖到 AR Session Origin 中 AR Plane Manager 的 Plane Prefab 字段。

在这里,我们完成了非常基本的平面检测设置。在设备上构建并运行它以查看其工作原理。

如果一切正常,那么让我们继续放置对象。

3、放置对象

此过程需要对光线投射有所了解。

光线投射(raycasting):投射光线以帮助估计 AR 物体应放置在何处,以便以可信的方式出现在现实世界表面;用于命中测试。

那么什么是命中测试(hit-testing)呢?命中测试可让你为虚拟物体建立姿势,是 AR 用户流程中继特征跟踪和平面查找之后的下一步。

在我们的例子中,我们找到了平面,现在我们必须执行光线投射来放置物体。

为了实现这一点,我们需要在此处编写一些代码。你可以从 Github 下载。

在 Assets 文件夹中 > 右键单击​​ > 创建 C# 脚本 > 命名,例如 PlaceObjectScript,双击并在编辑器中打开

导入 XR 库:

using UnityEngine.XR.ARSubsystems;
using UnityEngine.XR.ARFoundation;

我们需要的最重要的组件是 ARRaycastManager,所以我们会让班级知道我们需要这个家伙,这是强制性的。

我们知道进一步声明脚本中需要的一些变量。

 public GameObject gameObjectToInstantiate;

 private GameObject spawnedGameObject;

 private ARRaycastManager _aRRaycastManager;

 static List<ARRaycastHit> hits = new List<ARRaycastHit>();
  • gameObjectToInstantiate,在我们的例子中,我们将分配我们的 3D 汽车预制件。
  • spawnedGameObject,当用户点击屏幕时,gameObject 将在此处分配。
  • _aRRaycastManager,通过此变量,我们可以执行射线投射,然后将对象放置在用户点击的位置。
  • hits,获取 RayCast 命中列表。

此后,我们需要在 Awake() 方法中初始化 _aRRaycastManager。删除 Start() 方法,我们不会将其用于我们的应用。

接下来,我们需要用户在屏幕上点击或触摸的位置,为此创建一个新方法,如下所示,

 bool TryGetTouchPosition(out Vector2 touchPosition)
 {        
       if(Input.touchCount > 0)
       {            
          touchPosition = Input.GetTouch(0).position;
          return true;
       }

       touchPosition = default;
       return false;
 }

现在我们需要实例化一个 gameObject,当我们从上述方法获得屏幕上点击区域的位置和真值时,它会生成 GameObject。

在 Update() 中,写入以下几行:

脚本编写完毕。现在回到 Unity。

只需将创建的脚本拖到 AR Session Origin Inspector 部分,必须将其添加为组件。

AR Raycast Manager 会自动添加到组件中,这是因为我们在顶部将 PlaceObjectScript 指定为 RequireComponent()。保持原样即可。

最后,将你的预制件拖到 Game Object To Instantiate 字段:

我们还可以在 AR 平面管理器中将检测模式更改为水平,以避免检测垂直平面。

瞧,我们成功了。


原文链接:Unity AR平面检测 - BimAnt

  • 14
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Unity AR Foundation 是 Unity 的一个扩展包,用于开发增强现实(AR)应用程序。它提供了一系列的工具和功能,帮助开发者在 Unity 中轻松构建 AR 应用,并且支持多个平台,包括 iOS。 在 iOS 上使用 Unity AR Foundation,可以通过 Unity 的集成开发环境(IDE)来创建和管理 AR 项目。开发者可以通过 Unity 的图形界面编辑器来构建场景和添加 AR 特效,也可以使用 C# 脚本编写自定义的逻辑和行为。 Unity AR Foundation 提供了一些基本的功能,例如:追踪和识别平面、将虚拟物体投射到现实世界中,并且支持在运行时与现实世界进行交互。开发者可以使用 Unity 的强大的图形渲染引擎来创建逼真的虚拟物体,并且可以通过使用 Unity 的物理引擎来实现物体的物理行为。 AR Foundation 还提供了与 iOS 设备原生功能的集成,例如:相机、陀螺仪、加速度计等。通过与 iOS API 的结合,开发者可以创建更加综合和强大的 AR 应用程序。比如,可以利用相机捕捉的图像进行图像识别和跟踪,或者使用设备的陀螺仪和加速度计来实现更加精准的感知和交互。 总之,Unity AR Foundation 是一个用于开发 AR 应用程序的强大工具,通过它可以方便地在 Unity 中构建多平台的 AR 应用程序,包括在 iOS 设备上运行的应用。使用 Unity AR Foundation,开发者可以充分利用 Unity 强大的图形和物理引擎来创建逼真的虚拟体验,并且与设备的传感器和功能进行紧密的集成,从而实现真实世界与虚拟世界的融合。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值