Movendo o modo de plataforma no Unity

O Modo de Plataforma Móvel permite que HoloLens 2 trabalhem corretamente em plataformas móveis, como navios, plataformas de petróleo e outros veículos.

Saiba mais sobre o modo de plataforma móvel

Visão geral conceitual

Para que os sistemas de realidade misturada funcionem corretamente, o headset deve ser rastreado em relação ao ambiente. Esse acompanhamento relativo permite que os elementos gráficos sejam renderizados de modo que pareçam para o usuário do fone de ouvido serem bloqueados solidamente no ambiente. O acompanhamento geralmente é obtido combinando poses calculadas usando câmeras de aparência externa e medidas da IMU (Unidade de Medida Inercial). Esse método funciona bem quando o ambiente está no quadro inercial de referência. Pequenos efeitos, como o movimento planetário, geralmente são negligenciados.

Quando o ambiente não estiver no quadro inercial de referência, o sistema de acompanhamento de cabeça normal falhará. O recurso Modo de Plataforma Móvel resolve esse problema contabilizando o movimento do ambiente em relação ao quadro inercial. Assim, quando estiver no Modo de Plataforma Móvel, HoloLens 2 pode renderizar hologramas que aparecem fixos no ambiente, mesmo que o ambiente seja uma nave móvel!

Como devo ativar o Modo de Plataforma Móvel?

Para habilitar um intervalo de casos de uso, vários métodos foram fornecidos para ativar o Modo de Plataforma Móvel. É importante que você considere cuidadosamente qual método escolher. Uma pergunta importante é: quem sabe se o HoloLens 2 está, no momento, dentro de uma plataforma móvel? Confira a seguinte tabela para obter exemplos:

Quem sabe se o HL2 está em uma plataforma móvel Melhor método de configuração do Modo de Plataforma Móvel Benefícios Custos
Administrador do Sistema Gerenciamento de dispositivo móvel O usuário não precisa estar envolvido. Qualquer aplicativo funcionará sem modificação. O dispositivo pode ser protegido contra a entrada no modo incorreto. O usuário e os aplicativos não podem alterar o modo.
Usuário Final O aplicativo Configurações O usuário geralmente é quem mais sabe quando e onde ele está usando o dispositivo. Qualquer aplicativo funcionará sem modificação. Talvez o usuário nem saiba que o modo existe.
O aplicativo Use o SDK descrito neste artigo. As indicações específicas de caso de uso podem ser usadas para alternar o modo quando o ambiente não pode ser conhecido antes do tempo. Remove o requisito que um usuário tem para tomar essa decisão e alterar o modo nas configurações. Um aplicativo mal projetado pode oferecer uma experiência muito insatisfatória e deixar o dispositivo em um modo inesperado.

Práticas recomendadas para o modo de plataforma móvel

Principal Descrição
Respeitar a escolha do usuário Você deve oferecer ao usuário a opção antes de alterar o modo para ele e deve continuar respeitando essa escolha para o runtime do aplicativo
Fornecer um aviso ao usuário Evite alterar o modo imediatamente no início/retomada do aplicativo. Isso apresenta uma experiência de usuário ruim, pois o usuário pode não saber por que o dispositivo está perdendo o controle.
Minimizar a alteração do modo Ao alterar as configurações do Modo de Plataforma Móvel, o dispositivo perderá o controle, causando uma experiência negativa do usuário. Portanto, é recomendável minimizar a frequência com que você altera o modo. Idealmente, o modo só seria alterado se o dispositivo estivesse fazendo a transição de um ambiente estacionário para um móvel ou vice-versa.
Se não tiver certeza sobre o ambiente, use o Modo de Plataforma Móvel Mover o Modo de Plataforma pode funcionar em ambientes estacionários e móveis. Os algoritmos de rastreamento regulares só funcionam em ambientes estacionários, portanto, se você não tiver certeza sobre se o ambiente está se movendo, escolher o Modo de Plataforma Móvel pode ser a opção mais segura.
Não use o Modo de Plataforma Móvel em ambientes estacionários conhecidos O modo de plataforma móvel tem um desempenho menor que o modo padrão em ambientes estacionários. Essa é uma pequena degradação, embora seja perceptível para a maioria dos usuários.
Considere em qual modo deixar o dispositivo Esse SDK permite que os desenvolvedores criem experiências robustas na inicialização do dispositivo. Considere se o dispositivo estará em uma plataforma móvel na próxima vez que ele for inicializado e deixe o dispositivo no modo apropriado.

Onde posso obter o SDK?

O SDK da Plataforma Móvel dá suporte a projeções de linguagem para C# e C++, permitindo que os desenvolvedores desenvolvam aplicativos para plataformas Win32 ou UWP. Baixe e instale o SDK com a Ferramenta de Recursos do Realidade Misturada.

Como fazer usar esse SDK

Depois de instalar o SDK, você pode configurar seu script para usar MovingPlatformManger da seguinte maneira:

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

Lendo o modo atual

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

MovingPlatformMode currentMode = m_movingPlatformManager.Mode;

MovingPlatformMode é uma enumeração definida da seguinte maneira:

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

Dispositivos que não têm o Modo de Plataforma Móvel disponível, como dispositivos VR e HoloLens 1, sempre retornarão 'Standard'.

Definindo o modo

Você pode definir o valor do Modo de Plataforma Móvel da seguinte maneira:

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

TrySetMode retornará true se o modo de dispositivo agora corresponder ao modo solicitado. Se o modo já estiver no estado desejado, nada será feito e o dispositivo não perderá o rastreamento.

Retorno de chamada na alteração do modo

Às vezes, pode ser útil saber se outro aplicativo, ou o usuário, alterou o valor do Modo de Plataforma Móvel. Você pode fazer isso da seguinte maneira.

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

Verificando se o modo é configurável

Às vezes, é útil saber se o modo é configurável antes de tentar alterá-lo. Por exemplo, se você quiser saber se há algum valor em perguntar ao usuário sua preferência. Você pode descobrir se o modo de plataforma móvel é configurável com a função IsSetModeSupported:

bool supported = m_movingPlatformManager.IsSetModeSupported();

Essa função retornará true se o dispositivo puder alterar os modos e false se isso não for possível. Essa função conta para políticas de MDM (Gerenciamento de Dispositivos móvel). Por exemplo, se o MDM forçar o MovingPlatformMode a "On", essa função retornará false.

Um script de demonstração

Esse script mostra todos os elementos importantes do SDK em um só lugar. O exemplo não segue as práticas recomendadas 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;
    }
}

Confira também