mapeamento espacial

O mapeamento espacial fornece uma representação detalhada de superfícies do mundo real no ambiente em todo o HoloLens, permitindo que os desenvolvedores criem uma experiência convincente de realidade misturada. Ao mesclar o mundo real com o mundo virtual, um aplicativo pode fazer com que hologramas pareçam reais. Os aplicativos também podem se alinhar mais naturalmente com as expectativas do usuário, fornecendo comportamentos e interações familiares do mundo real.


Suporte ao dispositivo

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á tão real. Quando possível, coloque os itens para conforto.

Visualizar superfícies ao colocar ou mover hologramas (usar uma grade projetada). Isso ajuda os usuários a saber onde 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

Mesh surfaces covering a room
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 à medida que se move pelo ambiente). Cada superfície espacial descreve superfícies do mundo real em um pequeno volume de espaço, representada como uma malha triângulo anexada a um sistema de coordenadas espaciais bloqueado pelo mundo.

À medida que o HoloLens coleta novos dados sobre o ambiente e, à medida que as alterações no ambiente ocorrem, as superfícies espaciais aparecerão, desaparecerão e mudarão.

Demonstração de conceitos de design de Reconhecimento Espacial

Se você quiser ver os conceitos de design de Reconhecimento Espacial em ação, confira nossa demonstração de vídeo design Hologramas - Reconhecimento Espacial 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 '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 Triangles Per Cubic Meter.
  • SDK de compreensão de cena:
    • Intervalo ilimitado – fornece todos os dados de mapeamento espacial verificados dentro do raio da consulta.
    • Fornece um instantâneo estático 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 criar 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

Illustrations of common Spatial Mapping usage scenarios: Placement, Occlusion, Physics and Navigation

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 olhar 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 'outlier' (como pode ser causado por raios passando por pequenos buracos ou atingindo pequenos bits de geometria que 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 mínimo e máximo da distância também pode ajudar, para que o holograma que está sendo movido não voe de repente para a distância ou volte a bater no 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 lavada 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 raios, 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 empecilho.

Em seu extremo, a entrada do usuário pode ser simplificada inteiramente e 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 a previsibilidade se aplica duplamente aqui; se o usuário espera controle sobre o posicionamento do holograma, mas o aplicativo nem sempre coloca hologramas onde ele espera (se o interruptor de luz aparecer em algum lugar que o usuário não pode alcançar), isso 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 suma 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, por causa de colisões com outra superfície próxima). Se eles não puderem colocar um holograma no local atual, os comentários visuais devem 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 ausência óbvia de um efeito de aterramento nesta área pode alcançar 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 ser ocluído 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 útilmente do usuário; O occluding hologramas atrás das paredes pode reduzir a desordem visual de forma 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 definir as expectativas de 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 colida 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 por trá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 para um aplicativo usar interações naturais e familiares baseadas em física. Mover um pedaço de móveis holográficos 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 setas romanas de entrada. Em outros casos, porém, talvez você queira ignorar novas atualizações; dirigir seu carro esportivo holográfico ao redor da pista de corrida em seu chão pode de repente não ser tão divertido se seu cão decidir sentar no meio da pista.

Os aplicativos podem usar dados de mapeamento espacial para conceder aos caracteres holográficos (ou agentes) a capacidade de navegar pelo mundo real da mesma forma 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 direções holográficas para novos usuários que não estão familiarizados com esse local. Este mapa pode 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 em 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 de caminho e navegação por um caractere virtual. Suavizar a malha e remover alucinações pode ajudar a evitar que os caracteres 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 com superfícies de mapeamento espacial. Isso ocorre porque as superfícies de mapeamento espacial não são conhecidas até que o aplicativo seja iniciado, mas os arquivos de dados NavMesh precisam ser gerados com antecedência dos ativos de origem. Observe também que o sistema de mapeamento espacial não fornecerá informações sobre superfícies distantes do local atual do usuário. Portanto, o aplicativo deve "lembrar" superfícies em si se for para criar um mapa de uma área grande.

Visualização

Na maioria das vezes, é apropriado que 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, lançando uma sombra na superfície. Isso fornece 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 pode 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 os espaços próximos do usuário que estão ocultos do modo de exibição. Isso poderia fornecer uma maneira de dar ao usuário acesso à sua cozinha (e todos os seus hologramas contidos) de sua sala de estar.

