HoloLens (1-го поколения) Ввод 211: жест

Важно!

Учебники по Смешанная реальность Академии были разработаны с учетом HoloLens (1-го поколения), Unity 2017 и Смешанная реальность иммерсивных гарнитур. Поэтому мы считаем, что важно оставить эти руководства для разработчиков, которые ищут рекомендации по разработке для этих устройств. Эти руководства не будут обновлены с учетом последних наборов инструментов или взаимодействий, используемых для HoloLens 2 и могут быть несовместимы с более новыми версиями Unity. Они будут сохранены для работы на поддерживаемых устройствах. Опубликован новый цикл руководств для HoloLens 2.

Жесты превращают намерение пользователя в действие. С помощью жестов пользователи могут взаимодействовать с голограммами. В этом курсе мы узнаем, как отслеживать руки пользователя, реагировать на введенные пользователем данные и оставить отзыв пользователю в зависимости от состояния и расположения руки.

В mr basics 101 мы использовали простой жест касания воздуха для взаимодействия с голограммами. Теперь мы выйдем за рамки жеста касания воздуха и рассмотрим новые концепции, чтобы:

  • Определите, когда отслеживается рука пользователя, и предоставьте ей отзыв.
  • Используйте жест навигации для поворота голограмм.
  • Оставьте отзыв, когда рука пользователя вот-вот выйдет из виду.
  • Используйте события манипуляции, чтобы пользователи могли перемещать голограммы руками.

В этом курсе мы вернемся к модели проекта Unity Обозреватель, которую мы создали на входных данных СМЕШАННОй реальности 210. Наш друг-астронавт вернулся, чтобы помочь нам в изучении этих новых концепций жестов.

Важно!

Видео, внедренные в каждую из приведенных ниже глав, были записаны с помощью более старой версии Unity и Смешанная реальность Toolkit. Хотя пошаговые инструкции являются точными и актуальными, сценарии и визуальные элементы могут отображаться в соответствующих видео, которые устарели. Видео по-прежнему включены для потомков и потому, что рассматриваемые концепции по-прежнему применяются.

Поддержка устройств

Курс HoloLens Иммерсивные гарнитуры
211. Ввод в смешанной реальности: жесты ✔️ ✔️

Прежде чем начать

Предварительные условия

Файлы проекта

  • Скачайте файлы , необходимые для проекта. Требуется Unity 2017.2 или более поздней версии.
  • Разархивируйте файлы на рабочем столе или в другом удобном расположении.

Примечание

Если вы хотите просмотреть исходный код перед скачиванием, он доступен на GitHub.

Errata и заметки

  • Чтобы достичь точек останова в коде, в Visual Studio в разделе Сервис-Параметры-Отладка>> необходимо отключить (снять флажок) "Включить только мой код".

Глава 0. Настройка Unity

Instructions

  1. Запустите Unity.
  2. Выберите Открыть.
  3. Перейдите в папку Жест , ранее не архивированную.
  4. Найдите и выберите папку Начальная/модель Обозреватель.
  5. Нажмите кнопку Выбрать папку .
  6. На панели Проект разверните папку Scenes .
  7. Дважды щелкните сцену ModelExplorer , чтобы загрузить ее в Unity.

Сборка

  1. В Unity выберите Параметры сборки файлов>.
  2. Если Scenes/ModelExplorer отсутствует в списке Scenes In Build, щелкните Добавить открытые сцены , чтобы добавить сцену.
  3. Если вы разрабатываете специально для HoloLens, задайте для параметра Целевое устройство значение HoloLens. В противном случае оставьте его в поле Любое устройство.
  4. Убедитесь, что для параметра Тип сборки задано значение D3D , а для пакета SDKзначение Последняя установленная версия (это должен быть пакет SDK 16299 или более поздней версии).
  5. Щелкните Построить.
  6. Создайте новую папку с именем App.
  7. Щелкните папку App одним щелчком.
  8. Нажмите выбрать папку , и Unity начнет сборку проекта для Visual Studio.

По завершении работы Unity появится окно проводник.

  1. Откройте папку Приложение .
  2. Откройте решение ModelExplorer Для Visual Studio.

