Compartilhar via


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

  1. Destrua imediatamente o componente Âncora do Mundo
  2. Mover o GameObject
  3. 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:

  1. Assinar o evento OnTrackingChanged
  2. 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.

Confira também