Movendo o modo de plataforma no Unity

Mover o Modo de Plataforma permite HoloLens 2 funcione corretamente na movimentação de plataformas como navios, plataformas de petróleo e outros veículos.

Saiba mais sobre Como mover o modo de plataforma

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 gráficos sejam renderizados, de forma que eles apareçam para o usuário do headset serem bloqueados de forma sólida no ambiente. O acompanhamento geralmente é obtido combinando poses que são calculadas usando câmeras de aparência externa e medidas da IMU (Unidade de Medida Inerial). Esse método funciona bem quando o ambiente está no quadro inercial de referência. Efeitos pequenos, como o movimento de um planeta, geralmente são descuidados.

Quando o ambiente não estiver no quadro inercial de referência, o sistema normal de acompanhamento de cabeça falhará. O recurso Movendo Modo de Plataforma resolve esse problema, contabilização do movimento do ambiente em relação ao quadro inercial. Portanto, quando estiver movendo o modo de plataforma, HoloLens 2 poderá renderizar hologramas que aparecem fixos no ambiente, mesmo que o ambiente seja uma nave em movimento!

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 mover o modo de plataforma

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 opção para o runtime do aplicativo
Forneça um aviso para o usuário Evite alterar o modo imediatamente no início/retomada do aplicativo. Isso apresenta uma experiência ruim do usuário, 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 a qual você altera o modo. O ideal é que o modo só seja alterado se o dispositivo estiver passando 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 em ambientes móveis. Os algoritmos de acompanhamento regular só funcionam em ambientes estacionários, portanto, se você não tiver certeza se o ambiente está se movendo, escolher Mover Modo de Plataforma poderá ser a opção mais segura.
Não usar o Modo de Plataforma móvel em ambientes estacionários conhecidos Mover o Modo de Plataforma tem um desempenho menor do 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 projete experiências robustas na inicialização do dispositivo. Considere se o dispositivo estará em uma plataforma móvel na próxima vez que 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 Realidade Misturada recurso.

Como fazer usar esse SDK

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

// 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 forma:

MovingPlatformMode currentMode = m_movingPlatformManager.Mode;

MovingPlatformMode é uma enum definida da seguinte forma:

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 forma:

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

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

Retorno de chamada no modo de alteração

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

Verificando se o modo é settable

Às vezes, é útil saber se o modo é settable 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 mover o modo de plataforma é definido 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 (mobile Gerenciamento de Dispositivos). Por exemplo, se o MDM força 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