0

我正在尝试查找配置,或确定我需要对 MRTK v2.1 进行哪些添加,以便能够在“编辑器”工作中测试 HL1,就像在之前的工作流程中所做的那样。简而言之,它是我们在 MRTK v2 之前使用 Gaze 和鼠标的能力。

我还没有找到一种方法来映射配置文件中的鼠标左键,使其行为与可见的手一样。在手可见的情况下,按下鼠标左键可以进行操作。我们也只需要凝视。注意:将“手部模拟”更改为手势不会产生正确的行为,它只会使凝视光标保持不变而没有交互。

我在很多地方都问过这个问题,而且经常被误解,所以这里有一些背景知识。我们将继续向需要严格质量保证的客户提供应用程序。必须对它们进行测试,就像在使用新的 MRTK 时一样。让我们的 QA 团队在 HL1 项目中使用关节手是不合理的,因为它会引入人为错误,这对错误测试会适得其反。

需求是: 1. 让光标在编辑器中保持不变。(在最新版本中,它在通过空格键使用双手后消失。)我们认为这应该是一个切换。是的,我们知道您可以按“1”来模拟选择,但如上所述,这对于正确的 QA 是不可接受的。2. 用鼠标左键,不用手,触发“选择”和“捏合”。我已经编写了一个服务扩展来处理“选择”,但是添加夹点,因为它与手关节相关联,已经证明是一个挑战。

到目前为止提出的解决方案:将“手部模拟”模式更改为手势。不幸的是,手势消除了使用手进行 HL2 测试的能力,并且不提供鼠标左键的“选择”或“捏合”行为。所以它要么不能正常工作,要么不是正确的解决方案。

我们看不到为什么不能在编辑器中同时测试 HL1 和 HL2 的原因。当手不使用时,我们只是错过了使用鼠标左键。

这是我为鼠标左键创建的用于发送“选择”事件的服务扩展。这将在“Intractable”上触发 OnClick() 事件。它还缺少用鼠标左键移动或操纵“操纵处理程序”的“捏”能力。

[MixedRealityDataProvider(
        typeof(IMixedRealityInputSystem),
        (SupportedPlatforms)(-1), // All platforms supported by Unity
        "Unity Mouse Device Manager")]
    public class TharynMouseService : BaseInputDeviceManager, ITharynMouseService
    {
        private TharynMouseServiceProfile tharynMouseServiceProfile;

        public TharynMouseService(
            IMixedRealityServiceRegistrar registrar,
            IMixedRealityInputSystem inputSystem,
            string name,  
            uint priority,  
            BaseMixedRealityProfile profile) : base(registrar, inputSystem, name, priority, profile) 
        {
            tharynMouseServiceProfile = (TharynMouseServiceProfile)profile;
        }

        private IMixedRealityInputSource inputSource;
        private IMixedRealityInputSystem inputSystem;

        public override void Initialize()
        {
            // Do service initialization here.
            inputSystem = Service as IMixedRealityInputSystem;
            Debug.Log("inputSystem: " + inputSystem);

            inputSource = inputSystem.RequestNewGenericInputSource("Tharyn Mouse Service");
            Debug.Log("inputSource: " + inputSource);

            inputSystem.RaiseSourceDetected(inputSource);
        }

        public override void Update()
        {
            // Do service updates here.
            if (UnityEngine.Input.GetKeyDown(KeyCode.Mouse0))
            {
                inputSystem.RaiseOnInputUp(inputSource, Handedness.None, tharynMouseServiceProfile.TapAction);
                Debug.Log("Down");
                Debug.Log("inputSystem: " + inputSystem);
                Debug.Log("inputSource: " + inputSource);
                Debug.Log("TapAction: " + tharynMouseServiceProfile.TapAction);
            }
        }
    }

需求:

  1. 在释放空格键以返回注视光标时触发与“1”键相同的事件。
  2. 扩展上述服务以包含“Pinch”事件/动作,以便可以像使用 Hands 一样使用 Gaze 和 Mouse 操作对象。

提前干杯和感谢!

塔林

4

1 回答 1

1

您可以通过创建一个向 MRTK 输入系统调用 OnInputDown 和 OnInputUp 事件的组件,实现仅使用鼠标 + 光标模拟手捏、手释放事件的能力。然后,您需要将此组件附加到场景中的游戏对象。

模拟 OnInputDown 和 OnInputUp 事件的关键代码如下:

public void Update()
{
    if (Input.GetMouseButtonDown(0))
    {
        InputSystem?.RaiseOnInputDown(
            InputSource,
            Handedness.Right,
            selectAction
            );
    }
    if (Input.GetMouseButtonUp(0))
    {
        InputSystem?.RaiseOnInputUp(
            InputSource,
            Handedness.Right,
            selectAction
            );
    }
}

这是一个组件的完整代码,它将引发输入 down 和 up 事件,这将允许您仅使用鼠标模拟捏和拖动 + 移动:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System;
using Microsoft.MixedReality.Toolkit.Input;
using Microsoft.MixedReality.Toolkit;
using Microsoft.MixedReality.Toolkit.Utilities;

public class SimulateSelectOnClick : MonoBehaviour
{
    private IMixedRealityInputSystem inputSystem = null;

    protected IMixedRealityInputSystem InputSystem
    {
        get
        {
            if (inputSystem == null)
            {
                MixedRealityServiceRegistry.TryGetService<IMixedRealityInputSystem>(out inputSystem);
            }
            return inputSystem;
        }
    }

    private IMixedRealityInputSource inputSource;
    private MixedRealityInputAction selectAction;

    private IMixedRealityInputSource InputSource
    {
        get
        {
            if (inputSource != null)
            {
                return inputSource;
            }
            inputSource = new BaseGenericInputSource("SimulateSelect",
               new IMixedRealityPointer[] { InputSystem.GazeProvider.GazePointer }, InputSourceType.Hand) ;
            return inputSource;
        }
    }

    public void Start()
    {
        var inputActions = MixedRealityToolkit.Instance.ActiveProfile.InputSystemProfile.InputActionsProfile.InputActions;
        selectAction = new MixedRealityInputAction();
        for (int i = 0; i < inputActions.Length; i++)
        {
            if (inputActions[i].Description.Equals("select", StringComparison.CurrentCultureIgnoreCase))
            {
                selectAction = inputActions[i];
            }
        }
    }

    public void Update()
    {
        if (Input.GetMouseButtonDown(0))
        {
            InputSystem?.RaiseOnInputDown(
                InputSource,
                Handedness.Right,
                selectAction
                );
        }
        if (Input.GetMouseButtonUp(0))
        {
            InputSystem?.RaiseOnInputUp(
                InputSource,
                Handedness.Right,
                selectAction
                );
        }
    }
}
于 2019-07-25T04:02:27.893 回答