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

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

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

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

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

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

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

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

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

Рекомендации по перемещению режима платформы

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

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

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

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

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

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

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

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

MovingPlatformMode currentMode = m_movingPlatformManager.Mode;

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

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

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

Настройка режима

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

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

TrySetMode возвращает значение 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
    }
}

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

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

bool supported = m_movingPlatformManager.IsSetModeSupported();

Эта функция возвращает значение true, если устройство может изменять режимы, и значение false, если это невозможно. Эта функция учитывает политики мобильного Управление устройствами (MDM). Например, если MDM принудительно приведет MovingPlatformMode к значению "Вкл.", эта функция вернет значение 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;
    }
}

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