As malhas de superfície fornecidas pelo mapeamento espacial podem não ser particularmente "limpas". É 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 "limpas" 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 surface observer
    • 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 bloqueado pelo 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, pois 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 o status da superfície espacial 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 as alterações de 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 bloqueado pelo mundo que cobre 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
    • Iterar o conjunto fornecido de superfícies espaciais.
    • Classifique superfícies espaciais conforme adicionado, alterado ou removido.
    • 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).

Mesh Caching

Superfícies espaciais são representadas por malhas de triângulo densas. Armazenar, renderizar e processar essas malhas pode consumir recursos de computação e 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á tratar isso 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 o modelo do ambiente, ele não deverá ser solicitado.
  • Para superfícies espaciais atualizadas, a malha deve ser solicitada?
    • Superfícies espaciais atualizadas próximas e na frente do usuário devem ter prioridade e sua malha deve ser solicitada primeiro.
    • Também pode ser apropriado dar maior prioridade 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 secundárias, por exemplo, se os limites da superfície forem pequenos, nesse caso, a atualização pode não ser importante o suficiente para processar.
    • As atualizações em 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, de modo 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 usando malhas de spool para disco à medida que superfícies espaciais desaparecem.
    • 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 optarem por não descartar uma superfície removida devem tomar 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 importarão mais.

Veja 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 frusto que segue 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 no 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 espaciais 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 primárias 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 para o usuário enquanto eles estão 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 "limpa" quanto a topologia criada pelo ser humano, e a malha sofrerá de vários erros.
    • Para criar uma estética visual agradável, talvez você queira fazer algum processamento de malha, por exemplo, para preencher buracos ou normais de superfície suave. Você também pode querer usar um sombreador para projetar texturas projetadas pelo artista em sua malha em vez de visualizar diretamente topologia e normais de malha.
  • Para occluding 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 cores.
    • Isso preparará o buffer de profundidade para occluir 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 profundidade, atualize o estado de combinação para definir o RenderTargetWriteMask como zero para todos os destinos de renderização de cores.
  • Para modificar a aparência de hologramas ocluídos por superfícies do mundo real
    • A geometria normalmente renderizada fica oculta quando está ocasa. Isso é obtido 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 onde ela está 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 ela é occluded e modificar sua aparência quando occluded como uma forma de fornecer comentários visuais para o 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 isso, renderize a geometria uma segunda vez com um sombreador diferente que cria a aparência 'occluded' 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 onde ela está mais longe da câmera do que toda a geometria renderizada anteriormente. Em segundo lugar, defina o 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 espaciais de superfície do observador de superfície, solicite a densidade mais baixa 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 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 não afete os custos de processamento de pixels.
  • Usar o abate de frutos
    • O abate de frusto 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.
    • Uma vez que o abate é executado por malha e as superfícies espaciais podem ser grandes, quebrar 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 da CPU. Em um caso extremo, os cálculos de abate de frusto 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 será occluding quaisquer camadas mais distantes, portanto, qualquer tempo de GPU gasto renderizando 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 o DepthWriteMask está 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 pixel na GPU.

Processamento de Mesh

Um aplicativo pode querer fazer várias operações em malhas espaciais de superfície 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 que são usados para renderizar malhas de triângulo em todas as APIs de renderização modernas. No entanto, um fato importante a ser ciente é que os triângulos de mapeamento espacial têm uma ordem de sinuoso no sentido horário frontal. 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 da frente . O lado frontal (ou externo) das malhas espaciais da superfície corresponde como você esperaria para o lado frontal (visível) das superfícies do mundo real.

Os aplicativos só deverão fazer a simplificação da malha se a densidade de triângulo mais grosseira fornecida pelo observador de superfície ainda estiver 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 cortar essas malhas espaciais de superfície entre si 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 um aplicativo com funcionalidade de raycasting e colisão para superfícies espaciais, o aplicativo deve fornecer malhas espaciais de superfície para a API de física. As 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 convexa. Os cascos Convex 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 formas complexas e desordenadas cheias de pequenos detalhes confusos - assim como sua mesa! Isso significa que um único raycast é muitas vezes 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 "agitado" 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 todos os quadros) com 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 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.

Example of scanning
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 principais devem orientar seu design.

