Partilhar via


Coordenar sistemas em Unity

O Windows Mixed Reality oferece suporte a aplicativos em uma ampla variedade de escalas de experiência, desde aplicativos somente de orientação e dimensionados 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.

Seu primeiro passo na criação de uma experiência de realidade mista no Unity é entender os sistemas de coordenadas e escolher a escala de experiência que seu aplicativo terá.

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

Espaço de nomes: UnityEngine.XR
Tipo: XRDevice

Para criar uma experiência somente de orientação ou em escala sentada, você precisa definir Unity para o tipo de espaço de rastreamento estacionário. O espaço de rastreamento estacionário define o sistema de coordenadas mundiais de Unity para rastrear o quadro de referência estacionário. No modo de rastreamento estacionário, o conteúdo colocado no editor logo em frente ao local padrão da câmera (avançar é -Z) aparecerá na frente do usuário quando o aplicativo for iniciado.

XRDevice.SetTrackingSpaceType(TrackingSpaceType.Stationary);

Espaço de nomes: UnityEngine.XR
Tipo: InputTracking

Para uma experiência apenas de orientação pura, como um visualizador de vídeo de 360 graus (onde 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 em escala sentada, para permitir que o usuário recentralize posteriormente a origem sentada, você pode chamar o XR. Método InputTracking.Recenter :

InputTracking.Recenter();

Construindo uma experiência em escala permanente ou em escala de sala

Espaço de nomes: UnityEngine.XR
Tipo: XRDevice

Para uma experiência em escala de pé ou 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 do 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, Unity mudou com sucesso 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 palco, 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 palco 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 eles estavam enfrentando durante a configuração.

Espaço de nomes: 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 de volta uma lista de vértices), é seguro fornecer uma experiência em escala de sala para o usuário, onde ele pode andar pela cena que você cria.

Nota

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

Construir uma experiência à escala mundial

Espaço de nomes: UnityEngine.XR.WSA
Tipo: WorldAnchor

Para experiências reais 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 chave que você usará é criar uma âncora espacial para bloquear um grupo de hologramas precisamente no lugar no mundo físico, não importa o quão longe o usuário tenha percorrido, e então 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 de jogo com a transformação que você deseja ancorar no mundo real.

WorldAnchor anchor = gameObject.AddComponent<WorldAnchor>();

Está feito! Este objeto de jogo agora será ancorado à 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 futura do aplicativo.

Removendo uma âncora mundial

Se você não quiser mais o GameObject bloqueado em um local do mundo físico e não pretende movê-lo neste quadro, então você pode simplesmente chamar Destroy no componente World Anchor.

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

Se você quiser mover o GameObject para este quadro, você precisa chamar DestroyImmediate em vez disso.

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

Movendo um GameObject ancorado no mundo

O GameObject não pode ser movido enquanto um World Anchor estiver nele. Se você precisar mover o GameObject para este quadro, você precisa:

  1. DestruirImediatamente o componente World Anchor
  2. Mover o GameObject
  3. Adicione um novo componente World Anchor ao GameObject.
DestroyImmediate(gameObject.GetComponent<WorldAnchor>());
gameObject.transform.position = new Vector3(0, 0, 2);
WorldAnchor anchor = gameObject.AddComponent<WorldAnchor>();

Tratamento de alterações de locabilidade

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 locabilidade fará com que o objeto não apareça no local físico correto no mundo.

Para ser notificado sobre alterações de locatabilidade:

  1. Inscreva-se no evento OnTrackingChanged
  2. Manipular o evento

O evento OnTrackingChanged será chamado sempre que a âncora espacial subjacente mudar entre um estado de ser localizável 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á acionado. Um padrão limpo seria chamar seu 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 a partir de uma 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. Isto permite experiências partilhadas em tempo real.

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

Quando estiver em funcionamento com 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 de pontos de verificação de desenvolvimento Unity que estabelecemos, você está no meio da exploração dos principais blocos de construção da Realidade Mista. A partir daqui, você pode continuar para o próximo bloco de construção:

Ou pule para os recursos e APIs da plataforma de Realidade Mista:

Você sempre pode voltar aos pontos de verificação de desenvolvimento Unity a qualquer momento.

Consulte Também