Перемещение режима платформы в Unity

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

Дополнительные сведения о переходе в режим платформы

Общие сведения об основных понятиях

Чтобы системы смешанной реальности работали правильно, необходимо отслеживание гарнитуры относительно среды. Это относительное отслеживание позволяет визуализировать графические изображения таким образом, чтобы они отображались для пользователя гарнитуры, чтобы быть надежно заблокированы в среде. Отслеживание обычно достигается путем объединения единиц, которые рассчитываются с помощью внешних камер и измерений из единицы измерения инерции (иму). Этот метод хорошо работает, когда среда находится в блоке ссылки на инерцию. Небольшие эффекты, например планетными Motion, обычно не обрабатываются.

Если окружение не находится на инерции, то нормальная система отслеживания завершается ошибкой. Функция перехода в режим платформы решает эту проблему, учитывая движение среды по отношению к инерциому кадру. таким же, при переходе в режим платформы HoloLens 2 может визуализировать голограммы, которые будут исправлены в среде, даже если среда является лурчинг поставке!

Как активировать режим подвижного пола?

Для поддержки разных вариантов использования вам предоставляются разные методы для активации режима подвижного пола. Важно, чтобы вы тщательно выбрали нужный метод. Ключевым вопросом будет следующий: "Кто знает, используется ли в настоящий момент HoloLens 2 на подвижном полу?". См. пример в следующей таблице:

Кто знает, используется ли HL2 на подвижном полу Лучший способ настройки режима подвижного пола Преимущества Затраты
Системный администратор Управление мобильными устройствами (MDM) Пользователю не нужно выполнять действия. Все приложения будут работать без внесения изменений. Устройство может быть защищено от перехода в неверный режим. Пользователь и приложения не могут изменить режим.
Конечный пользователь Приложение "Параметры" Пользователь часто лучше всего знает, когда и где используется устройство. Все приложения будут работать без внесения изменений. Возможно, пользователь не знает о доступности режима.
Приложение Используйте пакет SDK, описанный в этой статье. Если условия среды не известны заранее, для смены режима можно использовать подсказки для конкретных вариантов использования. Отменяет требование того, что пользователю необходимо принять это решение и изменить режим в параметрах. Плохо спроектированное приложение может значительно усложнить работу и привести к возникновению непредвиденного поведения на устройстве.

Рекомендации по переходу в режим платформы

Основной Описание
В отношении выбора пользователя Вы должны предложить пользователю выбрать вариант, прежде чем изменять режим для них, и вы должны учитывать этот вариант для среды выполнения приложения.
Предоставление пользователю предупреждения Старайтесь не изменять режим немедленно при запуске или возобновлении приложения. Это неплохое взаимодействие с пользователем, так как пользователь может не понять, почему устройство теряет отслеживание.
Уменьшение режима изменения При изменении параметров режима платформы перемещение устройства потеряет отслеживание, что приведет к негативному взаимодействиям с пользователем. Поэтому рекомендуется максимально сокращать частоту изменения режима. В идеале режим изменится только в том случае, если устройство переходит из стационарной среды в перемещение, или наоборот.
Если вы не уверены в использовании среды, используйте режим перемещения платформы Переход в режим платформы может работать как в стационарных, так и на перемещаемых средах. Обычные алгоритмы отслеживания работают только в стационарных средах, поэтому если вы не уверены, как происходит перемещение среды, выбор режима перемещения платформы может быть более безопасным.
Не используйте режим переноса платформы в известных стационарных средах Переход в режим платформы работает менее хорошо, чем стандартный режим в стационарных средах. Это небольшое снижение, но будет заметно для большинства пользователей.
Рассмотрите, в каком режиме следует оставить устройство в Этот пакет SDK позволяет разработчикам проектировать возможности, надежные для загрузки устройства. Подумайте, будет ли устройство на движущихся платформах при следующем запуске, и оставьте устройство в соответствующем режиме.

Где получить пакет SDK?

Пакет SDK для переноса платформы поддерживает языковые проекции для C# и C++, позволяя разработчикам разрабатывать приложения для платформ Win32 или UWP. скачайте и установите пакет SDK с помощью средства Смешанная реальность компонентов.

Разделы справки использовать этот пакет SDK

После установки пакета SDK можно настроить сценарий для использования Мовингплатформманжер следующим образом:

// Top of file
using Microsoft.MixedReality.MovingPlatform;
// Code body
m_movingPlatformManager = new MovingPlatformManager();

Чтение текущего режима

Текущее значение режима можно считать следующим образом:

MovingPlatformMode currentMode = m_movingPlatformManager.Mode;

Мовингплатформмоде — это перечисление, которое определяется следующим образом:

public enum MovingPlatformMode
{
    Standard,                // The legacy mode that devices use out-of-the-box.
    MovingPlatformOptimized  // Allows tracking on moving platforms.
}

устройства без режима перемещения платформы, например устройства VR и HoloLens 1, всегда будут возвращать "Standard".

Установка режима

Значение режима перемещения платформы можно задать следующим образом:

bool success = m_movingPlatformManager.TrySetMode(MovingPlatformMode.MovingPlatformOptimized);

Трисетмоде будет возвращать значение true, если режим устройства теперь соответствует запрошенному режиму. Если режим уже находится в нужном состоянии, ничего не выполняется и устройство не будет отслеживаться.

Обратный вызов при изменении режима

Иногда может быть полезно выяснить, изменилось ли значение режима перехода платформы на другое приложение или пользователь. Это можно сделать следующим образом.

// Code Body
m_movingPlatformManager.ModeChanged += CallbackOnMPMChanged;
...
void CallbackOnMPMChanged(object sender, MovingPlatformEventArgs args)
{
    movingPlatformModeChanged = true;
    movingPlatformModeValue = args.ModeEntered;
}
...
void Update()
{
    // It's not reccomended to do work in the callback.
    if (movingPlatformModeChanged)
    {
        movingPlatformModeChanged = false;
        // Do some work
    }
}

Проверяется, является ли режим устанавливаемым

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

bool supported = m_movingPlatformManager.IsSetModeSupported();

Эта функция возвращает значение true, если устройство может изменить режимы, и false, если это невозможно. эта функция учитывает политики мобильных Управление устройствами (MDM). Например, если MDM принудительно применяет Мовингплатформмоде, эта функция возвращает значение false.

Демонстрационный сценарий

Этот сценарий показывает все важные элементы пакета SDK в одном месте. Этот пример не соответствует рекомендациям, приведенным выше.

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using Microsoft.MixedReality.MovingPlatform;
using System;

public class MovingPlatformDemo : MonoBehaviour
{
    public GameObject cube; // A simple cube to display colors.
    private MovingPlatformManager m_movingPlatformManager;
    private Renderer cubeRenderer;
    private bool movingPlatformModeChanged;
    private MovingPlatformMode movingPlatformModeValue;

    // Start is called before the first frame update
    void Start()
    {
        m_movingPlatformManager = new MovingPlatformManager();
        cubeRenderer = cube.GetComponent<Renderer>();

        // Get initial value of mode, 
        // Just this mechanism would be adequate if a one time check is acceptable. 
        MovingPlatformMode initialMovingPlatformMode = m_movingPlatformManager.Mode;

        // Find if It's possible to change the mode. 
        bool isSettable = m_movingPlatformManager.IsSetModeSupported();

        // Here you would add some use case specific logic using initialMovingPlatformMode and isSettable
        // to decide if you should ask the user if they want to change the mode. 

        // To set the mode.
        bool success = m_movingPlatformManager.TrySetMode(MovingPlatformMode.MovingPlatformOptimized);

        // Visual indicator of current state: Green = Moving Platform Optimized, Red = Regular.
        SetColourFromState(m_movingPlatformManager.Mode, cubeRenderer);

        // We set a callback to be notified if there's a change in mode. This is typically optional.
        m_movingPlatformManager.ModeChanged += CallbackOnMPMChanged;
        movingPlatformModeChanged = false;
    }

    // Update is called once per frame
    void Update()
    {
        // This must be done in the UI thread.
        if (movingPlatformModeChanged)
        {
            movingPlatformModeChanged = false;
            SetColourFromState(movingPlatformModeValue, cubeRenderer);
        }
    }

    // Sets renderer to:
    // Green = Moving Platform Mode Enabled
    // Red = Moving Platform Mode Disabled
    void SetColourFromState(MovingPlatformMode mode, Renderer thisRend)
    {
        if (mode == MovingPlatformMode.MovingPlatformOptimized)
        {
            thisRend.material.color = new Color(0f, 1f, 0f, 1f);
        }
        else
        {
            thisRend.material.color = new Color(1f, 0f, 0f, 1f);
        }
    }

    void CallbackOnMPMChanged(object sender, MovingPlatformEventArgs args)
    {
        movingPlatformModeChanged = true;
        movingPlatformModeValue = args.ModeEntered;
    }
}

См. также раздел