【问题标题】:How to turn off Motion Controller line pointer如何关闭运动控制器线指针
【发布时间】:2020-03-20 04:04:09
【问题描述】:

就是这样,我会踩到我的骄傲!

我正在使用 MRTK v2 并且工作正常,除了在某些时候我想关闭从运动控制器延伸到对象并提供输入的线。在环顾四周并试图在 MRTK 文档中找到它之后(它一定很容易,对吧?),我仍然把头撞在墙上,它开始受伤了......

MRTK 文档很好地解释了如何在此处进行配置:

https://github.com/microsoft/MixedRealityToolkit-Unity/blob/mrtk_release/Documentation/Input/Pointers.md

但我希望在脚本中执行此操作,在我的应用程序中根据需要启用和禁用它。

任何线索如何做到这一点?

非常感谢!

【问题讨论】:

  • 我不认为我理解您的问题,也许您使用的术语不正确。您是要禁用行指针(这由指针配置文件中的 DefaultControllerPointer 表示)还是调解器?中介是一个组件,它根据系统的状态启用和禁用其他指针,如 DefaultControllerPointer 和 SpherePointer。
  • 你说得对,Julia,我可能还不太了解这些术语,我的意思是从运动控制器延伸出来的线指针。我希望 MRTK 脚本有一个清晰的教程/脚本/说明,但是由于我在这里只能问一个问题,所以让我们使用行指针。感谢您的帮助!
  • 嗨弗朗索瓦我这个周末开始为你解答,但由于我被一个 P0 问题分心了,所以还没有完成。我认为最好的方法是扩展/修改 DefaultPointerMediator 类并从 FocusProvider 公开对它的引用。我正在为您解答,请期待今天或明天。
  • 非常感谢朱莉娅!

标签: pointers controller mrtk


【解决方案1】:

回答了我自己的问题。简单:

PointerUtils.SetMotionControllerRayPointerBehavior(PointerBehavior.AlwaysOff);

在此处查看文档:https://github.com/microsoft/MixedRealityToolkit-Unity/blob/mrtk_release/Documentation/Input/Pointers.md

【讨论】:

    【解决方案2】:

    好问题!这是一种对我有用的方法。您可以在此存储库中查看我的解决方案:https://github.com/julenka/MixedRealityToolkit-Unity/tree/so/linepointer_off。打开场景Assets/TurnOffLinePointerTest.unity,然后使用手模拟按下按钮。开启/关闭指针的代码在Assets/PointerConfigurationExample.cs

    注意:之所以需要使用这种修改中介而不是直接设置myPointer.IsActive = false的方法是因为默认中介每帧都会覆盖这些值。幸运的是,您可以自定义此行为。

    第 1 步:稍微更新 MRTK,以便可以访问 PointerMediator

    将更改 from this commit 应用到您的 MRTK 克隆。此更改更新了 MRTK 中的 FocusProvider 以使 PointerMediator 可公开访问,并通过更新要保护而不是私有的字段并使方法虚拟化来使 DefaultPointerMediator 可扩展。请参阅this pull request,它将此更改直接实现到 MRTK。

    第 2 步:创建一个将关闭远指针的自定义 PointerMediator

    创建一个自定义指针中介器,例如the one from this commit

    using System.Collections.Generic;
    using Microsoft.MixedReality.Toolkit.Input;
    
    public class CustomPointerMediator : DefaultPointerMediator
    {
        public bool FarPointersDisabled {get; set;}
    
        public override void UpdatePointers()
        {
            base.UpdatePointers();
            if (FarPointersDisabled)
            {
                foreach(var pointer in farInteractPointers)
                {
                    pointer.IsActive = false;
                }
            }
        }
    }
    

    请注意,此中介器扩展了DefaultPointerMediator,因此它适应了几乎所有默认中介器逻辑。确保您已完全应用更改from the first commit,否则您将无法扩展DefaultPointerMediator

    第 3 步:告诉 MRTK 使用您的自定义指针调解器

    在您的指针配置文件中,将 MRTK 配置为使用自定义指针中介而不是默认指针中介。请注意图片中我创建了一个自定义指针配置文件作为自定义输入系统的一部分(不要修改默认配置文件,否则您的更改可能会在您更新 MRTK 时被覆盖)。

    第 4 步:使用自定义中介器打开/关闭行指针的组件

    您现在可以编写您的组件,该组件将使用您的自定义调解器来打开和关闭行指针。

    public class PointerConfigurationExample : MonoBehaviour
    {
        /* Turns off all far interaction pointers */
        public void TurnOffFarPointers()
        {
            Debug.Log("Line pointers off");
            SetFarPointersDisabled(true);
        }
    
        public void TurnOnFarPointers()
        {
            Debug.Log("Line pointers on");
            SetFarPointersDisabled(false);
        }
    
        private void SetFarPointersDisabled(bool isDisabled)
        {
            FocusProvider focusProvider = (FocusProvider) MixedRealityToolkit.InputSystem.FocusProvider;
            if (focusProvider != null)
            {
                foreach(var mediator in focusProvider.PointerMediators)
                {
                    // Note: you could check here to make sure you only disable pointers for hands
                    CustomPointerMediator myMediator = (CustomPointerMediator) (mediator.Value);
                    if (myMediator != null)
                    {
                        myMediator.FarPointersDisabled = isDisabled;
                    }
                }
            }
        }
    }
    

    【讨论】:

    • 非常感谢朱莉娅。我知道你花了很多时间在这上面!这让我想知道为什么那些构思 MRTK 的人在它是一个非常基本的功能时将这个操作如此复杂,相当于关闭鼠标光标或以编程方式替换它......但再次感谢你,我一直在寻找这么久要做到这一点,我离新手程序员还很远!让我觉得不那么羞耻了……
    • 编译时出现错误:Assets\MixedRealityToolkit-Unity-mrtk_release\Assets\MixedRealityToolkit.Services\InputSystem\FocusProvider.cs(451,17): error CS0246: The type or namespace name找不到“GazePointerVisibilityStateMachine”(您是否缺少 using 指令或程序集引用?)知道这可能是什么吗?
    • 嗨,是的,这是来自最新的 mrtk_development 中的一个类,但您可能还没有。确保只复制我的提交 (github.com/julenka/MixedRealityToolkit-Unity/commit/…) 中概述的更改,而不是整个文件。
    • 太棒了!工作很棒!非常感谢!
    • 嗨 Julia,由于我已经升级到 MRTK 2.3 版,这不起作用。 “FocusProvider focusProvider = (FocusProvider) MixedRealityToolkit.InputSystem.FocusProvider;”这一行给我一个无效的类型转换错误……。有什么提示吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多