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

Compartilhamento de âncoras entre dispositivos

Use as Âncoras Espaciais do Azure para criar uma âncora de nuvem durável de um WorldAnchor local, que seu aplicativo pode localizar em vários dispositivos HoloLens, iOS e Android. Ao compartilhar uma âncora espacial comum em vários dispositivos, cada usuário pode ver o conteúdo renderizado em relação a essa âncora no mesmo local físico. Isso permite experiências compartilhadas em tempo real.

Para começar a criar experiências compartilhadas no Unity, experimente os inícios rápidos do Unity das Âncoras Espaciais do Azure de 5 minutos.

Depois de começar a usar as Âncoras Espaciais do Azure, você poderá criar e localizar âncoras no Unity.

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