При развертывании в HoloLens:

  1. С помощью верхней панели инструментов в Visual Studio измените целевой объект с Отладка на Выпуск и с ARM на x86.
  2. Щелкните стрелку раскрывающегося списка рядом с кнопкой Локальный компьютер и выберите Удаленный компьютер.
  3. Введите IP-адрес устройства HoloLens и задайте для параметра Режим проверки подлинности значение Универсальный (незашифрованный протокол). Нажмите кнопку Выбрать. Если вы не знаете IP-адрес устройства, просмотрите раздел Параметры > Сеть & Дополнительные параметры браузера>.
  4. В верхней строке меню выберите Отладка —> запуск без отладки или нажмите клавиши CTRL+F5. Если развертывание выполняется на устройстве впервые, необходимо связать его с Visual Studio.
  5. После развертывания приложения закройте Fitbox жестом выбора.

При развертывании в иммерсивной гарнитуре:

  1. С помощью верхней панели инструментов в Visual Studio измените целевой объект с Отладка на Выпуск и с ARM на x64.
  2. Убедитесь, что для целевого объекта развертывания задано значение Локальный компьютер.
  3. В верхней строке меню выберите Отладка —> запуск без отладки или нажмите клавиши CTRL+F5.
  4. После развертывания приложения закройте Fitbox , натянув триггер на контроллере движения.

Примечание

Вы можете заметить некоторые красные ошибки на панели Ошибок Visual Studio. Их можно игнорировать. Перейдите на панель Вывод, чтобы просмотреть фактический ход выполнения сборки. Для ошибок на панели Вывод потребуется внести исправление (чаще всего они вызваны ошибкой в сценарии).

Глава 1. Обратная связь, обнаруженная рукой

Задачи

  • Подпишитесь на события отслеживания рук.
  • Используйте обратную связь курсора, чтобы отображать пользователей при отслеживании руки.

Примечание

На HoloLens 2 руки обнаружены, когда видны руки (а не только когда палец указывает вверх).

Instructions

  • На панели Иерархия разверните объект InputManager .
  • Найдите и выберите объект GesturesInput .

Скрипт InteractionInputSource.cs выполняет следующие действия:

  1. Подписывается на события InteractionSourceDetected и InteractionSourceLost.
  2. Задает состояние HandDetected.
  3. Отмена подписок на события InteractionSourceDetected и InteractionSourceLost.

Далее мы обновим курсор с входных данных 210 mr до курсора, который отображает отзывы в зависимости от действий пользователя.

  1. На панели Иерархия выберите объект Cursor и удалите его.
  2. На панели Проект найдите CursorWithFeedback и перетащите его на панель Иерархия .
  3. Щелкните InputManager на панели Иерархия, а затем перетащите объект CursorWithFeedback из hierarchy в поле КурсорSimpleSinglePointerSelector InputManager в нижней части инспектора.
  4. Щелкните CursorWithFeedback в иерархии.
  5. На панели Инспектор разверните узел Данные состояния курсора в скрипте Объектный курсор .

Данные состояния курсора работают следующим образом:

  • Любое состояние Наблюдения означает, что рука не обнаружена, и пользователь просто смотрит вокруг.
  • Любое состояние Взаимодействия означает, что обнаружена рука или контроллер.
  • Любое состояние наведении означает, что пользователь просматривает голограмму.

Построение и Развертывание

  • В Unity используйте параметры сборки файлов > для перестроения приложения.
  • Откройте папку Приложение .
  • Если оно еще не открыто, откройте решение ModelExplorer Visual Studio.
    • (Если вы уже создали или развернули этот проект в Visual Studio во время настройки, вы можете открыть этот экземпляр VS и щелкнуть "Перезагрузить все" при появлении запроса).
  • В Visual Studio щелкните Отладка —> запуск без отладки или нажмите клавиши CTRL+F5.
  • После развертывания приложения в HoloLens закройте fitbox с помощью жеста касания воздуха.
  • Переместите руку в поле зрения и наведите указательный палец на небо, чтобы начать отслеживание рук.
  • Перемещение руки влево, вправо, вверх и вниз.
  • Посмотрите, как курсор меняется, когда рука обнаруживается, а затем теряется в представлении.
  • Если вы используете иммерсивную гарнитуру, вам придется подключить и отключить контроллер. Эта обратная связь становится менее интересной на иммерсивном устройстве, так как подключенный контроллер всегда будет "доступен".

Глава 2. Навигация

Задачи

  • Используйте события жеста навигации для поворота астронавта.

Instructions

Чтобы использовать жесты навигации в нашем приложении, мы изменим файл GestureAction.cs для поворота объектов при выполнении жеста навигации. Кроме того, мы добавим обратную связь для курсора, который будет отображаться при доступности навигации.

  1. На панели Иерархия разверните узел CursorWithFeedback.
  2. В папке Holograms найдите ресурс ScrollFeedback .
  3. Перетащите заготовку ScrollFeedback на gameObject CursorWithFeedback в иерархии.
  4. Щелкните CursorWithFeedback.
  5. На панели Инспектор нажмите кнопку Добавить компонент .
  6. В меню введите в поле поиска CursorFeedback. Выберите результат поиска.
  7. Перетащите объект ScrollFeedback из hierarchy в свойство Scroll Detected Game Object компонента Cursor Feedback (Обратная связь курсора ) в инспекторе.
  8. На панели Иерархия выберите объект AstroMan .
  9. На панели Инспектор нажмите кнопку Добавить компонент .
  10. В меню введите в поле поиска Действие жеста. Выберите результат поиска.

Затем откройте Файл GestureAction.cs в Visual Studio. В упражнении 2.c измените скрипт, чтобы сделать следующее:

  1. Поворачивайте объект AstroMan при каждом выполнении жеста навигации.
  2. Вычислите объект rotationFactor , чтобы управлять объемом поворота, примененного к объекту.
  3. Поворачивайте объект вокруг оси Y, когда пользователь перемещает руку влево или вправо.

Выполните упражнение по написанию кода 2.c в скрипте или замените код готовым решением ниже:

using HoloToolkit.Unity.InputModule;
using UnityEngine;

/// <summary>
/// GestureAction performs custom actions based on
/// which gesture is being performed.
/// </summary>
public class GestureAction : MonoBehaviour, INavigationHandler, IManipulationHandler, ISpeechHandler
{
    [Tooltip("Rotation max speed controls amount of rotation.")]
    [SerializeField]
    private float RotationSensitivity = 10.0f;

    private bool isNavigationEnabled = true;
    public bool IsNavigationEnabled
    {
        get { return isNavigationEnabled; }
        set { isNavigationEnabled = value; }
    }

    private Vector3 manipulationOriginalPosition = Vector3.zero;

    void INavigationHandler.OnNavigationStarted(NavigationEventData eventData)
    {
        InputManager.Instance.PushModalInputHandler(gameObject);
    }

    void INavigationHandler.OnNavigationUpdated(NavigationEventData eventData)
    {
        if (isNavigationEnabled)
        {
            /* TODO: DEVELOPER CODING EXERCISE 2.c */

            // 2.c: Calculate a float rotationFactor based on eventData's NormalizedOffset.x multiplied by RotationSensitivity.
            // This will help control the amount of rotation.
            float rotationFactor = eventData.NormalizedOffset.x * RotationSensitivity;

            // 2.c: transform.Rotate around the Y axis using rotationFactor.
            transform.Rotate(new Vector3(0, -1 * rotationFactor, 0));
        }
    }

    void INavigationHandler.OnNavigationCompleted(NavigationEventData eventData)
    {
        InputManager.Instance.PopModalInputHandler();
    }

    void INavigationHandler.OnNavigationCanceled(NavigationEventData eventData)
    {
        InputManager.Instance.PopModalInputHandler();
    }

    void IManipulationHandler.OnManipulationStarted(ManipulationEventData eventData)
    {
        if (!isNavigationEnabled)
        {
            InputManager.Instance.PushModalInputHandler(gameObject);

            manipulationOriginalPosition = transform.position;
        }
    }

    void IManipulationHandler.OnManipulationUpdated(ManipulationEventData eventData)
    {
        if (!isNavigationEnabled)
        {
            /* TODO: DEVELOPER CODING EXERCISE 4.a */

            // 4.a: Make this transform's position be the manipulationOriginalPosition + eventData.CumulativeDelta
        }
    }

    void IManipulationHandler.OnManipulationCompleted(ManipulationEventData eventData)
    {
        InputManager.Instance.PopModalInputHandler();
    }

    void IManipulationHandler.OnManipulationCanceled(ManipulationEventData eventData)
    {
        InputManager.Instance.PopModalInputHandler();
    }

