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:
- DestruirImediatamente o componente World Anchor
- Mover o GameObject
- 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:
- Inscreva-se no evento OnTrackingChanged
- 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.