ObjectTracking¶
演示如何跟踪3D物体。
用法¶
这个sample中可以跟踪的物体就是场景中看到的Target,可以在工程中找到模型贴图,打印并折叠黏贴成六棱柱。
详解¶
场景中的target¶
如果你需要替换sample中的模型,需要确保选择一个纹理丰富的 .obj文件,并在 Extra File Paths 中填入所有被这个obj文件以及其使用的mtl文件所引用的.mtl 和 .jpg/.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.HorizontalFlipNormal 及 ARSession.HorizontalFlipFront 控制了camera图像是如何进行镜像显示的。在camera图像镜像显示的时候,camera投影矩阵或 target scale会同时改变,以确保跟踪行为可以继续。详细描述可以参考 水平翻转相机图像。