MotionTracking

演示如何使用运动跟踪。

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

用法

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

如果运行时EasyARMotionTracker被选择使用,开始时sample会检测水平面。水平面检测将在cube放在平面上后停止,然后可以点击 Unlock Plane 来重新开始检测。

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

如果运行时EasyARMotionTracker以外的framesource被选中,则不会进行水平面检测。

详解

Frame source选择策略

frame source会根据Transform排序,从上到下选择第一个可以设备支持的运行。如果需要调整选择策略,手动调整frame source的排序即可。

在这个sample中,如果设备支持EasyAR motion tracker,会选择使用EasyAR motion tracker,否则会依次判断AREngine、ARCore、ARKit,选择第一个支持的

../../_images/image_s9_1.png

如果所有列出的frame source都不支持,则会弹出错误消息,

../../_images/image_s9_3.png

这个错误消息并不完全代表设备不受支持,严谨的说,是在ARSession下所有可供选择的frame source中没能找到支持这个设备的frame source。这通常有两种可能

  1. 设备完全不被支持,比如在Windows上使用外接usb相机,还希望使用运动跟踪功能的时候

  2. 被支持的frame source不在ARSession可选范围内,比如如果删除ARSession下面的ARkit,然后在支持ARKit的手机上运行时就属于这种情况

世界中心下的物体

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

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

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

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

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

../../_images/image_s9_2.png

检测平面

这部分只有在运行 EasyAR motion tracking 的时候才有效。

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

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

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

var viewportPoint = Session.Assembly.Camera.WorldToViewportPoint(Plane.transform.position);
if (!Plane.activeSelf || viewportPoint.x < 0 || viewportPoint.x > 1 || viewportPoint.y < 0 || viewportPoint.y > 1 || Mathf.Abs(Plane.transform.position.y - points[0].y) > 0.15)
{
    ...
}

在平面上移动物体

运行 EasyAR motion tracking 的时候才有效。

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

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

中心模式

ARSession.ARCenterMode.SessionOrigin 模式中,camera会在设备运动时自动移动,而SessionOrigin不会动。在 ARSession.ARCenterMode.Camera 模式中,设备运动时camera不会自动移动。其它模式可参考 中心模式