    void ISpeechHandler.OnSpeechKeywordRecognized(SpeechEventData eventData)
    {
        if (eventData.RecognizedText.Equals("Move Astronaut"))
        {
            isNavigationEnabled = false;
        }
        else if (eventData.RecognizedText.Equals("Rotate Astronaut"))
        {
            isNavigationEnabled = true;
        }
        else
        {
            return;
        }

        eventData.Use();
    }
}

Вы заметите, что другие события навигации уже заполнены некоторыми сведениями. Мы помещаем GameObject в модальный стек InputSystem набора средств, поэтому пользователю не нужно сохранять фокус на астронавте после начала ротации. Соответственно, мы выводим GameObject из стека после завершения жеста.

Построение и Развертывание

  1. Перестройте приложение в Unity, а затем выполните сборку и развертывание из Visual Studio, чтобы запустить его в HoloLens.
  2. Взгляд на астронавта, две стрелки должны появиться по обе стороны курсора. Этот новый визуальный элемент указывает, что астронавт может быть поворачиваться.
  3. Поместите руку в готовое положение (указательный палец, направленный к небу), чтобы HoloLens начал отслеживать вашу руку.
  4. Чтобы повернуть астронавта, опустите указательный палец в положение сжатия, а затем переместите руку влево или вправо, чтобы активировать жест NavigationX.

Глава 3. Руководство для рук

Задачи

  • Используйте оценку ручного руководства , чтобы спрогнозировать, когда будет потеряна функция отслеживания рук.
  • Оставьте отзыв о курсоре , чтобы показать, когда рука пользователя приближается к краю обзора камеры.

Instructions

  1. На панели Иерархия выберите объект CursorWithFeedback .
  2. На панели Инспектор нажмите кнопку Добавить компонент .
  3. В меню введите в поле поиска Руководство для рук. Выберите результат поиска.
  4. В папке Holograms панели проект найдите ресурс HandGuidanceFeedback.
  5. Перетащите ресурс HandGuidanceFeedback в свойство Индикатор управления руками на панели Инспектор .

Построение и Развертывание

  • Перестройте приложение в Unity, а затем выполните сборку и развертывание из Visual Studio, чтобы использовать приложение на HoloLens.
  • Приведите руку в поле зрения и поднимите указательный палец, чтобы отследить.
  • Начните поворачивать астронавта с помощью жеста навигации (сжать указательный палец и большой палец вместе).
  • Переместите руку влево, вправо, вверх и вниз.
  • Когда рука приближается к краю рамки жеста, рядом с курсором должна появиться стрелка, предупреждающая о том, что отслеживание рук будет потеряно. Стрелка указывает, в каком направлении следует переместить руку, чтобы предотвратить потерю отслеживания.

Глава 4. Манипуляция

Задачи

  • Используйте события Манипуляции для перемещения астронавта руками.
  • Оставьте отзыв о курсоре, чтобы сообщить пользователю, когда можно использовать манипуляцию.

Instructions

GestureManager.cs и AstronautManager.cs позволяют выполнять следующие действия:

  1. Используйте речевой ключевое слово "Переместить астронавта", чтобы включить жесты манипуляции и "Повернуть астронавта", чтобы отключить их.
  2. Переключитесь на реагирование на распознаватель жестов манипуляции.

Итак, начнем.

  1. На панели Иерархия создайте пустой GameObject. Назовите его "AstronautManager".
  2. На панели Инспектор нажмите кнопку Добавить компонент .
  3. В меню введите в поле поиска Менеджер астронавтов. Выберите результат поиска.
  4. На панели Инспектор нажмите кнопку Добавить компонент .
  5. В меню введите в поле поиска Источник речевых данных. Выберите результат поиска.

Теперь мы добавим голосовые команды, необходимые для управления состоянием взаимодействия астронавта.

  1. Разверните раздел Ключевые слова в инспекторе.
  2. Щелкните в + правой части, чтобы добавить новый ключевое слово.
  3. Введите ключевое слово Move Astronaut (Переместить астронавта). При желании вы можете добавить сочетание клавиш.
  4. Щелкните в + правой части, чтобы добавить новый ключевое слово.
  5. Введите ключевое слово Повернуть астронавта. При желании вы можете добавить сочетание клавиш.
  6. Соответствующий код обработчика можно найти в файле GestureAction.cs в обработчике ISpeechHandler.OnSpeechKeywordRecognized .

