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