Em primeiro lugar, a comunicação clara com o usuário é a principal preocupação. O usuário sempre deve estar 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 as medidas apropriadas.

Em segundo lugar, os aplicativos devem tentar encontrar um equilíbrio entre eficiência e confiabilidade. Quando é possível fazer isso de forma confiável, os aplicativos devem 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 de spray holográfico requer apenas conhecimento das superfícies atualmente visíveis para o usuário.
    • O ambiente já poderá ser verificado se for aquele 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á sobre superfícies mais distantes, a menos que o usuário tenha observado-as 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, lançar sombras virtuais em superfícies verificadas pode ajudar o usuário a colocar hologramas nessas superfícies.
    • Para esse caso, os volumes delimitados do observador de superfície espacial devem ser atualizados cada quadro para um sistema de coordenadas espaciais bloqueados pelo 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 nessa zona.
    • Para esse caso, os volumes delimitados do observador de superfície espacial devem usar um sistema de coordenadas espaciais bloqueados pelo 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 atrá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 superfícies na sala atual já foram verificadas e direcionar o olhar do usuário para preencher lacunas significativas.
    • A chave para esse processo é fornecer comentários visuais que o tornam claro para o usuário que as superfícies ainda não foram verificadas. O aplicativo poderia, 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.
  • Tirar um instantâneo inicial do ambiente

    • Um aplicativo pode desejar ignorar todas as alterações no ambiente depois de tirar um "instantâneo" inicial.
    • Isso pode ser apropriado para evitar a interrupção de dados criados pelo usuário que estão fortemente 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 ocluídos 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 pode 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 uma "alteração de cena" para uma peça holográfica que ocorre do outro lado.
  • Orientar o usuário a evitar erros nos dados de mapeamento espacial

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 só disponibiliza 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 andar longe o suficiente desde o 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.

Mesh processamento

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 destinam-se a ser o mais fiéis possível às superfícies do mundo real, de modo que qualquer processamento que você aplique riscos deslocando suas superfícies mais longe da "verdade".

Aqui estão alguns exemplos de diferentes tipos de processamento de malha que você pode achar úteis:

  • Preenchimento de buraco

    • Se um objeto pequeno 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 supostamente opaca do mundo real.
    • Os buracos afetam os raios: se você estiver usando raios 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á filtrar os 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 esses 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ção

    • Reflexões, luzes brilhantes e objetos móveis 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 raios: se você estiver usando raios para ajudar os usuários a interagir com superfícies, esses raios podem atingir uma alucinação em vez da superfície atrá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 for áspero, uma bola de golfe fisicamente simulada pode não rolar suavemente através dela em linha reta.
    • A suavidade afeta a renderização: se uma superfície for visualizada diretamente, normais de superfície áspera podem afetar sua aparência e interromper uma aparência 'limpa'. É possível atenuar isso usando iluminação e texturas apropriadas no sombreador que é usado para renderizar a superfície.
    • É possível suavizar a aspereza em uma malha superficial. No entanto, isso pode afastar ainda mais a superfície da superfície real correspondente. Manter uma correspondência próxima é importante para produzir 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, poderá ser suficiente para suavizar os vértices normais sem alterar as posições de vértice.
  • Localização do plano

    • Há muitas formas de análise que um aplicativo pode desejar executar nas superfícies fornecidas pelo mapeamento espacial.
    • Um exemplo simples é 'descoberta de plano'; identificando regiões limitadas, principalmente planares de superfícies.
    • 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.
    • 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.
    • 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.
    • 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 do chão em que pessoas reais provavelmente andarão.

Prototipagem e depuração

Ferramentas úteis

  • O emulador HoloLens pode ser usado para desenvolver aplicativos usando mapeamento espacial sem acesso a um HoloLens físico. Ele permite simular uma sessão dinâmica em um HoloLens em um ambiente realista, com todos os dados que seu aplicativo normalmente consumiria, incluindo movimento HoloLens, sistemas de coordenadas espaciais e malhas de mapeamento espacial. Isso pode ser usado para fornecer uma 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 na rede de uma HoloLens dinâmica e salve-os em disco e reutilize-os em sessões de depuração posteriores.
  • O modo de exibição 3D do portal do dispositivo 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 no 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 registrados 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 divergentes podem 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 giradas 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 que você criar e enviar 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.

Confira também