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