Настройка источника речевых данных для главы 4

Далее мы настроим обратную связь о манипуляциях для курсора.

  1. В папке Holograms панели Проект найдите ресурс PathingFeedback.
  2. Перетащите заготовку PathingFeedback в объект CursorWithFeedback в иерархии.
  3. На панели Иерархия щелкните CursorWithFeedback.
  4. Перетащите объект PathingFeedback из hierarchy в свойство Pathing Detected Game Object компонента Cursor Feedback в инспекторе.

Теперь нам нужно добавить код в Файл GestureAction.cs , чтобы включить следующее:

  1. Добавьте код в функцию IManipulationHandler.OnManipulationUpdated , которая перемещает астронавта при обнаружении жеста манипуляции .
  2. Вычислите вектор движения , чтобы определить, куда следует переместить астронавта на основе положения руки.
  3. Переместить астронавта на новую позицию.

Выполните упражнение по написанию кода 4.a в Файле GestureAction.cs или используйте наше готовое решение ниже:

using HoloToolkit.Unity.InputModule;
using UnityEngine;

/// <summary>
/// GestureAction performs custom actions based on
/// which gesture is being performed.
/// </summary>
public class GestureAction : MonoBehaviour, INavigationHandler, IManipulationHandler, ISpeechHandler
{
    [Tooltip("Rotation max speed controls amount of rotation.")]
    [SerializeField]
    private float RotationSensitivity = 10.0f;

    private bool isNavigationEnabled = true;
    public bool IsNavigationEnabled
    {
        get { return isNavigationEnabled; }
        set { isNavigationEnabled = value; }
    }

    private Vector3 manipulationOriginalPosition = Vector3.zero;

    void INavigationHandler.OnNavigationStarted(NavigationEventData eventData)
    {
        InputManager.Instance.PushModalInputHandler(gameObject);
    }

    void INavigationHandler.OnNavigationUpdated(NavigationEventData eventData)
    {
        if (isNavigationEnabled)
        {
            /* TODO: DEVELOPER CODING EXERCISE 2.c */

            // 2.c: Calculate a float rotationFactor based on eventData's NormalizedOffset.x multiplied by RotationSensitivity.
            // This will help control the amount of rotation.
            float rotationFactor = eventData.NormalizedOffset.x * RotationSensitivity;

            // 2.c: transform.Rotate around the Y axis using rotationFactor.
            transform.Rotate(new Vector3(0, -1 * rotationFactor, 0));
        }
    }

    void INavigationHandler.OnNavigationCompleted(NavigationEventData eventData)
    {
        InputManager.Instance.PopModalInputHandler();
    }

    void INavigationHandler.OnNavigationCanceled(NavigationEventData eventData)
    {
        InputManager.Instance.PopModalInputHandler();
    }

    void IManipulationHandler.OnManipulationStarted(ManipulationEventData eventData)
    {
        if (!isNavigationEnabled)
        {
            InputManager.Instance.PushModalInputHandler(gameObject);

            manipulationOriginalPosition = transform.position;
        }
    }

    void IManipulationHandler.OnManipulationUpdated(ManipulationEventData eventData)
    {
        if (!isNavigationEnabled)
        {
            /* TODO: DEVELOPER CODING EXERCISE 4.a */

            // 4.a: Make this transform's position be the manipulationOriginalPosition + eventData.CumulativeDelta
            transform.position = manipulationOriginalPosition + eventData.CumulativeDelta;
        }
    }

    void IManipulationHandler.OnManipulationCompleted(ManipulationEventData eventData)
    {
        InputManager.Instance.PopModalInputHandler();
    }

    void IManipulationHandler.OnManipulationCanceled(ManipulationEventData eventData)
    {
        InputManager.Instance.PopModalInputHandler();
    }

    void ISpeechHandler.OnSpeechKeywordRecognized(SpeechEventData eventData)
    {
        if (eventData.RecognizedText.Equals("Move Astronaut"))
        {
            isNavigationEnabled = false;
        }
        else if (eventData.RecognizedText.Equals("Rotate Astronaut"))
        {
            isNavigationEnabled = true;
        }
        else
        {
            return;
        }

        eventData.Use();
    }
}

