Sistemas de coordenadas no Unity
Windows Mixed Reality dá suporte a aplicativos em uma ampla variedade de escalas de experiência, desde aplicativos somente orientação e escala sentada até aplicativos de escala de sala. No HoloLens, você pode ir além e criar aplicativos em escala mundial que permitem que os usuários caminhem além de 5 metros, explorando um andar inteiro de um prédio e além.
Sua primeira etapa na criação de uma experiência de realidade misturada no Unity é entender os sistemas de coordenadas e escolher a escala de experiência que seu aplicativo terá como destino.
Criando uma experiência somente de orientação ou em escala sentada
Namespace: UnityEngine.XR
Tipo: XRDevice
Para criar uma experiência somente de orientação ou de escala sentada, você precisa definir o Unity como o tipo de espaço de rastreamento estacionário. O espaço de rastreamento estacionário define o sistema de coordenadas mundiais do Unity para rastrear o quadro de referência estacionário. No modo de rastreamento estacionário, o conteúdo colocado no editor logo na frente do local padrão da câmera (avançar é -Z) aparecerá na frente do usuário quando o aplicativo for iniciado.
XRDevice.SetTrackingSpaceType(TrackingSpaceType.Stationary);
Namespace: UnityEngine.XR
Tipo: InputTracking
Para uma experiência puramente orientada apenas, como um visualizador de vídeo de 360 graus (onde as atualizações de cabeça posicional arruinariam a ilusão), você pode definir XR. InputTracking.disablePositionalTracking para true:
InputTracking.disablePositionalTracking = true;
Para uma experiência de escala sentada, para permitir que o usuário recentralize posteriormente a origem sentada, você pode chamar o XR. Método InputTracking.Recenter :
InputTracking.Recenter();
Criando uma experiência em escala permanente ou em escala de sala
Namespace: UnityEngine.XR
Tipo: XRDevice
Para uma experiência em escala em pé ou em escala de sala, você precisará colocar o conteúdo em relação ao chão. Você raciocina sobre o piso do usuário usando o estágio espacial, que representa a origem definida no nível do piso do usuário e o limite opcional da sala, configurado durante a primeira execução.
Para garantir que o Unity esteja operando com seu sistema de coordenadas mundiais no nível do chão, você pode definir e testar se o Unity está usando o tipo de espaço de rastreamento RoomScale:
if (XRDevice.SetTrackingSpaceType(TrackingSpaceType.RoomScale))
{
// RoomScale mode was set successfully. App can now assume that y=0 in Unity world coordinate represents the floor.
}
else
{
// RoomScale mode was not set successfully. App cannot make assumptions about where the floor plane is.
}
- Se SetTrackingSpaceType retornar true, o Unity alterou com êxito seu sistema de coordenadas mundiais para rastrear o quadro de referência do estágio.
- Se SetTrackingSpaceType retornar false, o Unity não pôde alternar para o quadro de referência do estágio, provavelmente porque o usuário não configurou um piso em seu ambiente. Embora um valor de retorno falso não seja comum, isso pode acontecer se o estágio for configurado em uma sala diferente e o dispositivo for movido para a sala atual sem que o usuário configure um novo estágio.
Depois que seu aplicativo definir com êxito o tipo de espaço de rastreamento RoomScale, o conteúdo colocado no plano y=0 aparecerá no chão. A origem em 0, 0, 0 será o local específico no chão onde o usuário ficou durante a configuração da sala, com -Z representando a direção para frente que ele estava enfrentando durante a configuração.
Namespace: UnityEngine.Experimental.XR
Tipo: Limite
No código de script, você pode chamar o método TryGetGeometry no tipo UnityEngine.Experimental.XR.Boundary para obter um polígono de limite, especificando um tipo de limite de TrackedArea. Se o usuário definiu um limite (você recebe uma lista de vértices), é seguro fornecer uma experiência em escala de sala ao usuário, onde ele pode percorrer a cena que você cria.
Observação
O sistema renderizará automaticamente o limite quando o usuário se aproximar dele. Seu aplicativo não precisa usar esse polígono para renderizar o limite em si. No entanto, você pode optar por dispor seus objetos de cena usando esse polígono de limite, para garantir que o usuário possa alcançar fisicamente esses objetos sem se teletransportar:
var vertices = new List<Vector3>();
if (UnityEngine.Experimental.XR.Boundary.TryGetGeometry(vertices, Boundary.Type.TrackedArea))
{
// Lay out your app's content within the boundary polygon, to ensure that users can reach it without teleporting.
}
Construindo uma experiência em escala mundial
Namespace: UnityEngine.XR.WSA
Tipo: WorldAnchor
Para experiências verdadeiras em escala mundial no HoloLens que permitem que os usuários vagueiem além de 5 metros, você precisará de novas técnicas além daquelas usadas para experiências em escala de sala. Uma técnica importante que você usará é criar uma âncora espacial para bloquear um cluster de hologramas precisamente no lugar no mundo físico, não importa o quão longe o usuário tenha percorrido, e depois encontrar esses hologramas novamente em sessões posteriores.
No Unity, você cria uma âncora espacial adicionando o componente WorldAnchor Unity a um GameObject.
Adicionando uma âncora mundial
Para adicionar uma âncora mundial, chame AddComponent<WorldAnchor>() no objeto do jogo com a transformação que você deseja ancorar no mundo real.
WorldAnchor anchor = gameObject.AddComponent<WorldAnchor>();
É isso! Este objeto de jogo agora será ancorado em sua localização atual no mundo físico - você pode ver suas coordenadas do mundo Unity se ajustarem ligeiramente ao longo do tempo para garantir esse alinhamento físico. Use a persistência para encontrar esse local ancorado novamente em uma sessão de aplicativo futura.
Removendo uma âncora mundial
Se você não quiser mais que o GameObject seja bloqueado em um local do mundo físico e não pretenda movê-lo neste quadro, basta chamar Destroy no componente World Anchor.
Destroy(gameObject.GetComponent<WorldAnchor>());
Se você quiser mover o GameObject neste quadro, precisará chamar DestroyImmediate.
DestroyImmediate(gameObject.GetComponent<WorldAnchor>());
Movendo um GameObject ancorado no mundo
GameObject não pode ser movido enquanto uma Âncora Mundial estiver nele. Se você precisar mover o GameObject neste quadro, precisará:
- Destrua imediatamente o componente Âncora do Mundo
- Mover o GameObject
- Adicione um novo componente Âncora Mundial ao GameObject.
DestroyImmediate(gameObject.GetComponent<WorldAnchor>());
gameObject.transform.position = new Vector3(0, 0, 2);
WorldAnchor anchor = gameObject.AddComponent<WorldAnchor>();
Lidando com alterações de localização
Um WorldAnchor pode não ser localizável no mundo físico em um determinado momento. Se isso ocorrer, o Unity não atualizará a transformação do objeto ancorado. Isso também pode mudar enquanto um aplicativo está em execução. A falha em lidar com a mudança na localização fará com que o objeto não apareça no local físico correto no mundo.
Para ser notificado sobre alterações de localização:
- Assinar o evento OnTrackingChanged
- Manipular o evento
O evento OnTrackingChanged será chamado sempre que a âncora espacial subjacente for alterada entre um estado de ser localizável ou não localizável.
anchor.OnTrackingChanged += Anchor_OnTrackingChanged;
Em seguida, manipule o evento:
private void Anchor_OnTrackingChanged(WorldAnchor self, bool located)
{
// This simply activates/deactivates this object and all children when tracking changes
self.gameObject.SetActiveRecursively(located);
}
Às vezes, as âncoras são localizadas imediatamente. Nesse caso, essa propriedade isLocated da âncora será definida como true quando AddComponent<WorldAnchor>() retornar. Como resultado, o evento OnTrackingChanged não será disparado. Um padrão limpo seria chamar o manipulador OnTrackingChanged com o estado inicial IsLocated depois de anexar uma âncora.
Anchor_OnTrackingChanged(anchor, anchor.isLocated);
Próximo ponto de verificação de desenvolvimento
Se você está seguindo a jornada do ponto de verificação de desenvolvimento do Unity que apresentamos, está explorando os principais blocos de construção da Realidade Misturada. Deste ponto, você pode prosseguir para o próximo bloco de construção:
Ou vá diretamente para as funcionalidades e APIs da plataforma de Realidade Misturada:
Você sempre pode voltar para os pontos de verificação de desenvolvimento do Unity a qualquer momento.