unity hololens2 MRTK交互(手势、眼睛、头部)

445 阅读2分钟

交互方法理解

  1. 3种交互方式触发事件是一样的,移入游戏对象就会触发OnFocusEnter事件、移出触发OnFocusExit,点击操作分别触发OnPointerDown、OnPointerDragged、OnPointerClicked、OnPointerUp。
  2. 头部与眼睛都属于凝视交互,只能单独勾选一种。
  3. 手势交互优先级高于凝视交互,默认情况当手势交互出现在设备时,凝视交互将失效。
  4. 游戏对象绑定EyeTracking事件,当眼睛进入游戏对象就会触发事件,眼睛移入对象的同时近指针点击就会触发点击相关事件(远指针点击则不会触发,除非指针移入眼睛注视的对象,所以想使用眼睛交互就需要当满足一定条件禁时,禁止掉远指针)。
  5. 想要眼睛和远指针同时存在就需要考虑好交互规则。

眼睛凝视

  1. MRTK 提供EyeTracking脚本可直接挂在到游戏对象上,用户凝视会直接触发对应事件(头部凝视不会触发)。
  2. FaceUser脚本在EyeTracking Samples中提供的脚本,挂载到游戏对象上时,当用户凝视此对象触发凝视相关事件时,调用FaceUser公共函数Engage方法,游戏对象就会面向用户。凝视移出时调用DisEngage方法,游戏对象即恢复原先位置。

MRTK交互事件

     void IMixedRealityFocusHandler.OnFocusEnter(FocusEventData eventData)
    {
        Debug.Log("OnFocusEnter");
        material.color = color_OnHover;
    }

    void IMixedRealityFocusHandler.OnFocusExit(FocusEventData eventData)
    {
        Debug.Log("OnFocusExit");
        material.color = color_IdleState;
    }

    void IMixedRealityPointerHandler.OnPointerDown(
         MixedRealityPointerEventData eventData)
    { 
        Debug.Log("OnPointerDown");

    }
     void IMixedRealityPointerHandler.OnPointerDragged(
         MixedRealityPointerEventData eventData)
        { Debug.Log("OnPointerDragged"); }

void IMixedRealityPointerHandler.OnPointerClicked(MixedRealityPointerEventData eventData)
{
    Debug.Log("OnPointerClicked");
    material.color = color_OnSelect;
}

public void OnPointerUp(MixedRealityPointerEventData eventData)
{
    Debug.Log("OnPointerUp");
   
}

MRTK API

  void Update()
    {
        // 开启凝视(眼睛或头部)看配置里勾选的哪个    想要手势与凝视共同作用时,就需要每一帧都调用此方法
        PointerUtils.SetGazePointerBehavior(PointerBehavior.AlwaysOn);
        // 关闭远程手部射线
        //PointerUtils.SetHandRayPointerBehavior(PointerBehavior.AlwaysOff);
        // 关闭远程手部射线的右手
        PointerUtils.SetHandRayPointerBehavior(PointerBehavior.AlwaysOff, Handedness.Right);
        // 开启远程手部射线
        PointerUtils.SetHandRayPointerBehavior(PointerBehavior.Default);
        // 强制开启手部射线 无论是否靠近可抓取对象   经验证并未看出与上面的不同点
        PointerUtils.SetHandRayPointerBehavior(PointerBehavior.AlwaysOn);
}

image.png