在使用多模态交互之前,确保场景中已经加入RKCamera组件,并按照《空间构建》章节介绍完成了基础空间的构建。并确保已经了解如何使用Rokid 多模态交互。

注意:手势交互依赖于Max Pro眼镜。

1 构建标准6DoF 场景

按照6DoF空间章节中介绍的方式,构建一个标准的6DoF 场景。

并按照多模态交互章节中介绍的方式,构建多模态交互场景。

2 NativeInterface_PlaneTracking.cs

平面检测接口文档是NativeInterface_PlaneTracking.cs文件。其中:

///打开平面检测
public static void OpenPlaneTracker(PlaneDetectMode detectMode);
///关闭平面检测
public static void ClosePlaneTracker();
///设置平面检测模式
public static void SetPlaneDetectMode(PlaneDetectMode detectMode);
///获取当前平面检测模式
public static PlaneDetectMode GetPlaneDetectMode();
///
public static unsafe TrackableChanges<long> GetChanges(Allocator allocator);
///尝试获取有边界的平面
public static unsafe bool TryGetBoundedPlane(long plane, ref BoundedPlane boundedPlane)
public enum PlaneDetectMode
{
    Horizontal = 1, //Only detect horizontal plane
    Vertical = 2,//Only detect vertical plane
    HorizontalAndVertical = 3 // Detect horizontal and vertical plane
}
public struct BoundedPlane
{
    public long planeHandle;
    public Vector2[] boundary;//局部坐标
    public Vector3[] boundary3D;//世界坐标
    public Pose pose;

    public PlaneType planeType;
    public override string ToString()
    {
        string boundaryStr = "\r\n";
        string boundary3DStr = "\r\n";
        for (int i = 0; i < boundary.Length; i++)
        {
            boundaryStr += $"({boundary[i].x},{boundary[i].y})\r\n";
            boundary3DStr += $"({boundary3D[i].x},{boundary3D[i].y},{boundary3D[i].z})\r\n";
        }
        return $"planeId:{planeHandle} \r\nplaneType:{planeType} \r\npose:\r\n{pose.position.ToString("0.0000")}\r\n{pose.rotation.eulerAngles.ToString("0.0000")} \r\nboundary3D:{boundary3DStr}\r\nboundary:{boundaryStr} ";
    }


    public void release()
    {
        boundary = null;
        boundary3D = null;
    }
}

比较深入的开发者可以使用这些接口进行平面、锚点、交互的开发,以下章节是提供的快速开始使用的方法。

3 AR Plane Manager

AR Plane Manager是Rokid 为开发者提供的平面管理工具。

在场景中创建空物体,命名为PlaneLogic,并挂载ARPlaneManager。

ARPlaneManager需要传入一个可延展的PlanePrefab。(Log Text 和Plane Detect Mode 根据项目需求进行设置)

在Rokid UXR SDK Package中找到AR Default Plane,并将其拖入Hierarchy中。

并将该平面复制给ARPlaneManager。

4 Anchor Manager

在确定已经有RKInput 的情况下,开发者可以使用Anchor Manager 来管理空间锚点。

在PlaneLogic 上挂载AnchorManager 脚本。

这里要注意,Anchor Manager 需要一个Anchor Prefab 作为锚点预制体,在Rokid UXR SDK 包中有一个默认的锚点预制体–AR Default Locator。找到AR Default Locator,这里需要注意,我们要用的是预制体。并将其拖入到Hierarchy中。

把该预制体赋值给到Anchor Manager。

5 控制平面检测开关

在场景中创建PointableUI,设置两个开关,用来打开和关闭平面检测。

创建PlaneTest.cs 脚本:

using Rokid.UXR.Module; // 引入Rokid的UXR模块相关命名空间
using UnityEngine; 
using UnityEngine.UI;

/**
 * 类说明:PlaneTest 脚本用于控制平面追踪的开启与关闭功能。
 * 通过UI按钮与ARPlaneManager交互,实现AR应用中平面追踪的用户界面控制。
 */
public class PlaneTest : MonoBehaviour
{
    // 可序列化的私有字段,用于在Inspector面板中指定UI按钮
    [SerializeField] private Button openPlaneTracker;
    [SerializeField] private Button closePlaneTracker;

    /**
     * 方法说明:Start
     * 在第一帧更新前调用,用于初始化组件和设置监听事件。
     */
    void Start()
    {
        // 如果openPlaneTracker按钮被分配,则为其添加点击事件监听器,
        // 点击时调用ARPlaneManager的OpenPlaneTracker方法以开启平面追踪。
        if (openPlaneTracker)
        {
            openPlaneTracker.onClick.AddListener(() => { ARPlaneManager.Instance.OpenPlaneTracker(); });
        }

        // 同理,为closePlaneTracker按钮添加点击事件监听器,
        // 点击时调用ARPlaneManager的ClosePlaneTracker方法以关闭平面追踪。
        if (closePlaneTracker)
        {
            closePlaneTracker.onClick.AddListener(() => { ARPlaneManager.Instance.ClosePlaneTracker(); });
        }
    }
}

并将PlaneTest脚本挂载到PlaneLogic上。并将Open和Close赋值到脚本中。

6 打包应用

将场景打包。

将设备连接到WiFi-ADB 或者直接连接电脑。安装打包成的APK文件。

最后在实机中查看:

更多推荐