MotionTracking

本页部分描述可能与4.5版本有出入。页面更新将于近期上线。

演示如何使用运动跟踪。

  • 演示如何在不支持EasyAR运动跟踪的时候自动使用ARKit/ARCore

用法

../../_images/image_38.png
标记1:显示系统状态和操作提示。
标记2:在cube放在平面上之后,继续检测平面。
标记3:切换世界中心模式。

开始时sample会检测水平面。水平面检测将在cube放在平面上后停止,然后可以点击 Unlock Plane 来重新开始检测。

场景中的Cube可以使用单指移动放在平面上。双指捏合可以放大缩小Cube,双指同时水平移动可以水平旋转Cube。

详解

VIO设备策略

VIOCameraDeviceUnion 是个设备 Union,根据 DeviceChooseStrategy 和系统情况会选择为MotionTracker或ARKit或ARCore。

在这个sample中, VIOCameraDeviceUnion.DeviceStrategy 设为 DeviceChooseStrategy.EasyARMotionTrackerFirst ,EasyAR motion tracking 如果可用会优先被选择。

../../_images/image_s9_1.png

世界中心下的物体

WorldRoot 可以用来实现这些功能,

  • 在跟踪状态变化时控制物体显示和隐藏。

  • 根据 ARSession.CenterMode 相对camera一起移动。

如果上面这些都有其它地方处理,那可以忽略 WorldRoot

在这个sample中, WorldRootController.ActiveControl 设成 ActiveControlStrategy.HideWhenNotTracking ,这样cube会在跟踪失败时隐藏。

../../_images/image_s9_2.png

检测平面

这部分只有在EasyAR Sense 4.1及之后版本中,运行 EasyAR motion tracking 的时候才有效。

可以使用 VIOCameraDeviceUnion.HitTestAgainstHorizontalPlane 获取世界中平面的位置。可以在这个位置放置一个平面。

var viewPoint = new Vector2(0.5f, 0.333f);
var points = vioCamera.HitTestAgainstHorizontalPlane(viewPoint);
if (points.Count > 0)
{
    Plane.transform.position = points[0];
    ...
}

在平面检测到之后,保持平面不动直至它即将超出视野。

var viewportPoint = Camera.main.WorldToViewportPoint(Plane.transform.position);
if (!Plane.activeSelf || viewportPoint.x < 0 || viewportPoint.x > 1 || viewportPoint.y < 0 || viewportPoint.y > 1)
{
    ...
}

在平面上移动物体

这部分只有在EasyAR Sense 4.1及之后版本中,运行 EasyAR motion tracking 的时候才有效。

可以对plane执行Raycast并移动cube。

Ray ray = Camera.main.ScreenPointToRay(touch.position);
RaycastHit hitInfo;
if (Physics.Raycast(ray, out hitInfo))
{
    TouchControl.transform.position = hitInfo.point;
    ...
}

中心模式

在空间感知功能中,有两个 ARSession.CenterMode 的模式是有效的。

ARSession.ARCenterMode.WorldRoot 模式中,camera会在设备运动时自动移动,而WorldRoot不会动。在 ARSession.ARCenterMode.Camera 模式中,设备运动时camera不会自动移动。大多数情况下建议使用 ARSession.ARCenterMode.WorldRoot