从零创建可运行的工程

这篇文章将详细描述如何使用 EasyAR Sense Unity Plugin 快速创建一个AR应用的过程。

准备工作

准备Unity环境

阅读 平台需求,了解EasyAR Sense Unity Plugin支持的系统和Unity版本,并从Unity官方获取并安装Unity安装包。

如果你是初次使用,建议使用Unity 长期支持版本

准备插件包

下载页 获取EasyAR Sense Unity Plugin的发布包。

获取许可证授权

使用EasyAR Sense之前需要先在官网 www.easyar.cn 注册并 获取许可证授权


创建工程

创建空Unity工程

创建工程时,Template 选择 3D。如果你在使用URP,可以参考 配置 Universal Render Pipeline (URP) 来进行配置。

../_images/image_s1_1.png

添加插件包

插件使用 Unity's package 组织文件,通过 tarball 文件分发。插件的发布文件是一个zip包,解压这一个zip包可以看到readme和 tgz 文件,注意不要解压这个 tgz 文件。

../_images/image_s0_3.png

通常建议把上述 tgz 文件放在工程目录中,比如 Packages 文件夹。然后通过Unity的 Package Manager window使用本地tarball文件安装插件

../_images/image_s0_1.png

在弹出的对话框中选择 com.easyar.sense-*.tgz 文件。

注意:在导入后, tgz 文件不能被删除或移动到另一个位置,因此通常需要在导入前将这个文件放在合适的地方。如果你希望与他人共享工程,可以将文件放在工程目录内,如果有使用版本管理,也需要加入。


填写许可证(License Key)

从Unity菜单中选择 EasyAR > Sense > Configuration 并在 Project Settings 面板中输入License Key。该页面也可以通过 Edit > Project Settings > EasyAR 进入。

../_images/image_s1_2.png ../_images/image_s1_3.png

创建含有Camera的场景

创建场景或使用工程自动创建的场景,确保场景中含有Camera。

../_images/image_g1_1.png

注意: 如果你在使用 AR Foundation ,上面那种独立的 Camera 不是必须的。在进行下一步之前,你需要参考 与 AR Foundation 协同工作 来详细了解如何配置场景。

注意: 如果你在使用 AR Engine Unity SDK ,上面那种独立的 Camera 不是必须的。在进行下一步之前,你需要参考 与华为 AR Engine 协同工作 来详细了解如何配置场景。

注意: 如果你在使用 Nreal SDK ,上面那种独立的 Camera 不是必须的。在进行下一步之前,你需要参考 在 Nreal 设备上使用 来详细了解如何配置场景。

配置相机(如果你在使用 AR FoundationAR Engine Unity SDKNreal SDK ,这些数值通常会由这些package所预设),

../_images/image_g1_7.png
  • Tag: 如果Camera不是来自 AR FoundationAR Engine Unity SDKNreal SDK ,可以设置Camera Tag为 MainCamera,这样它会在AR Session启动时被frame source所选用。或者,你也可以通过在Inspector面包设置 FrameSource.Camera 来修改 FrameSource 的 Camera 为这个Camera。

  • Clear Flags: 需要选择为 Solid Color 以确保Camera图像可以正常渲染。如果选择为 Skybox ,Camera图像将无法显示。

  • Background: 这个非必需配置,考虑到使用体验,建议将背景颜色设为黑色以便在Camera设备打开前和切换时以黑色显示。

  • Clipping Planes: 根据识别物体实际的物理距离设置。这里设置Near为0.1(米)以避免相机离物体较近时无法显示。

AR Foundation 通常会设置其剪裁平面为 (0.1, 20) ,这可能会导致离 Camera (真实世界中的设备)超过20米的物体会无法显示出来。请在使用前根据具体需求来修改。


创建 EasyAR AR Session

你可以使用预设来创建 AR Session,也可以逐节点创建 AR Session。

使用预设创建 AR Session

为了使用方便,在 GameObject 菜单中由许多预设,你可以在大多数情况下使用它们完成你需要的功能,

比如,如果你要使用 图像跟踪,你可以使用 EasyAR Sense > Image Tracking > AR Session (Image Tracking Preset) 来创建AR Session。

../_images/image_g1_2.png

如果你要像典型的类似 ARCoreARKit 的方式来使用 运动跟踪 ,你可以使用 EasyAR Sense > Motion Tracking > AR Session (Motion Tracking Preset) : AR Foundation First 来创建AR Session。

../_images/image_g1_3.png

如果你要同时使用 稀疏空间地图稠密空间地图 来建图,你可以使用 EasyAR Sense > SpatialMap > AR Session (Sparse and Dense SpatialMap Preset) 来创建AR Session。

../_images/image_g1_4.png

EasyAR Sense > AR Session (Preset) 菜单收集了所有预设,如果在这个集合中和某个功能菜单中存在同名的预设,它们创建出来的AR Session也会是一样的。

../_images/image_g1_5.png

