功能简介
Planar Image Tracking是用于检测与跟踪日常生活中有纹理的平面物体。所谓“平面”的物体,可以是一本书、一张名片、一幅海报,甚或是一面涂鸦墙这类具有平坦表面的物品或事物。这些物体应当具有丰富且不重复的纹理。
为了创建一个Planar Image Tracking实例,你仅需要准备好一张目标物体的设计图,或者是其正视角度的照片。目标物体的Target数据是在Tracker中自动生成的,除了准备上述图片,你不需要进行任何额外的操作或配置。
图片要求
- 图片的格式建议为JPG或PNG。
- 确保你的模板图片或目标物体拥有合适的纹理。“合适”意味着纹理应当具有丰富的细节,且不是遵循某种重复性的模式。纹理细节缺乏或模式重复的物体对检测和跟踪是不利的。
- 物体内容本身应当尽可能地充满整个画面。
- 模板图像不能过于狭长,其短边的长度至少应该达到长边长度的20%。
- 模板图像的尺寸不能过小,也不能过大。建议分辨率介于SQCIF(128x96) 和QVGA(1280x960) 之间。
模板图像如果带有透明通道,则默认会按照白色背景的方式进行处理。如果你的本意并非如此,请避免使用透明通道。
官方提供图片识别度:EasyAR检测可识别度
设置ARCamera
- 将场景中相机的标签设置为MainCamera。
- Clear Flags:Clear Flags: 需要选择为 Solid Color 以确保Camera图像可以正常渲染。如果选择为 Skybox ,Camera图像将无法显示。
- Background: 这个非必需配置,考虑到使用体验,建议将背景颜色设为黑色以便在Camera设备打开前和切换时以黑色显示。
- Clipping Planes: 根据识别物体实际的物理距离设置。这里设置Near为0.1(米)以避免相机离物体较近时无法显示。
使用预设创建 AR Session
为了使用方便,在 GameObject 菜单中由许多预设,你可以在大多数情况下使用它们完成你需要的功能,如下图所示:
创建 ImageTarget
通过 EasyAR Sense > Image Tracking > Target : Image Target 创建 ImageTargetController 。
这时候场景中ImageTarget应该会显示成问号(注意需要将Gizmos开启,否则无法看到问号)
然后需要配置这个 ImageTarget。这通常由好几种不同的方法。这里使用其中的一种,使用StreamingAssets中的图片创建target。
在Assets中创建StreamingAssets文件夹
将需要识别的图片拖入StreamingAssets中。这里选用名片图。
然后配置这个 ImageTargetController 以使用 StreamingAssets 中的图片,
- Source Type: 这里设置为 Image File ,表示将使用图片文件创建ImageTarget。
- Path Type: 这里设置为 StreamingAssets ,表示 Path 将使用相对于StreamingAssets的路径。
- Path: 图片相对于StreamingAssets的路径。
- Name: target名字,可以随意输入。
- Scale: 根据识别图宽度实际的物理大小设置。这里使用的名片实际大小为9mm,因此设为0.09(米)。
- Tracker: 需要加载 ImageTargetController 的 ImageTrackerFrameFilter 。在添加ImageTarget时,它会被默认设为场景中的其中一个 ImageTrackerFrameFilter ,添加后仍可修改。
场景中ImageTarget的显示将随Path的输入而随时改变
添加跟随 Target 或 Map 的3D内容
选中我们需要跟随的Target,然后将我们的跟随模型作为其子物体,然后调整合适的尺寸和位置即可。
在target上播放视频
在需要播放视频的Imagetarget下创建一个Quad作为子物体,然后添加VideoPlayer组件,设置好需要播放的视频资源,然后调整Quad到一个合适的大小即可。
代码检测发现与丢失识别图
private ImageTargetController controller;
public Text txt_RemainMsg;
// Start is called before the first frame update
void Start()
{
controller = GetComponentInParent<ImageTargetController>();
controller.TargetFound += () =>
{
txt_RemainMsg.text = "TargetFound";
};
controller.TargetLost += () =>
{
txt_RemainMsg.text = "TargetLost";
};
}