mrtk_developmentreleases/2.0.0releases/2.1.0releases/2.2.0
  • 指南
  • API 文档
  • 指南
  • 架构
  • 输入系统
  • Controllers, pointers, and focus

    Show / Hide Table of Contents
    • MRTK入门
      • 发布说明
      • MRTK包内容
      • 从早期版本更新
      • 从HTK更新
      • 生成和部署MRTK
      • NuGet包
      • MRTK配置对话框
      • 开始使用 MRTK和XR SDK
      • 性能
      • 全息图稳定
      • 在大型项目中使用MRTK
    • 架构
      • 概述
      • 框架和运行时
      • 输入系统
        • 术语
        • 核心系统
        • Controllers, pointers, and focus
      • 系统,扩展服务和 data providers
    • 功能概述
      • 边界系统 Boundary System
        • 边界系统概述
        • 配置边界可视化
      • 相机系统 Camera System
        • 相机系统概述
        • Camera Settings Providers
          • Windows 混合现实相机设置
          • Unity AR相机设置[实验性]
          • 创建camera settings provider
      • 跨平台支持
        • 为iOS和Android配置MRTK
      • 检测平台能力
      • 诊断系统 Diagnostics System
        • 诊断系统概述
        • 配置诊断系统
        • 使用可视化分析器
      • 扩展服务 Extension Services
        • 扩展服务创建向导
        • 场景过渡服务概述
      • 输入系统 Input System
        • 输入概览
        • 输入动作 Input Actions
        • 输入事件 Input Events
        • Input Providers
          • Input Providers 概述
          • 创建一个 input data provider
        • 控制器 Controllers
        • 眼动跟踪 Eyes
          • 概述
          • 入门
          • 通过代码访问数据
          • 验证跟踪校准 Validate Tracking Calibration
        • 凝视 Gaze
        • 手势 Gestures
        • 手部 Hands
        • 如何添加近距离交互 Near Interaction
        • 编辑器内输入模拟 In-Editor Input Simulation
        • 指针 Pointers
        • 语音输入 Voice Input
          • 语音转录 Dictation
          • 语音(命令和控制) Speech
      • 多场景系统 Multi Scene System
        • 多场景系统概述
        • 场景类型 Scene Types
        • 内容场景加载 Content Scene Loading
        • 监测内容加载 Monitoring Content Loading
        • 光照场景操作 Lighting Scene Operations
      • 打包 Packaging
        • MRTK包 MRTK Packages
        • MRTK模块化 MRTK Modularization
      • 配置文件 Profiles
        • 配置文件概述
        • 配置指南 Configuration Guide
      • 渲染 Rendering
        • 材质实例概述 Material Instance Overview
        • Shaders
          • MRTK标准着色器 MRTK Standard Shader
      • 服务 Services
        • 什么是混合现实特性
        • 什么是 MixedRealityServiceRegistry 和IMixedRealityServiceRegistrar
        • 扩展服务 Extension services
      • 空间感知系统 Spatial Awareness System
        • 空间感知概述
        • Spatial Observers
          • 为设备配置 Observers
          • 为Editor配置 Observers
          • 通过代码控制 Observers
          • 创建自定义 Observer
      • 传送系统概述 Teleport System Overview
      • 工具
        • Dependency Window
        • Extension Service Creation Wizard
        • Holographic Remoting
        • Input Animation Recording
          • Input Animation File Format Specification
        • Optimize Window
        • Runtime tools
          • Controller Mapping tool
      • UX 构建模块
        • 工具箱窗口 Toolbox Window
        • 按钮 Button
        • 边界框 Bounding Box
        • 对象操纵器 Object Manipulator
        • Manipulation Handler [废弃]
        • Slate
        • 系统键盘 System Keyboard
        • 可交互的 Interactable
        • Solvers
          • 点击放置 Tap to Place
        • 对象集合 Object Collection
        • 提示工具条 Tooltips
        • 滑动条 Slider
        • 手部菜单 Hand Menu
        • 近处菜单 Near Menu
        • 应用程序栏 App Bar
        • 指尖可视化 Fingertip Visualization
        • 进度指示器 Progress Indicator
        • 对话框 Dialog [实验性]
        • 手势教学 Hand Coach [实验性]
        • 可滚动对象集合 Scrolling Object Collection [实验性]
        • 脉冲着色器 Pulse Shader [实验性]
        • 停靠控件 Dock Control [实验性]
        • HoloLens键盘助手 [实验性]
      • 示例场景
        • 示例中心
        • 手势交互示例场景
        • 眼动跟踪示例场景
    • Contributing
      • Contributing Overview
      • Coding Guidelines
      • Writing and Running Tests
      • Writing Documentation
      • Pull Requests
      • Experimental Features
      • Breaking Changes
      • How to use DocFX
    • Planning
      • Roadmap
    • Notice
    • Authors

    控制器,指针和焦点

    控制器,指针和焦点(Controllers, pointers, and focus)是更高级的概念,它们建立在核心输入系统所建立的基础之上。它们一起提供了场景中与对象交互的大部分机制。

    Controllers (控制器)

    控制器表示物理控制器(6个自由度,全关节手等)。它们是由设备管理器创建的,负责与相应的底层系统进行通信,并将该数据转换为MRTK形数据和事件。

    例如,在Windows Mixed Reality平台上,WindowsMixedRealityArticulatedHand是一个控制器,负责与底层Windows手部追踪API交互,获取有关手的关节,姿势和其他属性的信息。它负责将这些数据转换为相关的MRTK事件(例如,通过调用RaisePoseInputChanged或RaiseHandJointsUpdated)并更新其内部状态,以便对TryGetJointPose的查询将返回正确的数据。

    通常,控制器的生命周期将涉及:

    1. 在检测到新来源(例如,检测并开始跟踪一只手)时,设备管理器就会创建一个控制器。
    2. 在控制器的Update()循环中,它调用其底层API系统。
    3. 在同一更新循环中,它通过直接调用核心输入系统本身来引发输入事件更改(例如,引发HandMeshUpdated或HandJointsUpdated)。

    Pointers and focus (指针和焦点)

    指针用于与游戏对象进行交互。本节介绍如何创建指针,如何更新指针以及如何确定被聚焦的对象。它还将介绍存在的不同类型的指针以及它们处于活动状态的场景。

    指针类别

    指针通常属于以下类别之一:

    • Far pointers(远指针)

      这些类型的指针用于与距离用户较远的对象进行交互(“远距离”仅定义为“不靠近”)。这些类型的指针通常会投射出可以深入世界的线,并允许用户与不紧邻它们的对象进行交互并对其进行操作。

    • Near pointers(近指针)

      这些类型的指针用于与距离用户足够近的对象进行交互以进行抓取,触摸和操纵。通常,这些类型的指针通过查找附近的对象来与对象进行交互。(通过在较小范围内进行射线投射,进行球面投射来查找附近的对象,或者枚举被认为是可抓取/可触摸的对象列表)。

    • Teleport pointers(传送指针)

      这些类型的指针插入到传送系统(teleportation system)中,以处理将用户移动到指针指向的位置。

    Pointer mediation(指针调解器)

    因为单个控制器可以具有多个指针(例如,全关节手可以具有近距交互指针和远距交互指针),所以存在一个组件,负责调解哪个指针应处于活动状态。

    例如,当用户的手接近可按下的按钮时,ShellHandRayPointer应该停止显示,并且PokePointer 应该被启用。

    这是由DefaultPointerMediator处理的,它负责根据所有指针的状态确定哪些指针处于活动状态。它做的一个关键事情是当一个近指针靠近对象时,禁用远指针 (参见 DefaultPointerMediator).

    可以通过更改指针配置文件上的 PointerMediator属性来提供指针调解器的替代实现。

    如何禁用指针

    由于指针调解器每帧运行,所以它最终控制所有指针的活动/非活动状态。因此,如果在代码中设置了指针的IsInteractionEnabled属性,则指针调解器将在每帧覆盖它。相反,您可以指定 PointerBehavior 控制指针是打开还是关闭自己。请注意,这仅在使用MRTK中的 FocusProvider 和 DefaultPointerMediator 默认设置时有效。

    示例:在MRTK中禁用手部射线

    以下代码将关闭MRTK中的手部射线:

    // 关闭所有手部射线
    PointerUtils.SetHandRayPointerBehavior(PointerBehavior.AlwaysOff);
    
    // 仅关闭右手的射线
    PointerUtils.SetHandRayPointerBehavior(PointerBehavior.AlwaysOff, Handedness.Right);
    

    以下代码将使手部射线返回其在MRTK中的默认行为:

    PointerUtils.SetHandRayPointerBehavior(PointerBehavior.Default);
    

    以下代码将强制打开手射线,无论是否靠近可抓取的物体:

    // 打开所有手部射线
    PointerUtils.SetHandRayPointerBehavior(PointerBehavior.AlwaysOn);
    

    查看 PointerUtils 和 TurnPointersOnOff 有关更多示例。

    FocusProvider

    FocusProvider 是负责遍历所有指针列表并弄清楚每个指针的焦点对象是什么的主力部分。

    在每个Update()调用中,这将:

    1. 通过射线投射并执行指针本身配置的命中检测来更新所有指针(例如,球体指针可以指定SphereOverlap raycastMode,因此FocusProvider将进行基于球体的碰撞)

    2. 在每个指针的基础上更新聚焦对象(即,如果一个对象获得焦点,它也会触发那些对象的事件,如果一个对象失去焦点,它将触发焦点丢失,等等)。

    指针配置和生命周期

    指针可以配置 在输入系统配置文件的Pointers部分中。

    The lifetime of a pointer is generally the following:

    1. 设备管理器将检测到控制器的存在。然后,该设备管理器将通过调用 RequestPointers来创建与控制器关联的一组指针.

    2. FocusProvider在其Update()循环中,将遍历所有有效指针并执行关联的射线或命中检测逻辑。所以也有可能同时有多个焦点对象。

      • 因为有可能同时有多个输入源处于活动状态(例如,两只手处于激活状态),所以也可以有多个对象同时聚焦。
    3. 当发现控制器源丢失时,设备管理器将销毁与丢失的控制器关联的指针。

    • Improve this Doc
    In This Article
    • Controllers (控制器)
    • Pointers and focus (指针和焦点)
      • 指针类别
    • Pointer mediation(指针调解器)
      • 如何禁用指针
        • 示例:在MRTK中禁用手部射线
      • FocusProvider
      • 指针配置和生命周期
    Back to top Generated by DocFX