Построение и Развертывание

  • Выполните сборку в Unity, а затем выполните сборку и развертывание из Visual Studio для запуска приложения в HoloLens.
  • Переместите руку перед HoloLens и поднимите указательный палец, чтобы его можно было отслеживать.
  • Наведите курсор на астронавта.
  • Скажите "Переместить астронавта", чтобы переместить астронавта с помощью жеста манипуляции.
  • Вокруг курсора должны появиться четыре стрелки, указывающие, что программа теперь будет реагировать на события Манипуляции.
  • Опустите указательный палец вниз до большого пальца и держите их щипать вместе.
  • Когда вы перемещаете руку вокруг, астронавт будет двигаться тоже (это Манипуляция).
  • Поднимите указательный палец, чтобы перестать манипулировать астронавтом.
  • Примечание. Если вы не говорите "Переместить астронавта" перед перемещением руки, вместо него будет использоваться навигационный жест.
  • Скажите "Повернуть астронавта", чтобы вернуться в вращаемое состояние.

Глава 5. Расширение модели

Задачи

  • Разверните модель Астронавта на несколько небольших частей, с которыми пользователь может взаимодействовать.
  • Перемещение каждого элемента по отдельности с помощью жестов навигации и манипуляции.

Instructions

В этом разделе мы выполируем следующие задачи:

  1. Добавьте новый ключевое слово "Развернуть модель", чтобы развернуть модель астронавтов.
  2. Добавьте новое ключевое слово "Reset Model" (Сброс модели), чтобы вернуть модель в исходную форму.

Для этого мы добавим еще два ключевых слова в источник речевых данных из предыдущей главы. Мы также продемонстрируем другой способ обработки событий распознавания.

  1. Щелкните вернитесь к AstronautManager в инспекторе и разверните раздел Ключевые слова в инспекторе.
  2. Щелкните в + правой части, чтобы добавить новый ключевое слово.
  3. Введите ключевое слово Expand Model (Развернуть модель). При желании вы можете добавить сочетание клавиш.
  4. Щелкните в + правой части, чтобы добавить новый ключевое слово.
  5. Введите ключевое слово Reset Model (Модель сброса). При желании вы можете добавить сочетание клавиш.
  6. На панели Инспектор нажмите кнопку Добавить компонент .
  7. В меню введите в поле поиска Обработчик речевых данных. Выберите результат поиска.
  8. Установите флажок Является ли глобальный прослушиватель, так как мы хотим, чтобы эти команды работали независимо от gameObject, на который мы фокусируемся.
  9. Нажмите кнопку + и выберите Пункт Развернуть модель в раскрывающемся списке Ключевое слово.
  10. + Щелкните в разделе Ответ и перетащите AstronautManager из иерархии в поле Нет (объект).
  11. Теперь щелкните раскрывающийся список Без функции , выберите AstronautManager, а затем ExpandModelCommand.
  12. Нажмите кнопку Обработчика + речевых данных и выберите Сброс модели в раскрывающемся списке Ключевое слово.
  13. + Щелкните в разделе Ответ и перетащите AstronautManager из иерархии в поле Нет (объект).
  14. Теперь щелкните раскрывающийся список Без функции , выберите AstronautManager, а затем ResetModelCommand.

Настройка источника и обработчика речевых данных для главы 5

Построение и Развертывание

  • Тестирование Выполните сборку и развертывание приложения в HoloLens.
  • Скажите Развернуть модель , чтобы увидеть развернутую модель астронавтов.
  • Используйте навигацию для поворота отдельных частей костюма астронавта.
  • Скажите Перемещение астронавта , а затем используйте манипуляцию для перемещения отдельных частей костюма астронавта.
  • Скажите Повернуть астронавта , чтобы снова повернуть части.
  • Скажите Сброс модели , чтобы вернуть астронавта в исходную форму.

Конец

Поздравляем! Вы завершили ввод mr 211: жест.

  • Вы знаете, как обнаруживать события отслеживания рук, навигации и манипуляции и реагировать на них.
  • Вы понимаете разницу между жестами навигации и манипуляции.
  • Вы знаете, как изменить курсор, чтобы обеспечить визуальную обратную связь о том, когда обнаруживается рука, когда рука будет потеряна, а также когда объект поддерживает различные взаимодействия (навигация и манипуляция).