ObjectTracking

演示如何跟踪3D物体。

用法

../../_images/image_32.png
标记1:是否打开Camera。
标记2:按照索引逐个切换Camera。
标记3:切换水平翻转模式。
标记4:切换世界中心模式。
标记5:卸载/加载ObjecTarget。
标记6:停止跟踪/开始跟踪。

这个sample中可以跟踪的物体就是场景中看到的Target,可以在工程中找到模型贴图,打印并折叠黏贴成六棱柱。

详解

Targets in the scene

如果你需要替换sample中的模型,需要确保选择一个纹理丰富的 .obj文件,并在 Extra File Paths 中填入所有被这个obj文件以及其使用的mtl文件所引用的.mtl 和 .jpg/.png文件路径。建议阅读 这篇指南 来帮助选择一个可跟踪的图像。

../../_images/image_s4_1.png

Target可以直接在 Unity 编辑器的inspector中配置。

  • Active Control: Targets 及其 children 将在 target 未被跟踪时隐藏。如果你需要在跟踪丢失时保持显示,可以修改这个参数,也可以写自己的处理策略。

  • Source Type: 根据这个参数的数值,targets会从 Obj File 中创建。

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

  • Obj Path: 这个sample中使用.obj文件 相对于StreamingAssets的路径。

  • Extra File Paths: 这个sample中使用的.mtl及 .jpg文件 相对于StreamingAssets的路径。

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

  • Scale: 根据A4纸折成的六棱柱的实际物理大小设置。

  • Tracker: 需要加载ImageTarget的Tracker。

Gizmo将会在target加载后显示,如有需要也可以在全局配置中关闭。在game view不会显示。

六棱柱物体的 transform 被调整与识别物体对齐。在运行这个场景并跟踪到 target的时候,六棱柱模型会在图像上面显示并覆盖实际物体。

Target事件

Target事件可以用来处理自定义操作。这个sample使用这些事件来输出一些日志。在使用中可以删除这些日志,也可以添加自己的应用逻辑。

controller.TargetFound += () =>
{
    Debug.LogFormat("Found target {{id = {0}, name = {1}}}", controller.Target.runtimeID(), controller.Target.name());
};
controller.TargetLost += () =>
{
    Debug.LogFormat("Lost target {{id = {0}, name = {1}}}", controller.Target.runtimeID(), controller.Target.name());
};
controller.TargetLoad += (Target target, bool status) =>
{
    Debug.LogFormat("Load target {{id = {0}, name = {1}}} into {2} => {3}", target.runtimeID(), target.name(), controller.Tracker.name, status);
};
controller.TargetUnload += (Target target, bool status) =>
{
    Debug.LogFormat("Unload target {{id = {0}, name = {1}}} => {2}", target.runtimeID(), target.name(), status);
};

加载卸载Target

Target的加载和卸载非常简单。设置 ObjectTargetController.Tracker 为 null,target 就会被卸载,而设为某个 tracker,target就会立即被加载进去。

public void UnloadTargets()
{
    objectTarget.Tracker = null;
}

public void LoadTargets()
{
    objectTarget.Tracker = objectTracker;
}

开关跟踪

ObjectTrackerFrameFilter.enabled 可以控制物体跟踪功能的开关。可以在不需要的时候关闭跟踪来节省资源。跟踪关闭的时候不会对camera或其它跟踪功能产生影响。

public void Tracking(bool on)
{
    objectTracker.enabled = on;
}

开关相机

VideoCameraDevice.enabled 可以控制Camera设备的开关。如果camera关闭,跟踪功能将停止收到数据,整个AR链条将停止。

public void EnableCamera(bool enable)
{
    cameraDevice.enabled = enable;
}

中心模式

在物体感知功能中,有三个 ARSession.CenterMode 的模式是有效的。详细描述可以参考 中心模式

Flip camera image horizontally

ARSession.HorizontalFlipNormalARSession.HorizontalFlipFront 控制了camera图像是如何进行镜像显示的。在camera图像镜像显示的时候,camera投影矩阵或 target scale会同时改变,以确保跟踪行为可以继续。详细描述可以参考 水平翻转相机图像