逐节点创建 AR Session

如果 AR Session 预设不满足你的需求,你也可以逐节点创建 AR Session。

比如,如果你要在一个session中同时使用 稀疏空间地图图像跟踪 ,你可以首先使用 EasyAR Sense > AR Session (Preset) > AR Session (Empty) 创建一个空的 ARSession

../_images/image_g1_21.png

然后在session中添加 FrameSource 。为了使用 稀疏空间地图 ,你需要一个表示运动跟踪设备的 FrameSource ,这通常在不同设备上会运行不同的 frame source。这里我们使用 EasyAR Sense > Motion Tracking > Frame Source Group : AR Foundation First 来创建一个 Frame Source Group ,session使用的 frame source 会在运行时选择。你可以根据具体需求添加不同的 frame source 组或单个 frame source 到session中。

../_images/image_g1_22.png

在添加 frame source 之后,你需要添加 session 需要使用的 frame filter。为了在session中同时使用 稀疏空间地图图像跟踪 你需要在session中添加一个 SparseSpatialMapWorkerFrameFilter 和一个 ImageTrackerFrameFilter ,这可以通过 EasyAR Sense > SpatialMap > Frame Filter : Sparse SpatialMap WorkerEasyAR Sense > Image Tracking > Frame Filter : Image Tracker 来完成。

../_images/image_g1_23.png ../_images/image_g1_24.png

有时你需要在设备上录制 input frame 然后在PC上回放,以便在 Unity 编辑器中诊断问题,这时你可以在session中添加 FramePlayerFrameRecorder 。(当然,如果要使用这些功能的话,你需要根据情况修改 FrameSource.FramePlayerFrameSource.FrameRecorder 。)

../_images/image_g1_25.png

最后,AR Session 会是这样,

../_images/image_g1_26.png

创建 Target 或 Map

为了使用某些功能,你需要在场景中一个 target 或 map ,并将其它内容作为它们的子节点,以便这些内容可以在场景中跟着 target 或 map 移动。

创建 ImageTarget

如果你要使用 图像跟踪 ,你需要通过 EasyAR Sense > Image Tracking > Target : Image Target 创建 ImageTargetController

../_images/image_g1_27.png ../_images/image_g1_17.png

这时候场景中ImageTarget应该会显示成问号,

../_images/image_g1_6.png

然后需要配置这个 ImageTarget。这通常由好几种不同的方法。这里使用其中的一种,使用StreamingAssets中的图片创建target。

在Assets中创建StreamingAssets文件夹

../_images/image_g1_8.png

将需要识别的图片拖入StreamingAssets中。这里选用名片图。

../_images/image_g1_9.png

然后配置这个 ImageTargetController 以使用 StreamingAssets 中的图片,

../_images/image_g1_10.png
  • Source Type: 这里设置为 Image File ,表示将使用图片文件创建ImageTarget。

  • Path Type: 这里设置为 StreamingAssets ,表示 Path 将使用相对于StreamingAssets的路径。

  • Path: 图片相对于StreamingAssets的路径。

  • Name: target名字,可以随意输入。

  • Scale: 根据识别图宽度实际的物理大小设置。这里使用的名片实际大小为9mm,因此设为0.09(米)。

  • Tracker: 需要加载 ImageTargetControllerImageTrackerFrameFilter 。在添加ImageTarget时,它会被默认设为场景中的其中一个 ImageTrackerFrameFilter ,添加后仍可修改。

场景中ImageTarget的显示将随Path的输入而随时改变

../_images/image_g1_11.gif

创建 Sparse SpatialMap

如果你需要使用 稀疏空间地图 建图功能,你需要使用 EasyAR Sense > SpatialMap > Map : Sparse SpatialMap 创建 SparseSpatialMapController

../_images/image_g1_18.png ../_images/image_g1_19.png

然后配置 SparseSpatialMapController 以用于建图,

../_images/image_g1_28.png

添加跟随 Target 或 Map 的3D内容

这里我们展示如何在ImageTarget节点下添加3D物体,以添加一个Cube进行示例

../_images/image_g1_12.png ../_images/image_g1_13.png
  • Scale: Transform配置根据需求随意配,这里配置scale为 {0.5, 0.3, 0.3}。

  • Position: Transform配置根据需求随意配,这里为使Cube底面与识别图对其,调整position的z值为 -0.3 / 2 = -0.15 。

在Map节点下添加内容的方法类似。


在编辑器中运行

如果电脑上连接着摄像头,经过上面的配置之后,就可以直接在Unity编辑器中运行了。

../_images/image_g1_20.gif

在Android或iOS设备上运行

将场景添加到build settings,

../_images/image_g1_14.png

根据 Android 工程配置iOS 工程配置 配置工程,切换目标平台然后点击Build Settings的 BuildBuild And Run 按钮或通过其它方式编译项目并在手机上安装,运行时需允许相应权限。

../_images/image_g1_15.png ../_images/image_g1_16.png