Sistemas de coordenadas no Unity

Windows Mixed Reality dá suporte a aplicativos em uma ampla variedade de escalas de experiência, desde aplicativos somente de orientação e de escala sentada até aplicativos de escala de sala. No HoloLens, você pode ir além e criar aplicativos de escala mundial que permitem que os usuários andem além de 5 metros, explorando um andar inteiro de um edifício 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 direcionará.

Criando uma experiência somente orientação ou em escala sentada

Namespace:UnityEngine.XR
Type:XRDevice

Para criar uma experiência somente orientação ou de escala sentada, você precisa definir o Unity para o tipo de espaço de acompanhamento Estacionário. O espaço de rastreamento estacionário define o sistema de coordenadas mundiais do Unity para acompanhar o quadro de referência estacionário. No modo de acompanhamento estacionário, o conteúdo colocado no editor 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
Type:InputTracking

Para uma experiência somente orientação pura, como um visualizador de vídeo de 360 graus (em que atualizações posicionais de cabeça arruinariam a ilusão), você pode definir XR. InputTracking.disablePositionalTracking como true:

InputTracking.disablePositionalTracking = true;

Para uma experiência de escala sentada, para permitir que o usuário posteriormente use 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
Type:XRDevice

Para uma experiência em escala permanente ou em escala de sala, você precisará colocar o conteúdo em relação ao chão. Você explica 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 piso, 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 alternou com êxito seu sistema de coordenadas do mundo para acompanhar o quadro de referência de estágio.
  • Se SetTrackingSpaceType retornar false, o Unity não poderá alternar para o quadro de referência de 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 estiver 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 o aplicativo definir com êxito o tipo de espaço de acompanhamento 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 estava durante a instalação da sala, com -Z representando a direção para a frente que ele estava enfrentando durante a instalação.

Namespace:UnityEngine.Experimental.XR
Type:Boundary

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 trackedArea. Se o usuário definiu um limite (você recebe de volta uma lista de vértices), é seguro fornecer uma experiência de escala de sala para o usuário, onde ele pode percorrer a cena que você criar.

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

Criando uma experiência de escala mundial

Namespace:UnityEngine.XR.WSA
Type:WorldAnchor

Para experiências verdadeiras em escala mundial no HoloLens que permitem que os usuários perambulem além de 5 metros, você precisará de novas técnicas além daquelas usadas para experiências de escala de espaço. Uma técnica fundamental 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 vagado e, em seguida, 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 de mundo

Para adicionar uma âncora de mundo, chame AddComponent<WorldAnchor>() no objeto de 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 à sua localização atual no mundo físico . Você pode ver suas coordenadas de mundo do Unity se ajustarem ligeiramente ao longo do tempo para garantir esse alinhamento físico. Use a persistência para localizar esse local ancorado novamente em uma sessão futura do aplicativo.

Removendo uma âncora do mundo

Se você não quiser mais que o GameObject seja bloqueado para um local de mundo físico e não pretenda movê-lo para esse quadro, basta chamar Destroy no componente Âncora mundial.

Destroy(gameObject.GetComponent<WorldAnchor>());

Se você quiser mover o GameObject nesse quadro, precisará chamar DestroyImmediate.

DestroyImmediate(gameObject.GetComponent<WorldAnchor>());

Movendo um GameObject Ancorado no Mundo

GameObject não pode ser movido enquanto uma Âncora Mundial está nele. Se você precisar mover o GameObject desse quadro, precisará:

  1. DestruirImmediar o componente Âncora Mundial
  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>();

Manipulando alterações de localização

Um WorldAnchor pode não estar localizado no mundo físico em um ponto no tempo. 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 ao manipular a alteração na localizabilidade 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 mudar entre um estado de localização versus não ser 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 IsLocated inicial 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.

Quando estiver em execução com as Âncoras Espaciais do Azure, você poderá criar e localizar âncoras no Unity.

Próximo ponto de verificação de desenvolvimento

Se você estiver seguindo o percurso de ponto de verificação de desenvolvimento do Unity que apresentamos, você está no meio da exploração dos blocos de construção principais do 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.

Consulte Também