Fazer com que seus hologramas permaneçam no lugar, se movam com você ou, em alguns casos, posicionem-se em relação a outros hologramas é uma grande parte da criação de aplicativos Realidade Misturada. Este artigo levará você pela nossa solução recomendada usando o World Locking Tools, mas também abordaremos a configuração manual de âncoras espaciais em seus projetos do Unity. Antes de entrarmos em qualquer código, é importante entender como o Unity lida com o espaço de coordenadas e as âncoras em seu próprio mecanismo.
Sistemas de coordenadas de escala mundial
Hoje, ao escrever jogos, aplicativos de visualização de dados ou aplicativos de realidade virtual, a abordagem típica é estabelecer um sistema de coordenadas do mundo absoluto para o qual todas as outras coordenadas podem ser mapeadas de forma confiável. Nesse ambiente, você sempre pode encontrar uma transformação estável que define uma relação entre dois objetos nesse mundo. Se você não movesse esses objetos, suas transformações relativas sempre permaneceriam as mesmas. Esse tipo de sistema de coordenadas global é fácil de acertar ao renderizar um mundo puramente virtual em que você conhece toda a geometria com antecedência. Os aplicativos VR em escala de sala hoje normalmente estabelecem esse tipo de sistema de coordenadas de escala de sala absoluta com sua origem no chão.
Por outro lado, um dispositivo de realidade misturada sem conexão, como o HoloLens, tem uma compreensão dinâmica orientada por sensores do mundo, ajustando continuamente seu conhecimento ao longo do tempo dos arredores do usuário à medida que caminham muitos metros por um andar inteiro de um edifício. Em uma experiência de escala mundial, se você colocasse todos os hologramas em um sistema de coordenadas rígidas ingênuo, esses hologramas acabariam à deriva ao longo do tempo, seja com base no mundo ou em relação uns aos outros.
Por exemplo, o fone de ouvido pode acreditar atualmente que dois locais no mundo têm 4 metros de distância e, em seguida, refinar esse entendimento, aprendendo que os locais estão de fato a 3,9 metros de distância. Se esses hologramas tivessem sido inicialmente colocados a 4 metros de distância em um único sistema de coordenadas rígidas, um deles sempre apareceria a 0,1 metros do mundo real.
Você pode colocar manualmente âncoras espaciais no Unity para manter a posição de um holograma no mundo físico quando o usuário for móvel. No entanto, isso sacrifica a auto-consistência dentro do mundo virtual. Âncoras diferentes estão constantemente se movendo em relação umas às outras e também estão se movendo pelo espaço de coordenadas global. Nesse cenário, tarefas simples como layout se tornam difíceis. A simulação física também pode ser problemática.
O WLT (World Locking Tools) obtém o melhor dos dois mundos, estabilizando um único sistema de coordenadas rígidas usando um fornecimento interno de âncoras espaciais espalhadas pela cena virtual à medida que o usuário se move. O WLT analisa as coordenadas da câmera e essas âncoras espaciais a cada quadro. Em vez de alterar as coordenadas de tudo no mundo para compensar as correções nas coordenadas da cabeça do usuário, o WLT apenas corrige as coordenadas do cabeçalho.
O World Locking Tools fornece um sistema de coordenadas estável que minimiza as inconsistências visíveis entre marcadores virtuais e do mundo real. O World Locking Tools bloqueia a cena inteira com um pool compartilhado de âncoras, em vez de bloquear cada grupo de objetos com a âncora individual do grupo.
O World Locking Tools manipula automaticamente a criação interna e o gerenciamento de âncoras espaciais. Você não precisa interagir com ARAnchorManager ou WorldAnchor para manter seus hologramas bloqueados no mundo.
Para o Unity 2019/2020 usando OpenXR ou o Plug-in do Windows XR, use ARAnchorManager.
Para versões mais antigas do Unity ou projetos WSA, use WorldAnchor.
Para começar a usar o World Locking Tools, baixe o Realidade Misturada Feature Tool. Para saber mais sobre as noções básicas, consulte a página de documentação main World Locking Tools para obter links para Visão geral, Início Rápido e outros tópicos úteis.
Quando o projeto estiver pronto para ser executado, execute o utilitário configurar cena do Realidade Misturada > World Locking Tools:
Importante
O utilitário Configurar cena pode ser reexecutado a qualquer momento. Por exemplo, ele deverá ser reexecutado se o destino de RA tiver sido alterado de Herdado para SDK do XR. Se a cena já estiver configurada corretamente, a execução do utilitário não terá efeito.
Visualizadores
Durante o desenvolvimento inicial, a adição de visualizadores pode ser útil para garantir que o WLT esteja configurado e funcionando corretamente. Eles podem ser removidos para desempenho de produção ou, se por algum motivo não forem mais necessários, usando o utilitário Remover visualizadores. Mais detalhes sobre os visualizadores podem ser encontrados na documentação de Ferramentas.
O plug-in Realidade Misturada OpenXR fornece a funcionalidade de âncora básica por meio de uma implementação do ARAnchorManager arfoundation do Unity. Para saber as noções básicas sobre ARAnchors no ARFoundation, visite o ArFoundation Manual for AR Anchor Manager.
Este objeto de jogo agora está ancorado em sua localização atual no mundo físico. Você pode ver suas coordenadas mundiais do Unity se ajustarem ligeiramente ao longo do tempo para garantir o alinhamento físico. Consulte carregar uma âncora mundial para encontrar esse local ancorado novamente em uma sessão de aplicativo futura.
Remover uma âncora do mundo
Se você não quiser mais o GameObject bloqueado para um local de mundo físico e não pretende movê-lo nesse quadro, chame Destroy o componente Âncora Mundial.
Destroy(gameObject.GetComponent<WorldAnchor>());
Se você quiser mover esse GameObject quadro, chame DestroyImmediate em vez disso.
Uma Âncora Mundial pode não ser localizada no mundo físico em um ponto no tempo. Em seguida, o Unity não atualizará a transformação do objeto ancorado. Essa situação também pode acontecer enquanto um aplicativo está em execução. A falha ao lidar com a alteração na localizabilidade faz com que o objeto não apareça no local físico correto no mundo.
Para ser notificado sobre alterações de localizabilidade:
Assine o OnTrackingChanged evento. O OnTrackingChanged evento é chamado sempre que a âncora espacial subjacente é alterada entre um estado de ser localizado ou não ser localizável.
private void Anchor_OnTrackingChanged(WorldAnchor self, bool located)
{
// This simply activates/deactivates this object and all children when tracking changes
self.gameObject.SetActiveRecursively(located);
}
Se as âncoras estiverem localizadas imediatamente, a isLocated propriedade da âncora será definida como true quando AddComponent<WorldAnchor>() retorna. Portanto, o OnTrackingChanged evento não é disparado. Um padrão mais limpo é chamar o OnTrackingChanged manipulador com o estado inicial IsLocated depois de anexar uma âncora.
Âncoras espaciais salvam hologramas no espaço real entre sessões de aplicativo. Depois de salvas no repositório de âncoras do HoloLens, as âncoras espaciais podem ser encontradas e carregadas em sessões diferentes e são um fallback ideal quando não há conectividade com a Internet.
Importante
As âncoras locais são armazenadas no dispositivo, enquanto as Âncoras Espaciais do Azure são armazenadas na nuvem. Você pode ter âncoras locais e do Azure no mesmo projeto sem conflitos. Para obter mais informações sobre como integrar os serviços de nuvem do Azure para armazenar suas âncoras, consulte Âncoras Espaciais do Azure.
Por padrão, o World Locking Tools restaura o sistema de coordenadas do Unity em relação ao mundo físico em sessões em dispositivos que dão suporte à persistência de âncoras espaciais locais. Para que um holograma apareça no mesmo lugar no mundo físico depois de sair e executar novamente o aplicativo, o aplicativo só precisa restaurar a mesma pose para o holograma.
Se o aplicativo precisar de um controle mais fino, você poderá desabilitar Salvamento Automático e Carregamento Automático no inspetor e gerenciar a persistência de um script. Para obter mais informações, consulte Persistir sistemas de coordenadas espaciais.
O World Locking Tools dá suporte à persistência de âncora local somente em dispositivos HoloLens. Para dispositivos Android, iOS e HoloLens, integre-se às Âncoras Espaciais do Azure para dar suporte à persistência e ao compartilhamento de espaços de coordenadas entre sessões e dispositivos. Para obter mais informações e exemplos usando o World Locking Tools com âncoras espaciais do Azure, consulte WLT (World Locking Tools) combinado com ASA (Âncoras Espaciais do Azure).
Uma API chamada permite que as XRAnchorStore âncoras sejam persistentes entre as sessões. O XRAnchorStore é uma representação das âncoras salvas em um dispositivo. Você pode persistir âncoras da ARAnchors cena do Unity, carregar âncoras do armazenamento em novas ARAnchorsou excluir âncoras do armazenamento.
Observação
Você salva e carrega essas âncoras no mesmo dispositivo. Há suporte para âncoras entre dispositivos por meio de Âncoras Espaciais do Azure.
Namespaces
Para Unity 2020 e OpenXR:
using Microsoft.MixedReality.ARSubsystems.XRAnchorStore
ou Unity 2019/2020 + Plug-in do Windows XR:
using UnityEngine.XR.WindowsMR.XRAnchorStore
Métodos públicos
{
// A list of all persisted anchors, which can be loaded.
public IReadOnlyList<string> PersistedAnchorNames { get; }
// Clear all persisted anchors
public void Clear();
// Load a single persisted anchor by name. The ARAnchorManager will create this new anchor and report it in
// the ARAnchorManager.anchorsChanged event. The TrackableId returned here is the same TrackableId the
// ARAnchor will have when it is instantiated.
public TrackableId LoadAnchor(string name);
// Attempts to persist an existing ARAnchor with the given TrackableId to the local store. Returns true if
// the storage is successful, false otherwise.
public bool TryPersistAnchor(TrackableId id, string name);
// Removes a single persisted anchor from the anchor store. This will not affect any ARAnchors in the Unity
// scene, only the anchors in storage.
public void UnpersistAnchor(string name);
}
Obter uma referência de repositório de âncoras
Para carregar o XRAnchorStore com Unity 2020 e OpenXR, use o método de extensão no XRAnchorSubsystem, o subsistema de um ARAnchorManager:
public static Task<XRAnchorStore> LoadAnchorStoreAsync(this XRAnchorSubsystem anchorSubsystem)
Para carregar o XRAnchorStore com o Unity 2019/2020 e o Plug-in do Windows XR, use o método de extensão no XRReferencePointSubsystem (Unity 2019) ou XRAnchorSubsystem (Unity 2020), o subsistema de um ARReferencePointManager/ARAnchorManager:
// Unity 2019 + Windows XR Plugin
public static Task<XRAnchorStore> TryGetAnchorStoreAsync(this XRReferencePointSubsystem anchorSubsystem);
// Unity 2020 + Windows XR Plugin
public static Task<XRAnchorStore> TryGetAnchorStoreAsync(this XRAnchorSubsystem anchorSubsystem);
Carregar um repositório de âncoras
Para carregar um repositório de âncoras no Unity 2020 e no OpenXR, acesse-o no subsistema arAnchorManager da seguinte maneira:
Para ver um exemplo completo de âncoras persistentes/não persistentes, marcar o script Anchors -> Anchors Sample GameObject and AnchorsSample.cs no [Realidade Misturada OpenXR Plugin Sample Scene]():https://github.com/microsoft/OpenXR-Unity-MixedReality-Samples
Para persistência de holograma em versões mais antigas do Unity ou projetos WSA, use WorldAnchor.
O WorldAnchorStore cria experiências holográficas em que os hologramas permanecem em posições específicas do mundo real entre instâncias do aplicativo. Os usuários podem fixar hologramas individuais onde quiserem e encontrá-los mais tarde no mesmo local em sessões de aplicativo.
O WorldAnchorStore permite que você persista o local das âncoras mundiais entre as sessões. Para persistir hologramas entre sessões, mantenha o controle separado de GameObjects que usam uma âncora de mundo específica. Você pode criar uma GameObject raiz com uma âncora do mundo e ancorar hologramas filho por ela com um deslocamento de posição local.
Para carregar hologramas de sessões anteriores:
Obtenha o WorldAnchorStore.
Carregue dados do aplicativo de âncora mundial, o que fornece a ID da âncora mundial.
Carregue a âncora mundial por sua ID.
Para salvar hologramas para sessões futuras:
Obtenha o WorldAnchorStore.
Salve uma âncora do mundo, especificando uma ID.
Salve os dados do aplicativo relacionados à âncora mundial junto com a ID.
Obter o WorldAnchorStore
Mantenha uma referência ao , para WorldAnchorStoreque você saiba quando ele está pronto para executar uma operação. Como essa chamada é assíncrona, assim que o aplicativo é iniciado, você pode chamar:
WorldAnchorStore.GetAsync(StoreLoaded);
StoreLoaded é o manipulador quando o termina de WorldAnchorStore carregar:
Agora você tem uma referência ao WorldAnchorStore, que pode ser usado para salvar e carregar âncoras de mundo específicas.
Salvar uma âncora do mundo
Para salvar uma âncora mundial, nomeie a âncora do mundo e passe-a no WorldAnchorStore que você obteve antes. Se você tentar salvar duas âncoras na mesma cadeia de caracteres, store.Save retornará false. Exclua o salvamento anterior antes de salvar um novo.
private void SaveGame()
{
// Save data about holograms that this world anchor positions
if (!this.savedRoot) // Only save the root once
{
this.savedRoot = this.store.Save("rootGameObject", anchor);
Assert(this.savedRoot);
}
}
Carregar uma âncora do mundo
Para carregar uma âncora mundial:
private void LoadGame()
{
// Saved data about holograms that this world anchor positions:
this.savedRoot = this.store.Load("rootGameObject", rootGameObject);
if (!this.savedRoot)
{
// Game root not saved. Re-place objects or start over.
}
}
Você também pode usar store.Delete() para remover uma âncora salva anteriormente e store.Clear() remover todos os dados salvos anteriormente.
Enumerar âncoras existentes
Para listar âncoras armazenadas, chame GetAllIds.
string[] ids = this.store.GetAllIds();
for (int index = 0; index < ids.Length; index++)
{
Debug.Log(ids[index]);
}
Persistir hologramas para vários dispositivos
Você pode usar âncoras espaciais do Azure para criar uma âncora de nuvem durável de uma âncora do mundo local. Seu aplicativo pode localizar a âncora de nuvem em vários dispositivos HoloLens, iOS e Android, mesmo que os dispositivos não estejam juntos ao mesmo tempo. Como as âncoras de nuvem são persistentes, vários dispositivos podem ver o conteúdo renderizado em relação a essa âncora no mesmo local físico ao longo do tempo.
Próximas etapas
Compartilhe um espaço de coordenadas bloqueado pelo mundo: