ImageTracking_Targets¶
注意
该页面内容将于近期更新。
演示平面图像跟踪功能。
演示创建target的不同方法
演示动态创建target
演示通过ImageTargetData创建target的方法
演示如何加载和卸载target
演示如何使用不同中心模式(center mode)
演示如何使用不同的水平翻转模式
用法¶
详解¶
场景中的target¶
如果你需要替换sample中的图像,需要确保选择一个纹理丰富的 .jpg 或 .png 文件。建议阅读 EasyAR 平面图像跟踪 来帮助选择一个可跟踪的图像。
Target可以直接在 Unity 编辑器的inspector中配置。
Active Controller Strategy: Targets 及其 children 将在 target 未被跟踪时隐藏。如果你需要在跟踪丢失时保持显示,可以修改对应选项,也可以关闭脚本并使用自己的处理策略。
Source: 根据这个参数的数值,targets会从 Image File 或 Target Data File 中创建。
Path Type: 这里设置为 StreamingAssets ,表示 Path 将使用相对于StreamingAssets的路径。
Path: 这个sample中使用图片相对于StreamingAssets的路径。
Name: target名字,可以随意输入。
Scale: 根据识别图宽度实际的物理大小设置。
Tracker: 需要加载ImageTarget的Tracker。
Gizmo将会在target设置有效的时候显示,如有需要也可以在全局配置中关闭。在game view不会显示。
方块和熊猫的 transform 被调整为底面与识别图对齐。在运行这个场景并跟踪到 target的时候,方块和熊猫会在图像上面显示。
在脚本中创建target -- 从图像创建¶
可以在脚本中使用图像 Texteure2D来创建target。基本上需要做的事情就是把 inspector中的配置在脚本中通过代码做一遍。首先需要创建一个空的 GameObject 并添加 ImageTargetController 。
private ImageTargetController CreateTargetNode(string targetName)
{
GameObject go = new GameObject(targetName);
var targetController = go.AddComponent<ImageTargetController>();
...
}
然后像在inspector中一样设置 ImageTargetController 的参数。
targetController = CreateTargetNode("ImageTarget-" + texture.name);
targetController.Tracker = imageTracker;
targetController.Source = new ImageTargetController.Texture2DSourceData
{
Texture = texture,
Name = texture.name,
Scale = 0.1f,
};
在GameObject节点下添加物体,以便在target被跟踪时显示。
var panda2 = Instantiate(Panda);
panda2.transform.parent = targetController.gameObject.transform;
Target事件¶
Target事件可以用来处理自定义操作。这个sample使用这些事件来输出一些日志。在使用中可以删除这些日志,也可以添加自己的应用逻辑。需要注意TargetLost有可能在OnDestroy过程中调用,需要检查访问的物体是否有效。
controller.TargetDataLoad += (status) =>
{
Debug.Log($"Load data from {controller.Source.GetType()} resource into target {(controller.Target == null ? string.Empty : $"{{id = {controller.Target.runtimeID()}, name = {controller.Target.name()}}} ")}=> {status}");
};
controller.TargetFound += () =>
{
Debug.Log($"Found target {{id = {controller.Target.runtimeID()}, name = {controller.Target.name()}}}");
};
controller.TargetLost += () =>
{
if (!controller) { return; }
Debug.Log($"Lost target {{id = {controller.Target.runtimeID()}, name = {controller.Target.name()}}}");
};
加载卸载Target¶
Target的加载和卸载非常简单。设置 ImageTargetController.Tracker 为 null,target 就会被卸载,而设为某个 tracker,target就会立即被加载进去。
public void UnloadTargets()
{
foreach (var target in targets)
{
target.Tracker = null;
}
}
public void LoadTargets()
{
foreach (var target in targets)
{
target.Tracker = imageTracker;
}
}
开关跟踪¶
ImageTrackerFrameFilter.enabled 可以控制图像跟踪功能的开关。可以在不需要的时候关闭跟踪来节省资源。跟踪关闭的时候不会对camera或其它跟踪功能产生影响。
public void Tracking(bool on)
{
imageTracker.enabled = on;
}
开关相机¶
VideoCameraDevice.enabled 可以控制Camera设备的开关。如果camera关闭,跟踪功能将停止收到数据,整个AR链条将停止。
public void EnableCamera(bool enable)
{
cameraDevice.enabled = enable;
}
中心模式¶
在物体感知功能中,有三个 ARSession.CenterMode 的模式是有效的。
在 ARSession.ARCenterMode.Camera 模式中,设备运动时camera不会自动移动。
在 ARSession.ARCenterMode.FirstTarget 或 ARSession.ARCenterMode.SpecificTarget 模式中,camera会在设备运动时自动移动,而target不会动。
为了说明 ARSession.ARCenterMode.FirstTarget 与 ARSession.ARCenterMode.SpecificTarget 之间的不同,我们修改了 tracker 配置以同时跟踪两个target。
在 ARSession.ARCenterMode.FirstTarget 模式中,有target被跟踪时camera会移动,而中心将会是第一个被跟踪到的target,这个target丢失的时候中心会切换到其它target。
在中心target没有变化的时候, ARSession.ARCenterMode.SpecificTarget 模式会一直使用指定的target作为中心,如果这个target丢失,camera将不会移动。
ARSession.CenterMode 可以随时修改并将立即生效。
水平翻转相机图像¶
ARSession.HorizontalFlip.FrontCamera 及 ARSession.HorizontalFlip.BackCamera 控制了camera图像是如何进行镜像显示的。在camera图像镜像显示的时候,camera投影矩阵或 target scale会同时改变,以确保跟踪行为可以继续。
ARHorizontalFlipMode.None 模式下没有镜像显示。
ARHorizontalFlipMode.World 模式下,camera图像会镜像显示,camera投影矩阵会变化进行镜像渲染,target scale不会改变。投影矩阵的改变将对场景中所有物体产生副作用,如果这个效果不是你想要的,可以选择 ARHorizontalFlipMode.Target 模式。
ARHorizontalFlipMode.Target 模式下,camera图像会镜像显示,target scale会改变进行镜像渲染,camera投影矩阵不会改变。
ARSession.HorizontalFlipNormal 及 ARSession.HorizontalFlipFront 可随时修改并将立即生效。