mapeamento espacial
O mapeamento espacial fornece uma representação detalhada das superfícies do mundo real no ambiente em torno do HoloLens, permitindo que os desenvolvedores criem uma experiência de realidade misturada convincente. Ao mesclar o mundo real com o mundo virtual, um aplicativo pode fazer com que os hologramas pareçam reais. Os aplicativos também podem se alinhar mais naturalmente às expectativas do usuário fornecendo comportamentos e interações familiares do mundo real.
Suporte a dispositivos
Recurso | HoloLens (1ª geração) | HoloLens 2 | Headsets imersivos |
mapeamento espacial | ✔️ | ✔️ | ❌ |
Por que o mapeamento espacial é importante?
O mapeamento espacial torna possível posicionar objetos em superfícies reais. Isso ajuda a ancorar objetos no mundo do usuário e aproveita as indicações de profundidade do mundo real. Ocluir seus hologramas com base em outros hologramas e objetos do mundo real ajuda a convencer o usuário de que esses hologramas estão realmente em seu espaço. Hologramas flutuando no espaço ou se movendo com o usuário não se sentirão tão reais. Quando possível, coloque os itens para conforto.
Visualizar superfícies ao colocar ou mover hologramas (use uma grade projetada). Isso ajuda os usuários a saber onde eles podem colocar melhor seus hologramas e mostra se o local em que estão tentando colocar o holograma não está mapeado. Você pode "itens de outdoor" em direção ao usuário se eles acabarem em um ângulo demais.
Visão geral conceitual
Um exemplo de uma malha de mapeamento espacial cobrindo uma sala
Os dois tipos de objeto primário usados para mapeamento espacial são o 'Observador de Superfície Espacial' e a 'Superfície Espacial'.
O aplicativo fornece ao Observador de Superfície Espacial um ou mais volumes delimitador para definir as regiões de espaço em que o aplicativo deseja receber dados de mapeamento espacial. Para cada um desses volumes, o mapeamento espacial fornecerá ao aplicativo um conjunto de Superfícies Espaciais.
Esses volumes podem ser estacionários (em um local fixo com base no mundo real) ou podem estar anexados ao HoloLens (eles se movem, mas não giram, com o HoloLens conforme ele se move pelo ambiente). Cada superfície espacial descreve superfícies do mundo real em um pequeno volume de espaço, representado como uma malha de triângulo anexada a um sistema de coordenadas espaciais com bloqueio mundial.
À medida que o HoloLens coleta novos dados sobre o ambiente e, à medida que ocorrem alterações no ambiente, as superfícies espaciais aparecerão, desaparecerão e serão alteradas.
Demonstração de conceitos de design de reconhecimento espacial
Se você quiser ver os conceitos de design de Reconhecimento Espacial em ação, marcar nossa demonstração de vídeo Designing Holograms – Spatial Awareness abaixo. Depois de assistir ao vídeo, prossiga para saber mais sobre os tópicos específicos.
Este vídeo foi obtido do aplicativo HoloLens 2 "Designing Holograms". Baixe-o e aproveite a experiência completa aqui.
Mapeamento espacial versus Reconhecimento de Cena WorldMesh
Para HoloLens 2, é possível consultar uma versão estática dos dados de mapeamento espacial usando o SDK de reconhecimento de cena (configuração EnableWorldMesh). Aqui estão as diferenças entre duas maneiras de acessar os dados de mapeamento espacial:
- API de Mapeamento Espacial:
- Intervalo limitado: os dados de mapeamento espacial disponíveis para aplicativos em um tamanho limitado armazenados em cache em 'bolha' ao redor do usuário.
- Fornece atualizações de baixa latência de regiões de malha alteradas por meio de eventos SurfacesChanged.
- Nível variável de detalhes controlados pelo parâmetro Triângulos por Medidor Cúbico.
- SDK de reconhecimento de cena:
- Intervalo ilimitado – fornece todos os dados de mapeamento espacial verificados dentro do raio da consulta.
- Fornece uma instantâneo estática dos dados de mapeamento espacial. Obter os dados de mapeamento espacial atualizados requer a execução de uma nova consulta para toda a malha.
- Nível consistente de detalhes controlados pela configuração RequestedMeshLevelOfDetail.
O que influencia a qualidade do mapeamento espacial?
Vários fatores, detalhados aqui, podem afetar a frequência e a gravidade desses erros. No entanto, você deve projetar seu aplicativo para que o usuário possa atingir suas metas mesmo na presença de erros nos dados de mapeamento espacial.
Cenários de uso comuns
Posicionamento
O mapeamento espacial fornece aos aplicativos a oportunidade de apresentar formas naturais e familiares de interação para o usuário; o que poderia ser mais natural do que colocar seu telefone na mesa?
A restrição do posicionamento de hologramas (ou mais geralmente, qualquer seleção de localizações espaciais) para se situar em superfícies fornece um mapeamento natural de 3D (ponto no espaço) para 2D (ponto na superfície). Isso reduz a quantidade de informações que o usuário precisa fornecer ao aplicativo e torna as interações do usuário mais rápidas, fáceis e precisas. Isso é verdade porque "distância" não é algo que estamos acostumados a nos comunicar fisicamente com outras pessoas ou com computadores. Quando apontamos com o dedo, estamos especificando uma direção, mas não uma distância.
Uma ressalva importante aqui é que quando um aplicativo infere distância da direção (por exemplo, fazendo um raycast ao longo da direção do foco do usuário para encontrar a superfície espacial mais próxima), isso deve produzir resultados que o usuário pode prever de forma confiável. Caso contrário, o usuário perderá o senso de controle e isso pode rapidamente se tornar frustrante. Um método que ajuda com isso é fazer vários raycasts em vez de apenas um. Os resultados agregados devem ser mais suaves e previsíveis, menos suscetíveis à influência de resultados transitórios de "exceção" (como pode ser causado por raios passando por pequenos buracos ou atingindo pequenos bits de geometria dos quais o usuário não está ciente). A agregação ou suavização também pode ser executada ao longo do tempo; por exemplo, você pode limitar a velocidade máxima na qual um holograma pode variar de distância do usuário. Simplesmente limitar o valor de distância mínima e máxima também pode ajudar, de modo que o holograma que está sendo movido de repente não voe para longe ou volte para o rosto do usuário.
Os aplicativos também podem usar a forma e a direção das superfícies para orientar o posicionamento do holograma. Uma cadeira holográfica não deve penetrar pelas paredes e deve sentar-se com o chão, mesmo que seja ligeiramente desigual. Esse tipo de funcionalidade provavelmente dependeria do uso de colisões físicas em vez de raycasts, no entanto, preocupações semelhantes se aplicarão. Se o holograma que está sendo colocado tem muitos polígonos pequenos que se destacam, como as pernas em uma cadeira, pode fazer sentido expandir a representação física desses polígonos para algo mais largo e suave para que eles sejam mais capazes de deslizar sobre superfícies espaciais sem empecilhos.
No extremo, a entrada do usuário pode ser simplificada inteiramente e as superfícies espaciais podem ser usadas para fazer o posicionamento totalmente automático do holograma. Por exemplo, o aplicativo pode colocar um comutador de luz holográfico em algum lugar na parede para o usuário pressionar. A mesma ressalva sobre previsibilidade se aplica duplamente aqui; se o usuário espera controle sobre o posicionamento do holograma, mas o aplicativo nem sempre coloca hologramas onde espera (se o comutador de luz aparecer em algum lugar que o usuário não consegue alcançar), essa será uma experiência frustrante. Na verdade, pode ser pior fazer o posicionamento automático que requer correção do usuário algumas vezes do que apenas exigir que o usuário sempre faça o posicionamento por conta própria; porque o posicionamento automático bem-sucedido é esperado, a correção manual parece um fardo!
Observe também que a capacidade de um aplicativo usar superfícies espaciais para posicionamento depende muito da experiência de verificação do aplicativo. Se uma superfície não tiver sido verificada, ela não poderá ser usada para posicionamento. Cabe ao aplicativo deixar isso claro para o usuário, para que ele possa ajudar a examinar novas superfícies ou selecionar um novo local.
Os comentários visuais para o usuário são de extrema importância durante o posicionamento. O usuário precisa saber onde o holograma se baseia na superfície mais próxima com efeitos de aterramento. Eles devem entender por que o movimento de seu holograma está sendo restrito (por exemplo, devido a colisões com outra superfície próxima). Se eles não puderem colocar um holograma no local atual, os comentários visuais deverão deixar claro por que não. Por exemplo, se o usuário estiver tentando colocar um sofá holográfico preso no meio da parede, as partes do sofá que estão atrás da parede devem pulsar em uma cor furiosa. Ou, por outro lado, se o aplicativo não conseguir encontrar uma superfície espacial em um local onde o usuário possa ver uma superfície do mundo real, o aplicativo deverá deixar isso claro. A óbvia ausência de um efeito de aterramento nesta área pode atingir essa finalidade.
Oclusão
Um dos principais usos de superfícies de mapeamento espacial é simplesmente ocluir hologramas. Esse comportamento simples tem um enorme impacto no realismo percebido dos hologramas, ajudando a criar uma sensação visceral que realmente habita o mesmo espaço físico que o usuário.
A oclusão também fornece informações ao usuário; quando um holograma parece estar isolado por uma superfície do mundo real, isso fornece comentários visuais extras sobre a localização espacial desse holograma no mundo. Por outro lado, a oclusão também pode ocultar informações do usuário de maneira útil; A oclusão de hologramas atrás de paredes pode reduzir a desordem visual de maneira intuitiva. Para ocultar ou revelar um holograma, o usuário precisa apenas mover a cabeça.
A oclusão também pode ser usada para preparar as expectativas para uma interface do usuário natural com base em interações físicas familiares; se um holograma é ocluído por uma superfície, é porque essa superfície é sólida, portanto, o usuário deve esperar que o holograma entre em conflito com essa superfície e não passe por ela.
Às vezes, a oclusão de hologramas é indesejável. Se um usuário precisar interagir com um holograma, ele precisará vê-lo , mesmo que esteja atrás de uma superfície do mundo real. Nesses casos, geralmente faz sentido renderizar esse holograma de forma diferente quando ele é ocluído (por exemplo, reduzindo seu brilho). Dessa forma, o usuário pode localizar visualmente o holograma, mas ainda saberá que ele está por trás de algo.
Física
O uso da simulação física é outra maneira pela qual o mapeamento espacial pode ser usado para reforçar a presença de hologramas no espaço físico do usuário. Quando minha bola de borracha holográfica rola realisticamente da minha mesa, pula pelo chão e desaparece debaixo do sofá, pode ser difícil para mim acreditar que não está lá.
A simulação de física também oferece a oportunidade de um aplicativo usar interações naturais e familiares baseadas em física. Mover um móvel holográfico no chão provavelmente será mais fácil para o usuário se o móvel responder como se estivesse deslizando pelo chão com a inércia e atrito apropriados.
Para gerar comportamentos físicos realistas, você provavelmente precisará fazer algum processamento de malha , como preencher buracos, remover alucinações flutuantes e suavizar superfícies ásperas.
Você também precisará considerar como a experiência de verificação do aplicativo influencia sua simulação física. Em primeiro lugar, superfícies ausentes não colidirão com nada; o que acontece quando a bola de borracha rola pelo corredor e fora do fim do mundo conhecido? Em segundo lugar, você precisa decidir se continuará respondendo às alterações no ambiente ao longo do tempo. Em alguns casos, você vai querer responder o mais rápido possível; diga se o usuário está usando portas e móveis como barricadas móveis em defesa contra uma tempestade de flechas romanas recebidas. Em outros casos, porém, talvez você queira ignorar novas atualizações; Dirigir seu carro esportivo holográfico ao redor da pista de corrida no chão pode de repente não ser tão divertido se seu cão decidir sentar no meio da pista.
Navegação
Os aplicativos podem usar dados de mapeamento espacial para conceder a caracteres holográficos (ou agentes) a capacidade de navegar pelo mundo real da mesma maneira que uma pessoa real faria. Isso pode ajudar a reforçar a presença de caracteres holográficos restringindo-os ao mesmo conjunto de comportamentos naturais e familiares que os do usuário e seus amigos.
Os recursos de navegação também podem ser úteis para os usuários. Depois que um mapa de navegação tiver sido criado em uma determinada área, ele poderá ser compartilhado para fornecer instruções holográficas para novos usuários que não estão familiarizados com esse local. Este mapa poderia ser projetado para ajudar a manter o "tráfego" de pedestres fluindo sem problemas, ou para evitar acidentes em locais perigosos, como canteiros de obras.
Os principais desafios técnicos envolvidos na implementação da funcionalidade de navegação serão a detecção confiável de superfícies andáveis (os humanos não andam sobre tabelas!) e a adaptação graciosa às mudanças no ambiente (os humanos não caminham por portas fechadas!). A malha pode exigir algum processamento antes de ser utilizável para planejamento e navegação de caminho por um caractere virtual. Suavizar a malha e remover alucinações pode ajudar a evitar que os personagens fiquem presos. Você também pode querer simplificar drasticamente a malha para acelerar os cálculos de navegação e planejamento de caminho do seu caractere. Esses desafios têm recebido muita atenção no desenvolvimento da tecnologia de videogames, e há uma riqueza de literatura de pesquisa disponível sobre esses tópicos.
A funcionalidade interna do NavMesh no Unity não pode ser usada por padrão para superfícies de mapeamento espacial porque as superfícies não são conhecidas até que o aplicativo seja iniciado. No entanto, você pode criar um NavMesh durante o runtime instalando NavMeshComponents. Observe que o sistema de mapeamento espacial não fornecerá informações sobre superfícies distantes do local atual do usuário; para criar um mapa de uma área grande, o aplicativo deve "lembrar" superfícies. Você também pode aumentar a configuração de extensões de observação no perfil de reconhecimento espacial, o que aumenta a área na qual você pode criar seu NavMesh.
Visualização
Na maioria das vezes, é apropriado que as superfícies espaciais sejam invisíveis; para minimizar a desordem visual e deixar o mundo real falar por si mesmo. No entanto, às vezes é útil visualizar superfícies de mapeamento espacial diretamente, apesar de seus equivalentes do mundo real estarem visíveis.
Por exemplo, quando o usuário está tentando colocar um holograma em uma superfície (colocando um armário holográfico na parede, digamos) pode ser útil 'aterrar' o holograma convertendo uma sombra na superfície. Isso dá ao usuário uma sensação muito mais clara da proximidade física exata entre o holograma e a superfície. Este também é um exemplo da prática mais geral de "visualizar" visualmente uma alteração antes que o usuário se comprometa com ela.
Ao visualizar superfícies, o aplicativo pode compartilhar com o usuário sua compreensão do ambiente. Por exemplo, um jogo de tabuleiro holográfico poderia visualizar as superfícies horizontais identificadas como "tabelas", para que o usuário saiba para onde deve ir para interagir.
Visualizar superfícies pode ser uma maneira útil de mostrar ao usuário espaços próximos que estão ocultos da exibição. Isso poderia fornecer uma maneira de dar ao usuário acesso à sua cozinha (e a todos os seus hologramas contidos) de sua sala de estar.
As malhas de superfície fornecidas pelo mapeamento espacial podem não ser particularmente "limpo". É importante visualizá-los adequadamente. Cálculos de iluminação tradicionais podem realçar erros em normais de superfície de maneira visualmente distrativa, enquanto texturas "limpo" projetadas na superfície podem ajudar a dar-lhe uma aparência mais arrumada. Também é possível fazer o processamento de malha para melhorar as propriedades da malha, antes que as superfícies sejam renderizadas.
Observação
HoloLens 2 implementa um novo Runtime de Reconhecimento de Cena, que fornece aos desenvolvedores Realidade Misturada uma representação de ambiente estruturada e de alto nível projetada para simplificar a implementação de posicionamento, oclusão, física e navegação.
Usando o Surface Observer
O ponto de partida para mapeamento espacial é o observador de superfície. O fluxo do programa é o seguinte:
- Criar um objeto de observador de superfície
- Forneça um ou mais volumes espaciais para definir as regiões de interesse nas quais o aplicativo deseja receber dados de mapeamento espacial. Um volume espacial é simplesmente uma forma que define uma região de espaço, como uma esfera ou uma caixa.
- Use um volume espacial com um sistema de coordenadas espaciais com bloqueio de mundo para identificar uma região fixa do mundo físico.
- Use um volume espacial, atualizado cada quadro com um sistema de coordenadas espaciais bloqueado pelo corpo, para identificar uma região de espaço que se move (mas não gira) com o usuário.
- Esses volumes espaciais podem ser alterados posteriormente a qualquer momento, conforme o status do aplicativo ou do usuário é alterado.
- Usar sondagem ou notificação para recuperar informações sobre superfícies espaciais
- Você pode "sondar" o observador de superfície para superfície espacial status a qualquer momento. Em vez disso, você pode se registrar para o evento "superfícies alteradas" do observador de superfície, que notificará o aplicativo quando as superfícies espaciais forem alteradas.
- Para um volume espacial dinâmico, como o frusto de exibição ou um volume bloqueado pelo corpo, os aplicativos precisarão sondar alterações em cada quadro definindo a região de interesse e, em seguida, obtendo o conjunto atual de superfícies espaciais.
- Para um volume estático, como um cubo com bloqueio de mundo cobrindo uma única sala, os aplicativos podem se registrar para que o evento "superfícies alteradas" seja notificado quando superfícies espaciais dentro desse volume podem ter sido alteradas.
- Alterações de superfícies de processo
- Itere o conjunto fornecido de superfícies espaciais.
- Classifique superfícies espaciais como adicionadas, alteradas ou removidas.
- Para cada superfície espacial adicionada ou alterada, se apropriado, envie uma solicitação assíncrona para receber a malha atualizada que representa o estado atual da superfície no nível desejado de detalhes.
- Processe a solicitação de malha assíncrona (mais detalhes nas seções a seguir).
Cache de malha
As superfícies espaciais são representadas por malhas de triângulo densas. Armazenar, renderizar e processar essas malhas pode consumir recursos computacionais e de armazenamento significativos. Dessa forma, cada aplicativo deve adotar um esquema de cache de malha apropriado às suas necessidades, para minimizar os recursos usados para processamento e armazenamento de malha. Esse esquema deve determinar quais malhas manter e quais descartar e quando atualizar a malha para cada superfície espacial.
Muitas das considerações discutidas lá informarão diretamente como seu aplicativo deve abordar o cache de malha. Você deve considerar como o usuário se move pelo ambiente, quais superfícies são necessárias, quando diferentes superfícies serão observadas e quando as alterações no ambiente devem ser capturadas.
Ao interpretar o evento 'superfícies alteradas' fornecido pelo observador de superfície, a lógica básica de cache de malha é a seguinte:
- Se o aplicativo vir uma ID de superfície espacial que ele não viu antes, ele deverá tratar isso como uma nova superfície espacial.
- Se o aplicativo vir uma superfície espacial com uma ID conhecida, mas com um novo tempo de atualização, ele deverá tratar isso como uma superfície espacial atualizada.
- Se o aplicativo não vir mais uma superfície espacial com uma ID conhecida, ele deverá tratá-la como uma superfície espacial removida.
Cabe a cada aplicativo fazer as seguintes escolhas:
- Para novas superfícies espaciais, a malha deve ser solicitada?
- Geralmente, a malha deve ser solicitada imediatamente para novas superfícies espaciais, o que pode fornecer novas informações úteis ao usuário.
- No entanto, novas superfícies espaciais próximas e na frente do usuário devem ter prioridade e sua malha deve ser solicitada primeiro.
- Se a nova malha não for necessária, se, por exemplo, o aplicativo tiver 'congelado' permanente ou temporariamente seu modelo do ambiente, ele não deverá ser solicitado.
- Para superfícies espaciais atualizadas, a malha deve ser solicitada?
- As superfícies espaciais atualizadas próximas e na frente do usuário devem ter prioridade e a malha deve ser solicitada primeiro.
- Também pode ser apropriado dar prioridade mais alta a novas superfícies do que a superfícies atualizadas, especialmente durante a experiência de verificação.
- Para limitar os custos de processamento, os aplicativos podem querer limitar a taxa na qual processam atualizações para superfícies espaciais.
- Pode ser possível inferir que as alterações em uma superfície espacial são pequenas, por exemplo, se os limites da superfície são pequenos, nesse caso, a atualização pode não ser importante o suficiente para processar.
- Atualizações a superfícies espaciais fora da região atual de interesse do usuário podem ser totalmente ignoradas, embora, nesse caso, possa ser mais eficiente modificar os volumes delimitadores espaciais em uso pelo observador de superfície.
- Para superfícies espaciais removidas, a malha deve ser descartada?
- Geralmente, a malha deve ser descartada imediatamente para superfícies espaciais removidas, para que a oclusão do holograma permaneça correta.
- No entanto, se o aplicativo tiver motivos para acreditar que uma superfície espacial reaparecerá em breve (com base no design da experiência do usuário), talvez seja mais eficiente mantê-la do que descartar sua malha e recriá-la novamente mais tarde.
- Se o aplicativo estiver criando um modelo em larga escala do ambiente do usuário, talvez ele não deseje descartar nenhuma malha. No entanto, ele ainda precisará limitar o uso de recursos, possivelmente fazendo spool de malhas para o disco à medida que as superfícies espaciais desaparecerem.
- Alguns eventos relativamente raros durante a geração de superfície espacial podem fazer com que superfícies espaciais sejam substituídas por novas superfícies espaciais em um local semelhante, mas com IDs diferentes. Portanto, os aplicativos que optam por não descartar uma superfície removida devem ter cuidado para não acabar com várias malhas de superfícies espaciais altamente sobrepostas cobrindo o mesmo local.
- A malha deve ser descartada para outras superfícies espaciais?
- Mesmo que exista uma superfície espacial, se ela não for mais útil para a experiência do usuário, ela deverá ser descartada. Por exemplo, se o aplicativo 'substituir' a sala do outro lado de uma porta por um espaço virtual alternativo, as superfícies espaciais nessa sala não serão mais importantes.
Aqui está um exemplo de estratégia de cache de malha, usando histerese espacial e temporal:
- Considere um aplicativo que deseja usar um volume espacial de interesse em forma de tronco que siga o olhar do usuário enquanto ele olha ao redor e anda por aí.
- Uma superfície espacial pode desaparecer temporariamente desse volume simplesmente porque o usuário olha para longe da superfície ou se afasta dela... apenas para olhar para trás ou se aproximar novamente um momento depois. Nesse caso, descartar e recriar a malha para essa superfície representa muitos processamentos redundantes.
- Para reduzir o número de alterações processadas, o aplicativo usa dois observadores de superfície espacial, um contido dentro do outro. O volume maior é esférico e segue o usuário 'preguiçosamente'; ele só se move quando necessário para garantir que seu centro esteja dentro de 2,0 metros do usuário.
- Malhas de superfície espacial novas e atualizadas são sempre processadas do observador de superfície interna menor, mas as malhas são armazenadas em cache até desaparecerem do observador de superfície externa maior. Isso permite que o aplicativo evite processar muitas alterações redundantes devido à movimentação do usuário local.
- Como uma superfície espacial também pode desaparecer temporariamente devido à perda de rastreamento, o aplicativo também adia o descarte de superfícies espaciais removidas durante a perda de rastreamento.
- Em geral, um aplicativo deve avaliar a compensação entre o processamento de atualização reduzido e o aumento do uso de memória para determinar sua estratégia de cache ideal.
Renderização
Há três maneiras principais pelas quais as malhas de mapeamento espacial tendem a ser usadas para renderização:
- Para visualização de superfície
- Geralmente, é útil visualizar superfícies espaciais diretamente. Por exemplo, a conversão de 'sombras' de objetos em superfícies espaciais pode fornecer comentários visuais úteis ao usuário enquanto ele está colocando hologramas em superfícies.
- Uma coisa a ter em mente é que as malhas espaciais são diferentes do tipo de malha que um artista 3D pode criar. A topologia de triângulo não será tão "limpo" quanto a topologia criada por humanos, e a malha sofrerá com vários erros.
- Para criar uma estética visual agradável, convém fazer algum processamento de malha, por exemplo, para preencher buracos ou normais de superfície suave. Talvez você também queira usar um sombreador para projetar texturas projetadas por artistas em sua malha, em vez de visualizar diretamente a topologia e os normais de malha.
- Para ocluir hologramas por trás de superfícies do mundo real
- As superfícies espaciais podem ser renderizadas em uma passagem somente de profundidade, que afeta apenas o buffer de profundidade e não afeta os destinos de renderização de cor.
- Isso prepara o buffer de profundidade para ocluir hologramas renderizados posteriormente atrás de superfícies espaciais. A oclusão precisa de hologramas melhora a sensação de que os hologramas realmente existem dentro do espaço físico do usuário.
- Para habilitar a renderização somente de profundidade, atualize o estado de combinação para definir o RenderTargetWriteMask como zero para todos os destinos de renderização de cor.
- Para modificar a aparência de hologramas ocluídos por superfícies do mundo real
- A geometria normalmente renderizada fica oculta quando é ocluída. Isso é feito definindo a função de profundidade em seu estado de estêncil de profundidade como "menor ou igual", o que faz com que a geometria fique visível apenas quando estiver mais próxima da câmera do que toda a geometria renderizada anteriormente.
- No entanto, pode ser útil manter determinada geometria visível mesmo quando está ocluída e modificar sua aparência quando ocluído como uma forma de fornecer comentários visuais ao usuário. Por exemplo, isso permite que o aplicativo mostre ao usuário a localização de um objeto, deixando claro que está atrás de uma superfície do mundo real.
- Para conseguir isso, renderize a geometria uma segunda vez com um sombreador diferente que cria a aparência 'ocluída' desejada. Antes de renderizar a geometria pela segunda vez, faça duas alterações no estado de estêncil de profundidade. Primeiro, defina a função de profundidade como "maior ou igual" para que a geometria fique visível apenas quando estiver mais longe da câmera do que toda a geometria renderizada anteriormente. Em segundo lugar, defina DepthWriteMask como zero, para que o buffer de profundidade não seja modificado (o buffer de profundidade deve continuar a representar a profundidade da geometria mais próxima da câmera).
O desempenho é uma preocupação importante ao renderizar malhas de mapeamento espacial. Aqui estão algumas técnicas de desempenho de renderização específicas para renderizar malhas de mapeamento espacial:
- Ajustar a densidade do triângulo
- Ao solicitar malhas de superfície espacial do observador de superfície, solicite a menor densidade de malhas de triângulo que serão suficientes para suas necessidades.
- Pode fazer sentido variar a densidade do triângulo em uma superfície por superfície, dependendo da distância da superfície do usuário e de sua relevância para a experiência do usuário.
- A redução das contagens de triângulos reduzirá o uso de memória e os custos de processamento de vértice na GPU, embora isso não afete os custos de processamento de pixels.
- Usar o abate de frutos
- O abate de frutos ignora objetos de desenho que não podem ser vistos porque estão fora do frusto de exibição atual. Isso reduz os custos de processamento de CPU e GPU.
- Como o abate é executado por malha e as superfícies espaciais podem ser grandes, dividir cada malha de superfície espacial em partes menores pode resultar em um abate mais eficiente (em que menos triângulos fora da tela são renderizados). Há uma compensação, no entanto; quanto mais malhas você tiver, mais chamadas de desenho você deve fazer, o que pode aumentar os custos de CPU. Em um caso extremo, os cálculos de abate de frutos em si podem até ter um custo mensurável da CPU.
- Ajustar a ordem de renderização
- As superfícies espaciais tendem a ser grandes, pois representam todo o ambiente do usuário ao seu redor. Os custos de processamento de pixel na GPU podem ser altos, especialmente nos casos em que há mais de uma camada de geometria visível (incluindo superfícies espaciais e outros hologramas). Nesse caso, a camada mais próxima do usuário estará ocluindo todas as camadas mais distantes, portanto, qualquer tempo de GPU gasto para renderizar essas camadas mais distantes é desperdiçado.
- Para reduzir esse trabalho redundante na GPU, ele ajuda a renderizar superfícies opacas em ordem front-to-back (mais próximas primeiro, mais distantes por último). Por 'opaco', queremos dizer superfícies para as quais DepthWriteMask é definido como um em seu estado de estêncil de profundidade. Quando as superfícies mais próximas forem renderizadas, elas prepararão o buffer de profundidade para que superfícies mais distantes sejam ignoradas com eficiência pelo processador de pixels na GPU.
Processamento de malha
Um aplicativo pode querer fazer várias operações em malhas de superfície espacial para atender às suas necessidades. Os dados de índice e vértice fornecidos com cada malha de superfície espacial usam o mesmo layout familiar que os buffers de vértice e índice usados para renderizar malhas de triângulo em todas as APIs de renderização modernas. No entanto, um fato importante a ser considerado é que os triângulos de mapeamento espacial têm uma ordem de enrolamento frontal no sentido horário. Cada triângulo é representado por três índices de vértice no buffer de índice da malha e esses índices identificarão os vértices do triângulo em uma ordem no sentido horário , quando o triângulo for exibido do lado frontal . O lado frontal (ou externo) das malhas de superfície espacial corresponde ao lado frontal (visível) das superfícies do mundo real.
Os aplicativos só deverão fazer simplificação de malha se a densidade de triângulo mais grosseira fornecida pelo observador de superfície ainda for insuficientemente grosseira – esse trabalho é computacionalmente caro e já está sendo executado pelo runtime para gerar os vários níveis de detalhes fornecidos.
Como cada observador de superfície pode fornecer várias superfícies espaciais não conectadas, alguns aplicativos podem querer recortar essas malhas de superfície espacial umas contra as outras e, em seguida, compactá-las juntas. Em geral, a etapa de recorte é necessária, pois as malhas de superfície espacial próximas geralmente se sobrepõem ligeiramente.
Raycasting e Colisão
Para que uma API de física (como Havok) forneça a um aplicativo funcionalidade de raycasting e colisão para superfícies espaciais, o aplicativo deve fornecer malhas de superfície espacial para a API de física. Malhas usadas para física geralmente têm as seguintes propriedades:
- Eles contêm apenas pequenos números de triângulos. As operações de física são mais intensivas computacionalmente do que as operações de renderização.
- Eles são "apertados com água". Superfícies destinadas a serem sólidas não devem ter pequenos buracos nelas; até mesmo buracos muito pequenos para serem visíveis podem causar problemas.
- Eles são convertidos em cascos convexos. Os cascos convexos têm poucos polígonos e estão livres de buracos, e são muito mais eficientes computacionalmente para processar do que as malhas de triângulo bruto.
Ao fazer raycasts contra superfícies espaciais, tenha em mente que essas superfícies são muitas vezes complexas, formas desordenadas cheias de pequenos detalhes confusos - assim como sua mesa! Isso significa que um único raycast geralmente é insuficiente para fornecer informações suficientes sobre a forma da superfície e a forma do espaço vazio perto dela. Geralmente, é uma boa ideia fazer muitos raycasts em uma pequena área e usar os resultados agregados para derivar uma compreensão mais confiável da superfície. Por exemplo, usar a média de 10 raycasts para orientar o posicionamento do holograma em uma superfície produzirá um resultado muito mais suave e menos "nervoso" que usar apenas um único raycast.
No entanto, tenha em mente que cada raycast pode ter um alto custo computacional. Dependendo do cenário de uso, você deve trocar o custo computacional de raycasts extras (realizados em cada quadro) em relação ao custo computacional do processamento de malha para suavizar e remover orifícios em superfícies espaciais (feito quando as malhas espaciais são atualizadas).
A experiência de verificação de ambiente
Cada aplicativo que usa o mapeamento espacial deve considerar fornecer uma "experiência de verificação"; o processo pelo qual o aplicativo orienta o usuário a examinar superfícies necessárias para que o aplicativo funcione corretamente.
Exemplo de verificação
A natureza dessa experiência de verificação pode variar muito dependendo das necessidades de cada aplicativo, mas dois princípios main devem orientar seu design.
Em primeiro lugar, a comunicação clara com o usuário é a principal preocupação. O usuário deve estar sempre ciente de se os requisitos do aplicativo estão sendo atendidos. Quando eles não estão sendo atendidos, deve ser imediatamente claro para o usuário por que isso é assim e eles devem ser rapidamente levados a tomar a ação apropriada.
Em segundo lugar, os aplicativos devem tentar encontrar um equilíbrio entre eficiência e confiabilidade. Quando for possível fazer isso de forma confiável, os aplicativos deverão analisar automaticamente os dados de mapeamento espacial para economizar tempo do usuário. Quando não é possível fazer isso de forma confiável, os aplicativos devem, em vez disso, permitir que o usuário forneça rapidamente ao aplicativo as informações adicionais necessárias.
Para ajudar a projetar a experiência de verificação correta, considere quais das seguintes possibilidades são aplicáveis ao seu aplicativo:
Sem experiência de verificação
- Um aplicativo pode funcionar perfeitamente sem qualquer experiência de verificação guiada; ele aprenderá sobre superfícies que são observadas no curso da movimentação natural do usuário.
- Por exemplo, um aplicativo que permite que o usuário desenhe em superfícies com tinta spray holográfica requer conhecimento apenas das superfícies atualmente visíveis para o usuário.
- O ambiente já poderá ser verificado se for um em que o usuário já passou muito tempo usando o HoloLens.
- Tenha em mente, no entanto, que a câmera usada pelo mapeamento espacial só pode ver 3,1 m na frente do usuário, portanto, o mapeamento espacial não saberá mais sobre superfícies mais distantes, a menos que o usuário as tenha observado de uma distância mais próxima no passado.
- Portanto, o usuário entende quais superfícies foram verificadas, o aplicativo deve fornecer comentários visuais para esse efeito, por exemplo, a conversão de sombras virtuais em superfícies digitalizadas pode ajudar o usuário a colocar hologramas nessas superfícies.
- Para esse caso, os volumes delimitador do observador de superfície espacial devem ser atualizados em cada quadro para um sistema de coordenadas espaciais com bloqueio de corpo, para que eles sigam o usuário.
Localizar um local adequado
- Um aplicativo pode ser projetado para uso em um local com requisitos específicos.
- Por exemplo, o aplicativo pode exigir uma área vazia ao redor do usuário para que ele possa praticar o kung-fu holográfico com segurança.
- Os aplicativos devem comunicar quaisquer requisitos específicos ao usuário antecipadamente e reforce-os com comentários visuais claros.
- Neste exemplo, o aplicativo deve visualizar a extensão da área vazia necessária e realçar visualmente a presença de objetos indesejados dentro dessa zona.
- Para esse caso, os volumes delimitador do observador de superfície espacial devem usar um sistema de coordenadas espaciais com bloqueio de mundo no local escolhido.
Localizar uma configuração adequada de superfícies
- Um aplicativo pode exigir uma configuração específica de superfícies, por exemplo, duas paredes grandes, planas e opostas para criar um salão holográfico de espelhos.
- Nesses casos, o aplicativo precisará analisar as superfícies fornecidas pelo mapeamento espacial para detectar superfícies adequadas e direcionar o usuário para elas.
- O usuário deverá ter uma opção de fallback se a análise de superfície do aplicativo não for confiável. Por exemplo, se o aplicativo identificar incorretamente uma porta como uma parede plana, o usuário precisará de uma maneira simples de corrigir esse erro.
Examinar parte do ambiente
- Um aplicativo pode querer capturar apenas parte do ambiente, conforme indicado pelo usuário.
- Por exemplo, o aplicativo examina parte de uma sala para que o usuário possa postar um anúncio holográfico classificado para móveis que deseja vender.
- Nesse caso, o aplicativo deve capturar dados de mapeamento espacial dentro das regiões observadas pelo usuário durante a verificação.
Examinar a sala inteira
- Um aplicativo pode exigir uma verificação de todas as superfícies na sala atual, incluindo aquelas por trás do usuário.
- Por exemplo, um jogo pode colocar o usuário no papel de Gulliver, sob cerco de centenas de pequenos Lilliputianos que se aproximam de todas as direções.
- Nesses casos, o aplicativo precisará determinar quantas das superfícies na sala atual já foram examinadas e direcionar o foco do usuário para preencher lacunas significativas.
- A chave para esse processo é fornecer comentários visuais que deixa claro para o usuário quais superfícies ainda não foram examinadas. O aplicativo pode, por exemplo, usar a neblina baseada em distância para realçar visualmente regiões que não são cobertas por superfícies de mapeamento espacial.
Faça uma instantâneo inicial do ambiente
- Um aplicativo pode querer ignorar todas as alterações no ambiente depois de usar um 'instantâneo' inicial.
- Isso pode ser apropriado para evitar interrupções de dados criados pelo usuário que estão firmemente acoplados ao estado inicial do ambiente.
- Nesse caso, o aplicativo deve fazer uma cópia dos dados de mapeamento espacial em seu estado inicial depois que a verificação for concluída.
- Os aplicativos devem continuar recebendo atualizações para dados de mapeamento espacial se os hologramas ainda estiverem sendo corretamente impedidos pelo ambiente.
- As atualizações contínuas dos dados de mapeamento espacial também permitem visualizar as alterações que ocorreram, esclarecendo ao usuário as diferenças entre os estados anteriores e atuais do ambiente.
Tirar instantâneos iniciados pelo usuário do ambiente
- Um aplicativo só pode querer responder às alterações ambientais quando instruído pelo usuário.
- Por exemplo, o usuário poderia criar várias 'estátuas' 3D de um amigo capturando suas poses em momentos diferentes.
Permitir que o usuário altere o ambiente
- Um aplicativo pode ser projetado para responder em tempo real a quaisquer alterações feitas no ambiente do usuário.
- Por exemplo, o usuário desenhando uma cortina pode disparar a "alteração de cena" para uma reprodução holográfica que ocorre do outro lado.
Orientar o usuário para evitar erros nos dados de mapeamento espacial
- Um aplicativo pode querer fornecer diretrizes ao usuário enquanto ele está verificando seu ambiente.
- Isso pode ajudar o usuário a evitar determinados tipos de erros nos dados de mapeamento espacial, por exemplo, ficando longe de janelas ou espelhos iluminados pelo sol.
Um detalhe extra a ser ciente é que o "intervalo" de dados de mapeamento espacial não é ilimitado. Embora o mapeamento espacial crie um banco de dados permanente de espaços grandes, ele disponibiliza apenas esses dados para aplicativos em uma "bolha" de tamanho limitado ao redor do usuário. Se você começar no início de um longo corredor e caminhar longe o suficiente do início, então, eventualmente, as superfícies espaciais de volta ao início desaparecerão. Você pode atenuar isso armazenando em cache essas superfícies em seu aplicativo depois que elas desaparecerem dos dados de mapeamento espacial disponíveis.
Processamento de malha
Pode ajudar a detectar tipos comuns de erros em superfícies e filtrar, remover ou modificar os dados de mapeamento espacial conforme apropriado.
Tenha em mente que os dados de mapeamento espacial devem ser o mais fiéis possível para superfícies do mundo real, de modo que qualquer processamento que você aplique corre o risco de deslocar suas superfícies para mais longe da "verdade".
Aqui estão alguns exemplos de diferentes tipos de processamento de malha que você pode achar úteis:
Preenchimento de buracos
- Se um pequeno objeto feito de um material escuro não for digitalizado, ele deixará um buraco na superfície ao redor.
- Os buracos afetam a oclusão: hologramas podem ser vistos 'através' de um buraco em uma superfície real supostamente opaca.
- Os buracos afetam raycasts: se você estiver usando raycasts para ajudar os usuários a interagir com superfícies, pode ser indesejável que esses raios passem por buracos. Uma mitigação é usar um pacote de vários raycasts que abrangem uma região de tamanho apropriado. Isso permitirá que você filtre resultados 'outlier', de modo que, mesmo que um raycast passe por um pequeno buraco, o resultado agregado ainda será válido. No entanto, essa abordagem tem um custo computacional.
- Os buracos afetam colisões físicas: um objeto controlado pela simulação física pode cair por um buraco no chão e se perder.
- É possível preencher algoritmos desses buracos na malha de superfície. No entanto, você precisará ajustar seu algoritmo para que "buracos reais", como janelas e portas, não fiquem preenchidos. Pode ser difícil diferenciar de forma confiável "buracos reais" de "buracos imaginários", então você precisará experimentar heurísticas diferentes, como "tamanho" e "forma de limite".
Remoção de alucinações
- Reflexos, luzes brilhantes e objetos em movimento podem deixar pequenas "alucinações" persistentes flutuando no ar.
- Alucinações afetam a oclusão: alucinações podem se tornar visíveis à medida que formas escuras se movem na frente e ocluem outros hologramas.
- Alucinações afetam raycasts: se você estiver usando raycasts para ajudar os usuários a interagir com superfícies, esses raios podem atingir uma alucinação em vez da superfície por trás dela. Assim como acontece com os buracos, uma mitigação é usar muitos raycasts em vez de um único raycast, mas novamente isso terá um custo computacional.
- Alucinações afetam colisões físicas: um objeto controlado pela simulação física pode ficar preso contra uma alucinação e ser incapaz de se mover através de uma área aparentemente clara do espaço.
- É possível filtrar tais alucinações da malha superficial. No entanto, assim como acontece com os buracos, você precisará ajustar seu algoritmo para que objetos pequenos reais, como suportes de lâmpada e alças de porta, não sejam removidos.
Suavização
- O mapeamento espacial pode retornar superfícies que parecem ser ásperas ou "barulhentas" em comparação com seus equivalentes do mundo real.
- A suavidade afeta colisões físicas: se o chão é áspero, uma bola de golfe fisicamente simulada pode não rolar suavemente através dela em uma linha reta.
- A suavidade afeta a renderização: se uma superfície é visualizada diretamente, normais de superfície áspera podem afetar sua aparência e interromper uma aparência de "limpo". É possível atenuar isso usando iluminação e texturas apropriadas no sombreador usado para renderizar a superfície.
- É possível suavizar a aspereza em uma malha de superfície. No entanto, isso pode afastar a superfície da superfície real correspondente. Manter uma correspondência próxima é importante para produzir uma oclusão de holograma precisa e permitir que os usuários alcancem interações precisas e previsíveis com superfícies holográficas.
- Se apenas uma alteração cosmética for necessária, pode ser suficiente suavizar normais de vértice sem alterar as posições de vértice.
Localização do plano
- Há muitas formas de análise que um aplicativo pode querer executar nas superfícies fornecidas pelo mapeamento espacial.
- Um exemplo simples é 'descoberta de plano'; identificando regiões limitadas, principalmente planares de superfícies.
- As regiões planares podem ser usadas como superfícies de trabalho holográficas, regiões em que o conteúdo holográfico pode ser colocado automaticamente pelo aplicativo.
- As regiões planares podem restringir a interface do usuário para orientar os usuários a interagir com as superfícies que melhor atendem às suas necessidades.
- As regiões planares podem ser usadas como no mundo real, para equivalentes holográficos a objetos funcionais, como telas LCD, tabelas ou quadros de comunicações.
- As regiões planares podem definir áreas de jogo, formando a base dos níveis de videogame.
- As regiões planares podem ajudar os agentes virtuais a navegar pelo mundo real, identificando as áreas de piso em que pessoas reais provavelmente andarão.
Prototipagem e depuração
Ferramentas úteis
- O emulador do HoloLens pode ser usado para desenvolver aplicativos usando mapeamento espacial sem acesso a um HoloLens físico. Ele permite simular uma sessão ao vivo em um HoloLens em um ambiente realista, com todos os dados que seu aplicativo normalmente consumiria, incluindo movimento do HoloLens, sistemas de coordenadas espaciais e malhas de mapeamento espacial. Isso pode ser usado para fornecer entrada confiável e repetível, o que pode ser útil para depurar problemas e avaliar alterações no código.
- Para reproduzir um cenário, capture dados de mapeamento espacial pela rede de um HoloLens dinâmico e salve-os em disco e reutilize-os em sessões de depuração posteriores.
- O modo de exibição 3D do portal de dispositivos windows fornece uma maneira de ver todas as superfícies espaciais atualmente disponíveis por meio do sistema de mapeamento espacial. Isso fornece uma base de comparação para as superfícies espaciais dentro de seu aplicativo; por exemplo, você pode facilmente dizer se alguma superfície espacial está ausente ou se está sendo exibida no lugar errado.
Diretrizes gerais de prototipagem
- Como os erros nos dados de mapeamento espacial podem afetar fortemente a experiência do usuário, recomendamos que você teste seu aplicativo em uma ampla variedade de ambientes.
- Não fique preso com o hábito de sempre testar no mesmo local, por exemplo, em sua mesa. Certifique-se de testar em várias superfícies de diferentes posições, formas, tamanhos e materiais.
- Da mesma forma, embora os dados sintéticos ou gravados possam ser úteis para depuração, não se tornem muito dependentes dos mesmos poucos casos de teste. Isso pode atrasar a localização de problemas importantes que os testes mais variados teriam pego anteriormente.
- É uma boa ideia executar testes com usuários reais (e idealmente não treinados), pois eles podem não usar o HoloLens ou seu aplicativo exatamente da mesma maneira que você. Na verdade, pode surpreender o quão divergente pode ser o comportamento, o conhecimento e as suposições das pessoas!
Solução de problemas
- Para que as malhas de superfície sejam orientadas corretamente, cada GameObject precisa estar ativo antes de ser enviado ao SurfaceObserver para ter sua malha construída. Caso contrário, as malhas aparecerão em seu espaço, mas girarão em ângulos estranhos.
- O GameObject que executa o script que se comunica com o SurfaceObserver precisa ser definido como a origem. Caso contrário, todos os GameObjects criados e enviados para o SurfaceObserver para que suas malhas sejam construídas terão um deslocamento igual ao deslocamento do Objeto de Jogo Pai. Isso pode fazer com que suas malhas apareçam a vários metros de distância, o que dificulta a depuração do que está acontecendo.