Mover o Modo de Plataforma no Unity

Mover o Modo de Plataforma permite que HoloLens 2 funcionem corretamente em plataformas em movimento, como navios, plataformas petrolíferas e outros veículos.

Saiba mais sobre Como Mover o Modo de Plataforma

Descrição Geral Conceptual

Para que os sistemas de realidade mista funcionem corretamente, o headset tem de ser monitorizado em relação ao ambiente. Este controlo relativo permite que os gráficos sejam compostos de forma a que pareçam que o utilizador do headset está solidamente bloqueado no ambiente. Normalmente, o controlo é obtido ao combinar poses que são calculadas com câmaras de aspeto exterior e medições da Unidade de Medição Inercial (IMU). Este método funciona bem quando o ambiente está no quadro inercial de referência. Pequenos efeitos, como o movimento planetário, são geralmente negligenciados.

Quando o ambiente não estiver no quadro inercial de referência, o sistema normal de controlo de cabeçalhos falhará. A funcionalidade Modo de Plataforma Móvel resolve este problema ao contabilizar o movimento do ambiente em relação ao fotograma inercial. Assim, quando estiver no Modo de Plataforma Móvel, HoloLens 2 pode compor hologramas que aparecem fixos no ambiente, mesmo que o ambiente seja um navio à espreita!

Como devo ativar o Modo de Plataforma Móvel?

Para ativar uma série de casos de utilização, foram fornecidos vários métodos para ativar o Modo de Plataforma Móvel. É importante que considere cuidadosamente qual o método a escolher. Uma pergunta fundamental a fazer é: Quem sabe se o HoloLens 2 está atualmente numa plataforma em movimento? Veja a seguinte tabela para obter um exemplo:

Quem sabe se o HL2 está numa plataforma em movimento Melhor método para definir o Modo de Plataforma Móvel Benefícios Custos
Administrador de Sistema Mobile Device Management O utilizador não precisa de estar envolvido. Qualquer aplicação funcionará sem modificação. O dispositivo pode ser protegido contra a entrada no modo incorreto. O utilizador e as aplicações não podem alterar o modo.
Utilizador Final A aplicação Definições O utilizador é, muitas vezes, o mais conhecedor sobre quando e onde está a utilizar o dispositivo. Qualquer aplicação funcionará sem modificação. O utilizador pode não saber que o modo existe.
A Aplicação Utilize o SDK descrito neste artigo. As ajudas específicas do caso de utilização podem ser utilizadas para trocar o modo quando o ambiente não pode ser conhecido antecipadamente. Remove o requisito de que um utilizador tem de tomar esta decisão e alterar o modo nas definições. Uma aplicação mal concebida pode proporcionar uma experiência muito má e deixar o dispositivo num modo inesperado.

Melhores práticas para Mover o Modo de Plataforma

Principal Descrição
Respeitar a escolha do utilizador Deve oferecer ao utilizador a escolha antes de alterar o modo para o mesmo e deve continuar a respeitar essa escolha para o runtime da aplicação
Fornecer um aviso ao utilizador Evite alterar o modo imediatamente ao iniciar/retomar a aplicação. Isto apresenta uma má experiência de utilizador, uma vez que o utilizador pode não saber por que motivo o dispositivo está a perder o controlo.
Minimizar o modo de alteração Ao alterar as definições do Modo de Plataforma Móvel, o dispositivo perderá o controlo, o que causará uma experiência de utilizador negativa. Por conseguinte, recomenda-se que minimize a frequência com que altera o modo. Idealmente, o modo só seria alterado se o dispositivo estivesse a transitar de um ambiente estacionário para um em movimento ou vice-versa.
Se não tiver a certeza sobre o ambiente, utilize o Modo de Plataforma Móvel Mover o Modo de Plataforma pode funcionar em ambientes estacionários e em movimento. Os algoritmos de controlo regular só funcionam em ambientes estacionários, por isso, se não tiver a certeza sobre se o ambiente está em movimento, escolher o Modo de Plataforma Móvel pode ser a escolha mais segura.
Não utilizar o Modo de Plataforma Móvel em ambientes estacionários conhecidos O Modo de Plataforma Móvel funciona menos bem do que o modo padrão em ambientes estacionários. Esta é uma pequena degradação, no entanto, será visível para a maioria dos utilizadores.
Considere em que modo deixar o dispositivo em Este SDK permite aos programadores conceber experiências robustas no arranque do dispositivo. Considere se o dispositivo estará numa plataforma móvel da próxima vez que arrancar e deixe o dispositivo no modo adequado.

Onde posso obter o SDK?

O SDK da Plataforma Móvel suporta projeções de linguagem para C# e C++, permitindo que os programadores desenvolvam aplicações para plataformas Win32 ou UWP. Transfira e instale o SDK com a Ferramenta de Funcionalidades do Mixed Reality.

Como devo proceder para utilizar este SDK

Depois de instalar o SDK, pode configurar o script para utilizar MovingPlatformManger da seguinte forma:

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

Ler o modo atual

O valor atual do modo pode ser lido da seguinte forma:

MovingPlatformMode currentMode = m_movingPlatformManager.Mode;

MovingPlatformMode é uma enumeração que é definida da seguinte forma:

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

Os dispositivos que não tenham o Modo de Plataforma Móvel disponível, como dispositivos VR e HoloLens 1, devolverão sempre "Standard".

Definir o modo

Pode definir o valor Modo de Plataforma Móvel da seguinte forma:

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

TrySetMode devolverá true se o modo de dispositivo corresponder agora ao modo pedido. Se o modo já estiver no estado pretendido, nada será feito e o dispositivo não perderá o controlo.

Chamada de retorno no modo de alteração

Por vezes, pode ser útil saber se outra aplicação, ou o utilizador, alterou o valor Modo de Plataforma Móvel. Pode fazê-lo da seguinte forma.

// 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
    }
}

Verificar se o modo é settable

Por vezes, é útil saber se o modo é settable antes de tentar alterá-lo. Por exemplo, se quiser saber se existe algum valor em perguntar ao utilizador a sua preferência. Pode descobrir se o modo de plataforma móvel é settable com a função IsSetModeSupported:

bool supported = m_movingPlatformManager.IsSetModeSupported();

Esta função devolverá true se o dispositivo puder alterar os modos e falso se tal não for possível. Esta função tem em conta as políticas de Gestão de Dispositivos Móvel (MDM). Por exemplo, se a MDM forçar o MovingPlatformMode a "Ativado", esta função devolverá false.

Um script de demonstração

Este script mostra todos os elementos importantes do SDK num único local. O exemplo não segue as melhores práticas mostradas acima.

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;
    }
}

Ver também