Fazer com que seus hologramas permaneçam no lugar, se movam com você ou, em alguns casos, se posicionem em relação a outros hologramas é uma grande parte da criação de aplicativos de Realidade Mista. Este artigo irá guiá-lo através de nossa solução recomendada usando World Locking Tools, mas também abordaremos a configuração manual de âncoras espaciais em seus projetos Unity. Antes de entrarmos em qualquer código, é importante entender como Unity lida com o espaço de coordenadas e âncoras em seu próprio mecanismo.
Sistemas de coordenadas à 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 de mundo absoluto para o qual todas as outras coordenadas possam ser mapeadas de forma confiável. Nesse ambiente, você sempre pode encontrar uma transformação estável que define uma relação entre quaisquer dois objetos nesse mundo. Se você não movesse esses objetos, suas transformações relativas permaneceriam sempre as mesmas. Este tipo de sistema de coordenadas globais é fácil de acertar ao renderizar um mundo puramente virtual onde você conhece toda a geometria com antecedência. Hoje em dia, os aplicativos de RV em escala de sala normalmente estabelecem esse tipo de sistema de coordenadas em escala de sala absoluta com sua origem no chão.
Em contraste, um dispositivo de realidade mista sem amarras como o HoloLens tem uma compreensão dinâmica do mundo orientada por sensores, ajustando continuamente seu conhecimento ao longo do tempo dos arredores do usuário enquanto ele caminha muitos metros por um andar inteiro de um edifício. Em uma experiência em escala mundial, se você colocasse todos os seus hologramas em um sistema de coordenadas rígidas ingênuas, esses hologramas acabariam flutuando ao longo do tempo, com base no mundo ou em relação uns aos outros.
Por exemplo, o fone de ouvido pode atualmente acreditar que dois locais no mundo estão a 4 metros de distância e, mais tarde, refinar esse entendimento, aprendendo que os locais estão, na verdade, 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 apareceria sempre a 0,1 metro de distância 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 estiver móvel. No entanto, isso sacrifica a autoconsistência dentro do mundo virtual. Diferentes âncoras estão constantemente se movendo em relação umas às outras, e também estão se movendo através do espaço de coordenadas globais. Nesse cenário, tarefas simples como layout tornam-se difíceis. A simulação física também pode ser problemática.
World Locking Tools (WLT) oferece o melhor dos dois mundos, estabilizando um único sistema de coordenadas rígidas usando um suprimento interno de âncoras espaciais espalhadas por toda a cena virtual à medida que o usuário se movimenta. WLT analisa as coordenadas da câmera e essas âncoras espaciais 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 fixa as coordenadas da cabeça.
World Locking Tools fornece um sistema de coordenadas estável que minimiza as inconsistências visíveis entre marcadores do mundo virtual e real. World Locking Tools bloqueia toda a cena com um pool compartilhado de âncoras, em vez de bloquear cada grupo de objetos com a própria âncora individual do grupo.
World Locking Tools lida automaticamente com a criação interna e gerenciamento de âncoras espaciais. Você não precisa interagir com ARAnchorManager ou WorldAnchor para manter seus hologramas bloqueados no mundo.
Para 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 as World Locking Tools, baixe a Mixed Reality Feature Tool. Para saber mais sobre as noções básicas, consulte a página principal de documentação das Ferramentas de Bloqueio Mundial para obter links para Visão geral, Guia de início rápido e outros tópicos úteis.
Quando seu projeto estiver pronto, execute o utilitário de configuração de cena das Ferramentas de Bloqueio Mundial de Realidade > Mista:
Importante
O utilitário Configurar cena pode ser executado novamente a qualquer momento. Por exemplo, ele deve ser executado novamente se o destino de RA tiver sido alterado de Legacy para XR SDK. Se a cena já estiver configurada corretamente, a execução do utilitário não terá efeito.
Visualizadores
Durante o desenvolvimento inicial, adicionar 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 qualquer 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 Mixed Reality OpenXR Plugin fornece funcionalidade de âncora básica através de uma implementação do ARFoundation ARAnchorManager da Unity. Para aprender as noções básicas sobre ARAnchors em ARFoundation, visite o Manual de ARFoundation para AR Anchor Manager.
Espaço de nomes:UnityEngine.XR.WSA Tipo:WorldAnchor
Este objeto de jogo está agora 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 o alinhamento físico. Consulte Carregar uma âncora mundial para encontrar esse local ancorado novamente em uma sessão futura do aplicativo.
Remover uma âncora mundial
Se você não quiser mais o GameObject bloqueado para um local do mundo físico e não pretende movê-lo para este quadro, chame Destroy o componente World Anchor.
Destroy(gameObject.GetComponent<WorldAnchor>());
Se você quiser mover este quadro, chame GameObjectDestroyImmediate em vez disso.
Uma Âncora Mundial pode não ser localizável no mundo físico em um determinado momento. O Unity, então, 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 em lidar com a mudança na locatabilidade faz 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 OnTrackingChanged evento. O OnTrackingChanged evento é chamado sempre que a âncora espacial subjacente muda entre um estado de ser localizável 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 é acionado. Um padrão mais limpo é chamar o OnTrackingChanged manipulador com o estado inicial IsLocated depois de anexar uma âncora.
As âncoras espaciais economizam hologramas no espaço do mundo real entre as sessões de aplicativos. Uma vez guardadas na loja de âncoras HoloLens, as âncoras espaciais podem ser encontradas e carregadas em diferentes sessões 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 conflito. 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, as Ferramentas de Bloqueio Mundial restauram o sistema de coordenadas do Unity em relação ao mundo físico em sessões em dispositivos que suportam a 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 preciso, você poderá desabilitar o Salvamento e o Carregamento Automáticos no inspetor e gerenciar a persistência a partir de um script. Para obter mais informações, consulte Persistir sistemas de coordenadas espaciais.
O World Locking Tools suporta persistência de âncora local apenas em dispositivos HoloLens. Para dispositivos Android, iOS e HoloLens, integre-se com as Â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 as Ferramentas de Bloqueio Mundial com Âncoras Espaciais do Azure, consulte Ferramentas de Bloqueio Mundial (WLT) combinadas com Âncoras Espaciais do Azure (ASA).
Uma API chamada permite que as âncoras XRAnchorStore sejam persistidas entre as sessões. O XRAnchorStore é uma representação das âncoras salvas em um dispositivo. Você pode persistir âncoras ARAnchors na cena Unity, carregar âncoras do armazenamento para novas ARAnchorsou excluir âncoras do armazenamento.
Nota
Você salva e carrega essas âncoras no mesmo dispositivo. As âncoras entre dispositivos são suportadas através das Âncoras Espaciais do Azure.
Espaços de nomes
Para Unity 2020 e OpenXR:
using Microsoft.MixedReality.ARSubsystems.XRAnchorStore
ou Unity 2019/2020 + Windows XR Plugin:
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 loja âncora
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 XR do Windows, 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 uma loja âncora
Para carregar uma loja âncora no Unity 2020 e no OpenXR, acesse-a a partir de um subsistema do ARAnchorManager da seguinte maneira:
Para ver um exemplo completo de âncoras persistentes/não persistentes, confira o script Anchors -> Anchors Sample GameObject e AnchorsSample.cs na [Mixed Reality 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.
Espaço de nomes:UnityEngine.XR.WSA.Persistence Classe:WorldAnchorStore
A WorldAnchorStore cria experiências holográficas onde os hologramas permanecem em posições específicas do mundo real em todas as instâncias do aplicativo. Os usuários podem fixar hologramas individuais onde quiserem e encontrá-los mais tarde no mesmo local durante as sessões do aplicativo.
O WorldAnchorStore permite que você persista a localização das âncoras do mundo nas sessões. Para persistir hologramas nas sessões, acompanhe separadamente o uso de GameObjects uma âncora mundial específica. Você pode criar uma GameObject raiz com uma âncora mundial e ancorar hologramas filho com um deslocamento de posição local.
Para carregar hologramas de sessões anteriores:
Obtenha o WorldAnchorStore.
Carregue dados do aplicativo âncora mundial, que fornece o ID da âncora mundial.
Carregue a âncora mundial pelo seu ID.
Para guardar hologramas para sessões futuras:
Obtenha o WorldAnchorStore.
Salve uma âncora mundial, especificando um ID.
Salve os dados do aplicativo relacionados à âncora mundial junto com o ID.
Obtenha a WorldAnchorStore
Mantenha uma referência ao WorldAnchorStore, para saber quando ele está pronto para executar uma operação. Como essa chamada é assíncrona, assim que o aplicativo for iniciado, você poderá chamar:
WorldAnchorStore.GetAsync(StoreLoaded);
StoreLoaded é o manipulador quando o WorldAnchorStore carregamento termina:
Agora você tem uma referência ao , que você pode usar para salvar e carregar âncoras WorldAnchorStoremundiais específicas.
Salvar uma âncora mundial
Para salvar uma âncora mundial, nomeie a âncora mundial e passe-a no que WorldAnchorStore você tem 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 mundial
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() para 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]);
}
Hologramas persistentes para vários dispositivos
Você pode usar as Âncoras Espaciais do Azure para criar uma âncora de nuvem durável a partir de uma âncora do mundo local. Seu aplicativo pode localizar a âncora da 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óximos passos
Partilhe um espaço de coordenadas bloqueado no mundo: