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 programadores criem uma experiência de realidade mista convincente. Ao unir o mundo real com o mundo virtual, uma aplicação pode fazer com que os hologramas pareçam reais. As aplicações também podem alinhar-se mais naturalmente com as expectativas dos utilizadores ao fornecerem comportamentos e interações familiares do mundo real.


Suportes de dispositivos

Funcionalidade HoloLens (1.ª geração) HoloLens 2 Auscultadores envolventes
Mapeamento espacial ✔️ ✔️

Porque é que o mapeamento espacial é importante?

O mapeamento espacial permite colocar objetos em superfícies reais. Isto ajuda a ancorar objetos no mundo do utilizador e tira partido das pistas de profundidade do mundo real. Ocluir os hologramas com base noutros hologramas e objetos do mundo real ajuda a convencer o utilizador de que estes hologramas estão realmente no seu espaço. Os hologramas a flutuar no espaço ou a mover-se com o utilizador não se sentirão tão reais. Sempre que possível, coloque itens para conforto.

Visualize as superfícies ao colocar ou mover hologramas (utilize uma grelha projetada). Isto ajuda os utilizadores a saber onde podem colocar melhor os hologramas e mostra se o local onde estão a tentar colocar o holograma não está mapeado. Pode "itens de outdoor" em direção ao utilizador se estes acabarem em demasiado ângulo.

Descrição geral conceptual

Superfícies de malha que cobrem uma sala
Um exemplo de uma malha de mapeamento espacial que cobre uma sala

Os dois tipos de objetos principais utilizados para mapeamento espacial são o "Spatial Surface Observer" e o "Spatial Surface".

A aplicação fornece ao Spatial Surface Observer um ou mais volumes delimitadores, para definir as regiões de espaço em que a aplicação pretende receber dados de mapeamento espacial. Para cada um destes volumes, o mapeamento espacial fornecerá à aplicação um conjunto de Superfícies Espaciais.

Estes volumes podem ser estacionários (numa localização fixa com base no mundo real) ou podem estar ligados ao HoloLens (movem-se, mas não giram, com o HoloLens à medida que se movem pelo ambiente). Cada superfície espacial descreve superfícies do mundo real num pequeno volume de espaço, representada como uma malha triangular ligada a um sistema de coordenadas espaciais protegido pelo mundo.

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

Demonstração de conceitos de conceção de Sensibilização Espacial

Se quiser ver os conceitos de design de Sensibilização Espacial em ação, consulte a nossa demonstração de vídeo Designing Holograms - Spatial Awareness abaixo. Quando terminar, continue para obter uma descrição mais detalhada sobre tópicos específicos.

Este vídeo foi retirado da aplicação "Designing Holograms" HoloLens 2. Transfira e desfrute da experiência completa aqui.

Mapeamento Espacial vs. Compreensão da Cena WorldMesh

Para HoloLens 2, é possível consultar uma versão estática dos dados de mapeamento espacial com o SDK de compreensão de cenas (definição EnableWorldMesh). Eis as diferenças entre duas formas de aceder aos dados de mapeamento espacial:

  • API de Mapeamento Espacial:
    • Intervalo limitado: os dados de mapeamento espacial disponíveis para aplicações numa "bolha" em cache de tamanho limitado em torno do utilizador.
    • Fornece atualizações de baixa latência de regiões de malha alteradas através de Eventos SurfacesChanged.
    • Nível variável de detalhes controlado pelo parâmetro Triângulos Por Medidor Cúbico.
  • SDK de compreensão de cenários:
    • Intervalo ilimitado – fornece todos os dados de mapeamento espacial analisados no 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 controlado pela definição RequestedMeshLevelOfDetail.

O que influencia a qualidade do mapeamento espacial?

Vários fatores, detalhados aqui, podem afetar a frequência e a gravidade destes erros. No entanto, deve conceber a sua aplicação para que o utilizador possa atingir os seus objetivos, mesmo na presença de erros nos dados de mapeamento espacial.

Cenários comuns de utilização

Ilustrações de cenários comuns de utilização do Mapeamento Espacial: Colocação, Oclusão, Física e Navegação

Posicionamento

O mapeamento espacial proporciona às aplicações a oportunidade de apresentar formas naturais e familiares de interação ao utilizador; o que pode ser mais natural do que colocar o telemóvel na mesa?

Restringir a colocação de hologramas (ou, mais geralmente, qualquer seleção de localizações espaciais) nas superfícies fornece um mapeamento natural de 3D (ponto no espaço) para 2D (ponto na superfície). Isto reduz a quantidade de informações que o utilizador precisa de fornecer à aplicação e torna as interações do utilizador mais rápidas, fáceis e precisas. Isto é verdade porque a "distância" não é algo que estamos habituados a comunicar fisicamente com outras pessoas ou com computadores. Quando apontamos com o dedo, estamos a especificar uma direção, mas não uma distância.

Uma ressalva importante aqui é que quando uma aplicação infere distância da direção (por exemplo, fazendo um raycast ao longo da direção do olhar do utilizador para encontrar a superfície espacial mais próxima), isso deve produzir resultados que o utilizador pode prever de forma fiável. Caso contrário, o utilizador perderá o seu sentido de controlo e isso pode tornar-se rapidamente frustrante. Um método que ajuda com isto é 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 "atípicos" (como podem ser causados por raios que passam por pequenos buracos ou que atingem pequenos pedaços de geometria que o utilizador não conhece). A agregação ou a suavização também podem ser realizadas ao longo do tempo; por exemplo, pode limitar a velocidade máxima à qual um holograma pode variar à distância do utilizador. Limitar simplesmente o valor mínimo e máximo da distância também pode ajudar, para que o holograma que está a ser movido não voe subitamente para a distância ou volte a bater no rosto do utilizador.

As aplicações também podem utilizar a forma e a direção das superfícies para orientar a colocação do holograma. Uma cadeira holográfica não deve penetrar através das paredes e deve sentar-se lavada com o chão, mesmo que seja ligeiramente desigual. Este tipo de funcionalidade provavelmente dependeria do uso de colisões físicas em vez de raycasts, no entanto serão aplicadas preocupações semelhantes. Se o holograma a ser colocado tiver muitos polígonos pequenos que se destacam, como as pernas numa cadeira, pode fazer sentido expandir a representação física desses polígonos para algo mais largo e suave para que sejam mais capazes de deslizar sobre superfícies espaciais sem engate.

No seu extremo, a entrada do utilizador pode ser simplificada na totalidade e as superfícies espaciais podem ser utilizadas para fazer colocação inteiramente automática de hologramas. Por exemplo, a aplicação pode colocar um interruptor de luz holográfico algures na parede para o utilizador premir. A mesma ressalva sobre a previsibilidade aplica-se duplamente aqui; se o utilizador espera controlo sobre a colocação do holograma, mas a aplicação nem sempre coloca hologramas onde esperam (se o comutador de luz aparecer algures onde o utilizador não consegue aceder), esta será uma experiência frustrante. Na verdade, pode ser pior fazer o posicionamento automático que requer a correção do utilizador em parte do tempo, do que apenas exigir que o utilizador faça sempre a colocação em si mesmo; uma vez que se espera uma colocação automática bem-sucedida, a correção manual parece um fardo!

Tenha também em atenção que a capacidade de uma aplicação utilizar superfícies espaciais para colocação depende muito da experiência de análise da aplicação. Se uma superfície não tiver sido analisada, não pode ser utilizada para colocação. Cabe à aplicação deixar isto claro ao utilizador, para que possa ajudar a analisar novas superfícies ou selecionar uma nova localização.

O feedback visual para o utilizador é da maior importância durante a colocação. O utilizador precisa de saber onde o holograma se baseia na superfície mais próxima com efeitos de terra. Devem compreender porque é que o movimento do holograma está a ser restringido (por exemplo, devido a colisões com outra superfície próxima). Se não conseguirem colocar um holograma na localização atual, os comentários visuais devem deixar claro porque não. Por exemplo, se o utilizador estiver a tentar colocar um sofá holográfico preso a meio caminho da parede, as partes do sofá que estão atrás da parede devem pulsar numa cor zangada. Ou, por outro lado, se a aplicação não conseguir encontrar uma superfície espacial num local onde o utilizador possa ver uma superfície do mundo real, a aplicação deve deixar isto claro. A óbvia ausência de um efeito de base nesta área pode atingir este objectivo.

Oclusão

Uma das principais utilizações das superfícies de mapeamento espacial é simplesmente para ocluir hologramas. Este 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 utilizador.

A oclusão também fornece informações ao utilizador; quando um holograma parece estar oculto por uma superfície do mundo real, isto fornece feedback visual extra sobre a localização espacial desse holograma no mundo. Por outro lado, a oclusão também pode ocultar informações úteis do utilizador; A oclusão de hologramas atrás das paredes pode reduzir a desordem visual de uma forma intuitiva. Para ocultar ou revelar um holograma, o utilizador apenas tem de mover a cabeça.

A oclusão também pode ser utilizada para melhorar as expectativas de uma interface de utilizador natural com base em interações físicas familiares; se um holograma é ocultado por uma superfície, é porque essa superfície é sólida, pelo que o utilizador deve esperar que o holograma colide com essa superfície e não passe por ela.

Por vezes, a oclusão de hologramas é indesejável. Se um utilizador precisar de interagir com um holograma, terá de vê-lo, mesmo que esteja por trás de uma superfície do mundo real. Nestes casos, normalmente faz sentido compor um holograma de forma diferente quando está oculto (por exemplo, reduzindo a sua luminosidade). Desta forma, o utilizador pode localizar visualmente o holograma, mas continuará a saber que está por detrás de algo.

Física

A utilização da simulação física é outra forma de utilizar o mapeamento espacial para reforçar a presença de hologramas no espaço físico do utilizador. Quando a minha bola de borracha holográfica sai realisticamente da minha secretária, salta pelo chão e desaparece debaixo do sofá, pode ser difícil para mim acreditar que não está lá.

A simulação física também proporciona a oportunidade de uma aplicação utilizar interações naturais e familiares baseadas na física. Mover um pedaço de mobiliário holográfico no chão provavelmente será mais fácil para o utilizador se o mobiliário responder como se estivesse deslizando pelo chão com a inércia e fricção apropriadas.

Para gerar comportamentos físicos realistas, provavelmente terá de fazer algum processamento de malha , como preencher buracos, remover alucinações flutuantes e suavizar superfícies ásperas.

Também terá de considerar como a experiência de análise da sua aplicação influencia a simulação física. Em primeiro lugar, as superfícies em falta não colidem com nada; o que acontece quando a bola de borracha sai pelo corredor e sai do fim do mundo conhecido? Em segundo lugar, tem de decidir se continuará a responder às alterações no ambiente ao longo do tempo. Em alguns casos, vai querer responder o mais rapidamente possível; diga se o utilizador está usando portas e móveis como barricadas móveis em defesa contra uma tempestade de setas romanas recebidas. No entanto, noutros casos, poderá querer ignorar novas atualizações; conduzir o seu carro desportivo holográfico ao redor da pista de corridas no seu chão pode de repente não ser tão divertido se o seu cão decidir sentar-se no meio da pista.

As aplicações podem utilizar dados de mapeamento espacial para conceder aos carateres holográficos (ou agentes) a capacidade de navegar no mundo real da mesma forma que uma pessoa real. Isto pode ajudar a reforçar a presença de carateres holográficos ao restringi-los ao mesmo conjunto de comportamentos naturais e familiares que os do utilizador e dos seus amigos.

As capacidades de navegação também podem ser úteis para os utilizadores. Depois de um mapa de navegação ter sido criado numa determinada área, pode ser partilhado para fornecer direções holográficas para novos utilizadores que não estejam familiarizados com essa localização. Este mapa pode ser concebido para ajudar a manter o "tráfego" pedonal a fluir sem problemas ou para evitar acidentes em locais perigosos, como estaleiros de construção.

Os principais desafios técnicos envolvidos na implementação da funcionalidade de navegação serão a deteção fiável de superfícies walkable (os humanos não andam sobre as tabelas!) e uma adaptação graciosa às mudanças no ambiente (os humanos não andam por portas fechadas!). A malha pode exigir algum processamento antes de ser utilizável para planeamento de caminhos e navegação por um caráter virtual. Suavizar a malha e remover alucinações pode ajudar a evitar que os personagens fiquem presos. Também pode querer simplificar drasticamente a malha para acelerar os cálculos de navegação e planeamento de caminhos da sua personagem. Estes desafios têm recebido muita atenção no desenvolvimento da tecnologia de videojogos, e há uma grande quantidade de literatura de investigação disponível sobre estes tópicos.

A funcionalidade NavMesh incorporada no Unity não pode ser utilizada por predefinição para superfícies de mapeamento espacial porque as superfícies só são conhecidas quando a aplicação é iniciada. No entanto, pode criar um NavMesh durante o runtime ao instalar NavMeshComponents. Tenha em atenção que o sistema de mapeamento espacial não fornecerá informações sobre superfícies distantes da localização atual do utilizador; para criar um mapa de uma área grande, a aplicação tem de "memorizar" as superfícies. Também pode aumentar a definição de extensões de observação no perfil de deteção espacial, o que aumenta a área na qual pode criar o 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. No entanto, por vezes, é útil visualizar diretamente superfícies de mapeamento espacial, apesar de os seus homólogos do mundo real estarem visíveis.

Por exemplo, quando o utilizador está a tentar colocar um holograma numa superfície (colocando um armário holográfico na parede, por exemplo) pode ser útil "aterrar" o holograma ao colocar uma sombra na superfície. Isto dá ao utilizador uma noçã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 "pré-visualizar" visualmente uma alteração antes de o utilizador se comprometer com a mesma.

Ao visualizar superfícies, a aplicação pode partilhar com o utilizador a sua compreensão do ambiente. Por exemplo, um jogo de tabuleiro holográfico pode visualizar as superfícies horizontais que identificou como "tabelas", para que o utilizador saiba para onde deve ir para interagir.

Visualizar superfícies pode ser uma forma útil de mostrar aos utilizadores espaços próximos que estão ocultos da vista. Isto poderia fornecer uma forma de dar ao utilizador acesso à sua cozinha (e a todos os seus hologramas contidos) a partir da sua sala de estar.

As malhas de superfície fornecidas pelo mapeamento espacial podem não ser particularmente "limpas". É importante visualizá-los adequadamente. Os cálculos de iluminação tradicionais podem realçar erros nos normais da superfície de uma forma visualmente distraída, 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 de malha, antes de as superfícies serem compostas.

Nota

HoloLens 2 implementa um novo Scene Understanding Runtime, que fornece aos programadores Mixed Reality uma representação de ambiente estruturada e de alto nível concebida para simplificar a implementação de colocação, oclusão, física e navegação.

Utilizar o Surface Observer

O ponto de partida para o mapeamento espacial é o observador de superfície. O fluxo do programa é o seguinte:

  • Criar um objeto de observador do surface
    • Forneça um ou mais volumes espaciais para definir as regiões de interesse em que a aplicação pretende 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.
    • Utilize um volume espacial com um sistema de coordenadas espaciais com bloqueio mundial para identificar uma região fixa do mundo físico.
    • Utilize um volume espacial, atualizado cada frame com um sistema de coordenadas espaciais bloqueado pelo corpo, para identificar uma região de espaço que se move (mas não roda) com o utilizador.
    • Estes volumes espaciais podem ser alterados mais tarde em qualquer altura, à medida que o estado da aplicação ou do utilizador é alterado.
  • Utilizar consultas ou notificações para obter informações sobre superfícies espaciais
    • Pode "consultar" o observador da superfície para obter o estado da superfície espacial em qualquer altura. Em vez disso, pode registar-se no evento "superfícies alteradas" do observador do surface, que notificará a aplicação quando as superfícies espaciais tiverem sido alteradas.
    • Para um volume espacial dinâmico, como a vista frustum ou um volume bloqueado pelo corpo, as aplicações terão de procurar alterações a cada frame, 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 protegido pelo mundo que cobre uma única sala, as aplicações podem registar-se para que o evento "superfícies alteradas" seja notificado quando as superfícies espaciais dentro desse volume podem ter sido alteradas.
  • Processar alterações nas superfícies
    • Itera 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 for adequado, submeta um pedido assíncrono para receber a malha atualizada que representa o estado atual da superfície no nível de detalhe pretendido.
  • Processe o pedido de malha assíncrona (mais detalhes nas secções seguintes).

Colocação em Cache de Malha

As superfícies espaciais são representadas por malhas de triângulo densas. Armazenar, compor e processar estas malhas pode consumir recursos computacionais e de armazenamento significativos. Como tal, cada aplicação deve adotar um esquema de colocação em cache de malha adequado às suas necessidades, para minimizar os recursos utilizados para o processamento e armazenamento de malha. Este esquema deve determinar que malhas deve manter e quais eliminar e quando atualizar a malha para cada superfície espacial.

Muitas das considerações aqui abordadas irão informar diretamente como a sua aplicação deve abordar a colocação em cache de malha. Deve considerar a forma como o utilizador se move através do ambiente, que superfícies são necessárias, quando serão observadas diferentes superfícies 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 de colocação em cache de malha básica é a seguinte:

  • Se a aplicação vir um ID de superfície espacial que nunca viu antes, deve tratá-lo como uma nova superfície espacial.
  • Se a aplicação vir uma superfície espacial com um ID conhecido, mas com uma nova hora de atualização, deve tratá-la como uma superfície espacial atualizada.
  • Se a aplicação já não vir uma superfície espacial com um ID conhecido, deve tratá-la como uma superfície espacial removida.

Cabe a cada aplicação e, em seguida, fazer as seguintes escolhas:

  • Para novas superfícies espaciais, deve ser pedida a malha?
    • Geralmente, a malha deve ser pedida imediatamente para novas superfícies espaciais, o que pode fornecer novas informações úteis ao utilizador.
    • No entanto, as novas superfícies espaciais próximas e à frente do utilizador devem ter prioridade e a malha deve ser pedida primeiro.
    • Se a nova malha não for necessária, se, por exemplo, a aplicação tiver "congelado" permanente ou temporariamente o modelo do ambiente, não deve ser pedido.
  • Para superfícies espaciais atualizadas, deve ser pedida a malha?
    • As superfícies espaciais atualizadas perto e à frente do utilizador devem ter prioridade e a respetiva malha deve ser pedida primeiro.
    • Também pode ser adequado dar maior prioridade às novas superfícies do que às superfícies atualizadas, especialmente durante a experiência de análise.
    • Para limitar os custos de processamento, as aplicações podem querer limitar a velocidade a que processam as atualizações para superfícies espaciais.
    • Pode ser possível inferir que as alterações a uma superfície espacial são menores, por exemplo, se os limites da superfície forem pequenos, caso em que a atualização pode não ser suficientemente importante para processar.
    • Atualizações para superfícies espaciais fora da região de interesse atual do utilizador podem ser totalmente ignoradas, embora neste caso possa ser mais eficiente modificar os volumes delimitadores espaciais em utilização pelo observador de superfície.
  • Para superfícies espaciais removidas, a malha deve ser eliminada?
    • Geralmente, a malha deve ser eliminada imediatamente para superfícies espaciais removidas, para que a oclusão do holograma permaneça correta.
    • No entanto, se a aplicação tiver razões para acreditar que uma superfície espacial voltará a aparecer em breve (com base na conceção da experiência do utilizador), poderá ser mais eficiente mantê-la do que eliminar a malha e recriá-la novamente mais tarde.
    • Se a aplicação estiver a criar um modelo em larga escala do ambiente do utilizador, poderá não querer eliminar quaisquer malhas. No entanto, ainda terá de limitar a utilização de recursos, possivelmente ao colocar malhas em disco à medida que as superfícies espaciais desaparecem.
    • Alguns eventos relativamente raros durante a geração da superfície espacial podem fazer com que as superfícies espaciais sejam substituídas por novas superfícies espaciais numa localização semelhante, mas com IDs diferentes. Assim, as aplicações que optam por não eliminar uma superfície removida devem ter o cuidado de não acabar com várias malhas de superfícies espaciais altamente sobrepostas que cobrem a mesma localização.
  • A malha deve ser eliminada para outras superfícies espaciais?
    • Mesmo que exista uma superfície espacial, se já não for útil para a experiência do utilizador, deve ser eliminada. Por exemplo, se a aplicação "substituir" a sala do outro lado de uma porta por um espaço virtual alternativo, as superfícies espaciais nessa sala já não importam.

Eis uma estratégia de colocação em cache de malha de exemplo, com histerese espacial e temporal:

  • Considere uma aplicação que pretenda utilizar um volume espacial de interesse em forma de frustum que siga o olhar do utilizador enquanto olha à sua volta e anda por aí.
  • Uma superfície espacial pode desaparecer temporariamente deste volume simplesmente porque o utilizador se afasta da superfície ou se afasta mais do mesmo... apenas para olhar para trás ou aproximar-se novamente um momento depois. Neste caso, eliminar e recriar a malha para esta superfície representa muitos processamentos redundantes.
  • Para reduzir o número de alterações processadas, a aplicação utiliza dois observadores espaciais da superfície, um contido no outro. O volume maior é esférico e segue o utilizador "preguiçosamente"; só se move quando necessário para garantir que o centro está a menos de 2,0 metros do utilizador.
  • As malhas de superfície espaciais novas e atualizadas são sempre processadas a partir do observador de superfície interior mais pequeno, mas as malhas são colocadas em cache até desaparecerem do observador de superfície exterior maior. Isto permite que a aplicação evite processar muitas alterações redundantes devido ao movimento do utilizador local.
  • Uma vez que uma superfície espacial também pode desaparecer temporariamente devido à perda de controlo, a aplicação também adia a eliminação de superfícies espaciais removidas durante a perda de controlo.
  • Em geral, uma aplicação deve avaliar a desvantagem entre o processamento de atualizações reduzida e o aumento da utilização da memória para determinar a estratégia de colocação em cache ideal.

Composição

Existem três formas principais em que as malhas de mapeamento espacial tendem a ser utilizadas para composição:

  • Para visualização do surface
    • Muitas vezes, é útil visualizar superfícies espaciais diretamente. Por exemplo, a conversão de "sombras" de objetos em superfícies espaciais pode fornecer feedback visual útil ao utilizador enquanto coloca hologramas em superfícies.
    • Uma coisa a ter em conta é que as malhas espaciais são diferentes do tipo de malhas que um artista 3D pode criar. A topologia triângulo não será tão "limpa" como a topologia criada pelo homem e a malha sofrerá de vários erros.
    • Para criar uma estética visual agradável, pode querer fazer algum processamento de malha, por exemplo, para preencher orifícios ou suavizar os normais da superfície. Também pode querer utilizar um sombreado para projetar texturas desenhadas por artistas na sua malha em vez de visualizar diretamente a topologia de malha e os normais.
  • Para ocluir hologramas por trás de superfícies do mundo real
    • As superfícies espaciais podem ser compostas numa passagem apenas de profundidade, o que afeta apenas a memória intermédia de profundidade e não afeta os destinos de composição de cores.
    • Isto prepara a memória intermédia de profundidade para ocluir hologramas posteriormente compostos atrás de superfícies espaciais. A oclusão precisa de hologramas melhora a sensação de que os hologramas realmente existem no espaço físico do utilizador.
    • Para ativar a composição apenas de profundidade, atualize o estado de mistura para definir RenderTargetWriteMask como zero para todos os destinos de composição de cores.
  • Para modificar o aspeto dos hologramas ocultados por superfícies do mundo real
    • Normalmente, a geometria composta é ocultada quando é ocultada. Isto é conseguido ao definir a função de profundidade no estado de profundidade do stencil como "menor ou igual", o que faz com que a geometria seja visível apenas onde está mais próxima da câmara do que toda a geometria composta anteriormente.
    • No entanto, pode ser útil manter determinada geometria visível mesmo quando está ocultada e modificar o seu aspeto quando ocultado como forma de fornecer feedback visual ao utilizador. Por exemplo, isto permite que a aplicação mostre ao utilizador a localização de um objeto, ao mesmo tempo que deixa claro que está por trás de uma superfície do mundo real.
    • Para tal, componha a geometria uma segunda vez com um sombreado diferente que cria o aspeto "occluded" desejado. Antes de compor a geometria pela segunda vez, faça duas alterações ao estado do stencil de profundidade. Primeiro, defina a função de profundidade como "maior ou igual" para que a geometria fique visível apenas onde está mais longe da câmara do que toda a geometria composta anteriormente. Em segundo lugar, defina DepthWriteMask como zero, para que a memória intermédia de profundidade não seja modificada (a memória intermédia de profundidade deve continuar a representar a profundidade da geometria mais próxima da câmara).

O desempenho é uma preocupação importante ao compor malhas de mapeamento espacial. Seguem-se algumas técnicas de desempenho de composição específicas para compor malhas de mapeamento espacial:

  • Ajustar a densidade do triângulo
    • Ao pedir malhas espaciais à superfície do observador de superfície, peça a menor densidade de malhas triangulares que serão suficientes para as suas necessidades.
    • Pode fazer sentido variar a densidade do triângulo numa superfície por superfície, consoante a distância da superfície do utilizador e a sua relevância para a experiência do utilizador.
    • A redução das contagens de triângulos reduzirá a utilização da memória e os custos de processamento de vértices na GPU, embora não afete os custos de processamento de píxeis.
  • Utilizar abate frustum
    • O abate frustum ignora objetos de desenho que não podem ser vistos porque estão fora da exposição atual frustum. Isto reduz os custos de processamento da CPU e da GPU.
    • Uma vez que o abate é realizado por malha e as superfícies espaciais podem ser grandes, quebrar cada malha de superfície espacial em segmentos mais pequenos pode resultar num abate mais eficiente (na forma como são compostos menos triângulos offscreen). Há uma desvantagem, no entanto; quanto mais malhas tiver, mais chamadas de desenho tem de fazer, o que pode aumentar os custos da CPU. Num caso extremo, os próprios cálculos de abate de frutosos podem até ter um custo mensurável da CPU.
  • Ajustar a ordem de composição
    • As superfícies espaciais tendem a ser grandes, uma vez que representam todo o ambiente do utilizador que as rodeia. Os custos de processamento de píxeis na GPU podem ser elevados, especialmente nos casos em que existe mais do que uma camada de geometria visível (incluindo superfícies espaciais e outros hologramas). Neste caso, a camada mais próxima do utilizador estará a ocluir todas as camadas mais distantes, pelo que qualquer tempo de GPU gasto a compor essas camadas mais distantes é desperdiçado.
    • Para reduzir este trabalho redundante na GPU, ajuda a compor superfícies opacas por ordem de frente para trás (primeiro, mais próximas, mais distantes). Por "opaco", referemo-nos a superfícies para as quais a DepthWriteMask está definida como uma no seu estado de profundidade-stencil. Quando as superfícies mais próximas são compostas, elas primem a memória intermédia de profundidade para que as superfícies mais distantes sejam ignoradas de forma eficiente pelo processador de píxeis na GPU.

Processamento de Malha

Uma aplicação pode querer realizar várias operações em malhas espaciais de superfície de acordo com as suas necessidades. Os dados de índice e vértice fornecidos com cada malha de superfície espacial utilizam o mesmo esquema familiar que as memórias intermédias de vértice e índice utilizadas para compor malhas de triângulo em todas as APIs de composição modernas. No entanto, um dos principais factos a ter em conta é que os triângulos de mapeamento espacial têm uma ordem de enrolamento no sentido dos ponteiros do relógio. Cada triângulo é representado por três índices de vértice na memória intermédia de índice da malha e estes índices identificarão os vértices do triângulo numa ordem no sentido dos ponteiros do relógio, quando o triângulo é visto do lado frontal . O lado frontal (ou exterior) das malhas espaciais da superfície corresponde ao lado frontal (visível) das superfícies do mundo real.

As aplicações só devem fazer simplificação de malha se a densidade de triângulo mais grosseira fornecida pelo observador de superfície ainda não for suficientemente grosseira - este trabalho é computacionalmente dispendioso e já está a ser realizado pelo runtime para gerar os vários níveis de detalhe fornecidos.

Uma vez que cada observador de superfície pode fornecer múltiplas superfícies espaciais não ligadas, algumas aplicações podem querer recortar estas malhas espaciais entre si e, em seguida, zipá-las. Em geral, o passo de recorte é necessário, uma vez que as malhas de superfície espacial próximas muitas vezes se sobrepõem ligeiramente.

Raycasting e Colisão

Para que uma API física (como o Havok) forneça uma aplicação com a funcionalidade de raycasting e colisão para superfícies espaciais, a aplicação tem de fornecer malhas espaciais à API física. As malhas utilizadas para a física têm frequentemente as seguintes propriedades:

  • Contêm apenas um pequeno número de triângulos. As operações físicas são mais intensivas em termos computacionais do que as operações de composição.
  • São "estanques à água". As superfícies destinadas a serem sólidas não devem ter pequenos orifícios; até mesmo os orifícios demasiado pequenos para serem visíveis podem causar problemas.
  • 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 malhas de triângulo cru.

Ao fazer raycasts contra superfícies espaciais, tenha em atenção que estas superfícies são muitas vezes formas complexas e desorganizadas cheias de pequenos detalhes confusos - tal como a sua secretária! Isto significa que um único raycast é muitas vezes insuficiente para lhe fornecer informações suficientes sobre a forma da superfície e a forma do espaço vazio perto da mesma. Normalmente, é boa ideia fazer muitos raycasts numa pequena área e utilizar os resultados agregados para obter uma compreensão mais fiável da superfície. Por exemplo, utilizar a média de 10 raycasts para orientar a colocação de hologramas numa superfície produzirá um resultado muito mais suave e menos "nervoso" que utilizar apenas um único raycast.

No entanto, tenha em atenção que cada raycast pode ter um custo computacional elevado. Consoante o seu cenário de utilização, deve trocar o custo computacional de raycasts adicionais (efetuados a cada frame) com o custo computacional do processamento de malha para suavizar e remover buracos em superfícies espaciais (efetuadas quando as malhas espaciais são atualizadas).

A experiência de análise do ambiente

Cada aplicação que utiliza o mapeamento espacial deve considerar fornecer uma "experiência de análise"; o processo através do qual a aplicação orienta o utilizador a analisar as superfícies necessárias para que a aplicação funcione corretamente.

Exemplo de análise
Exemplo de análise

A natureza desta experiência de análise pode variar bastante consoante as necessidades de cada aplicação, mas dois princípios principais devem orientar a sua conceção.

Em primeiro lugar, a comunicação clara com o utilizador é a principal preocupação. O utilizador deve estar sempre ciente de que os requisitos da aplicação estão a ser cumpridos. Quando não estão a ser cumpridos, deve ser imediatamente claro para o utilizador por que motivo isto é assim e devem ser rapidamente levados a tomar as medidas adequadas.

Em segundo lugar, as aplicações devem tentar encontrar um equilíbrio entre eficiência e fiabilidade. Quando for possível fazê-lo de forma fiável, as aplicações devem analisar automaticamente os dados de mapeamento espacial para poupar tempo ao utilizador. Quando não for possível fazê-lo de forma fiável, as aplicações devem permitir que o utilizador forneça rapidamente à aplicação as informações adicionais necessárias.

Para ajudar a conceber a experiência de análise certa, considere quais das seguintes possibilidades são aplicáveis à sua aplicação:

  • Sem experiência de análise

    • Uma aplicação pode funcionar perfeitamente sem qualquer experiência de análise guiada; ficará a saber mais sobre as superfícies que são observadas no decurso do movimento natural do utilizador.
    • Por exemplo, uma aplicação que permite ao utilizador desenhar em superfícies com tinta com spray holográfico requer conhecimento apenas das superfícies atualmente visíveis para o utilizador.
    • O ambiente pode já estar digitalizado se for aquele em que o utilizador já passou muito tempo a utilizar o HoloLens.
    • Tenha em atenção, no entanto, que a câmara utilizada pelo mapeamento espacial só pode ver 3,1 m à frente do utilizador, pelo que o mapeamento espacial não saberá mais sobre superfícies mais distantes, a menos que o utilizador as tenha observado de uma distância mais próxima no passado.
    • Assim, o utilizador compreende que superfícies foram analisadas, a aplicação deve fornecer feedback visual sobre este efeito, por exemplo, colocar sombras virtuais em superfícies digitalizadas pode ajudar o utilizador a colocar hologramas nessas superfícies.
    • Neste caso, os volumes delimitadores do observador da superfície espacial devem ser atualizados para um sistema de coordenadas espaciais bloqueado pelo corpo, para que sigam o utilizador.
  • Localizar uma localização adequada

    • Uma aplicação pode ser concebida para ser utilizada numa localização com requisitos específicos.
    • Por exemplo, a aplicação pode exigir uma área vazia à volta do utilizador para que possa praticar holográfico kung-fu em segurança.
    • As aplicações devem comunicar antecipadamente quaisquer requisitos específicos ao utilizador e reforçá-los com comentários visuais claros.
    • Neste exemplo, a aplicação deve visualizar a extensão da área vazia necessária e realçar visualmente a presença de quaisquer objetos indesejáveis nesta zona.
    • Neste caso, os volumes delimitadores do observador da superfície espacial devem utilizar um sistema de coordenadas espaciais bloqueado pelo mundo na localização escolhida.
  • Localizar uma configuração adequada de superfícies

    • Uma aplicação pode exigir uma configuração específica de superfícies, por exemplo, duas paredes grandes e planas opostas para criar uma sala holográfica de espelhos.
    • Nestes casos, a aplicação terá de analisar as superfícies fornecidas pelo mapeamento espacial para detetar superfícies adequadas e direcionar o utilizador para as mesmas.
    • O utilizador deve ter uma opção de contingência se a análise da superfície da aplicação não for fiável. Por exemplo, se a aplicação identificar incorretamente uma porta como uma parede plana, o utilizador precisa de uma forma simples de corrigir este erro.
  • Analisar parte do ambiente

    • Uma aplicação pode querer capturar apenas parte do ambiente, conforme indicado pelo utilizador.
    • Por exemplo, a aplicação analisa parte de uma sala para que o utilizador possa publicar um anúncio holográfico classificado para mobília que pretenda vender.
    • Neste caso, a aplicação deve capturar dados de mapeamento espacial nas regiões observadas pelo utilizador durante a análise.
  • Analisar toda a sala

    • Uma aplicação pode exigir uma análise de todas as superfícies na sala atual, incluindo as que estão atrás do utilizador.
    • Por exemplo, um jogo pode colocar o utilizador no papel de Gulliver, sob cerco de centenas de pequenos lillipucianos que se aproximam de todas as direções.
    • Nesses casos, a aplicação terá de determinar quantas superfícies na sala atual já foram analisadas e direcionar o olhar do utilizador para preencher lacunas significativas.
    • A chave para este processo é fornecer feedback visual que torna claro ao utilizador quais as superfícies que ainda não foram digitalizadas. A aplicação pode, por exemplo, utilizar nevoeiro à 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

    • Uma aplicação pode querer ignorar todas as alterações no ambiente depois de tirar um "instantâneo" inicial.
    • Isto pode ser adequado para evitar a interrupção dos dados criados pelo utilizador que estão fortemente associados ao estado inicial do ambiente.
    • Neste caso, a aplicação deve fazer uma cópia dos dados de mapeamento espacial no respetivo estado inicial assim que a análise estiver concluída.
    • As aplicações devem continuar a receber atualizações para dados de mapeamento espacial se os hologramas continuarem a ser corretamente ocultados pelo ambiente.
    • As atualizações contínuas aos dados de mapeamento espacial também permitem visualizar quaisquer alterações que tenham ocorrido, esclarecendo ao utilizador as diferenças entre estados anteriores e atuais do ambiente.
  • Tirar instantâneos iniciados pelo utilizador do ambiente

    • Uma aplicação só pode querer responder a alterações ambientais quando instruído pelo utilizador.
    • Por exemplo, o utilizador poderia criar várias 'estátuas' 3D de um amigo capturando as suas poses em momentos diferentes.
  • Permitir que o utilizador altere o ambiente

    • Uma aplicação pode ser concebida para responder em tempo real a quaisquer alterações efetuadas no ambiente do utilizador.
    • Por exemplo, o utilizador que desenha uma cortina pode acionar a "alteração da cena" para uma reprodução holográfica que ocorre no outro lado.
  • Orientar o utilizador para evitar erros nos dados de mapeamento espacial

Um detalhe adicional a ter em conta é que o "intervalo" de dados de mapeamento espacial não é ilimitado. Embora o mapeamento espacial crie uma base de dados permanente de espaços grandes, apenas disponibiliza esses dados às aplicações numa "bolha" de tamanho limitado em torno do utilizador. Se começar no início de um longo corredor e se afastar o suficiente do início, eventualmente as superfícies espaciais no início desaparecerão. Pode mitigar esta situação colocando em cache essas superfícies na sua aplicação depois de desaparecerem dos dados de mapeamento espacial disponíveis.

Processamento de malha

Pode ajudar a detetar tipos comuns de erros nas superfícies e a filtrar, remover ou modificar os dados de mapeamento espacial conforme adequado.

Tenha em atenção que os dados de mapeamento espacial se destinam a ser o mais fiéis possível às superfícies do mundo real, pelo que qualquer processamento que aplique corre o risco de deslocar as suas superfícies mais longe da "verdade".

Eis alguns exemplos de diferentes tipos de processamento de malha que pode considerar úteis:

  • Preenchimento de buracos

    • Se um pequeno objeto feito de um material escuro não conseguir digitalizar, deixará um buraco na superfície circundante.
    • Os buracos afetam a oclusão: os hologramas podem ser vistos "através" de um buraco numa superfície do mundo real supostamente opaca.
    • Os buracos afetam os raycasts: se estiver a utilizar raycasts para ajudar os utilizadores a interagir com superfícies, poderá ser indesejável que estes raios passem por buracos. Uma mitigação consiste em utilizar um conjunto de vários raycasts que abrangem uma região de tamanho adequado. Isto permite-lhe filtrar os resultados "atípicos", para que, mesmo que um raycast passe por um pequeno buraco, o resultado agregado continuará a ser válido. No entanto, esta abordagem tem um custo computacional.
    • Os buracos afetam as colisões físicas: um objeto controlado pela simulação física pode cair por um buraco no chão e perder-se.
    • É possível preencher algorítmicamente tais orifícios na malha da superfície. No entanto, terá de otimizar o algoritmo para que os "buracos reais", como janelas e portas, não sejam preenchidos. Pode ser difícil diferenciar de forma fiável os "buracos reais" dos "buracos imaginários", pelo que terá de experimentar diferentes heurísticas, 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.
    • As alucinações afetam a oclusão: as alucinações podem tornar-se visíveis à medida que as formas escuras se movem em frente e ocluem outros hologramas.
    • As alucinações afetam os raycasts: se estiver a usar raycasts para ajudar os utilizadores a interagir com superfícies, estes raios podem atingir uma alucinação em vez da superfície atrás dela. Tal como acontece com os buracos, uma mitigação é utilizar muitos raycasts em vez de um único raycast, mas, mais uma vez, isto terá um custo computacional.
    • As alucinações afetam as colisões físicas: um objeto controlado pela simulação física pode ficar preso a uma alucinação e ser incapaz de se mover através de uma área de espaço aparentemente clara.
    • É possível filtrar tais alucinações da malha da superfície. No entanto, tal como acontece com os orifícios, terá de otimizar o algoritmo para que objetos pequenos reais, como candeeiros e alças de porta, não sejam removidos.
  • Suavização

    • O mapeamento espacial pode devolver superfícies que parecem ser ásperas ou "ruidosas" em comparação com os seus homólogos do mundo real.
    • A suavidade afeta as colisões físicas: se o chão for áspero, uma bola de golfe fisicamente simulada pode não rolar suavemente sobre ela em linha reta.
    • A suavidade afeta a composição: se uma superfície for visualizada diretamente, os normais da superfície áspera podem afetar o aspeto e interromper um aspeto "limpo". É possível mitigar esta situação através da utilização de iluminação e texturas adequadas no sombreador que é utilizado para compor a superfície.
    • É possível suavizar a assiduidade numa malha de superfície. No entanto, isto pode afastar a superfície da superfície do mundo real correspondente. Manter uma correspondência próxima é importante para produzir oclusão de holograma precisa e para permitir que os utilizadores consigam interações precisas e previsíveis com superfícies holográficas.
    • Se apenas for necessária uma alteração cosmética, poderá ser suficiente para suavizar os normais de vértice sem alterar as posições de vértice.
  • Localização do avião

    • Existem muitas formas de análise que uma aplicação pode querer efetuar nas superfícies fornecidas pelo mapeamento espacial.
    • Um exemplo simples é "localização do plano"; identificando regiões delimitadas, principalmente planar das superfícies.
    • As regiões planar podem ser utilizadas como superfícies de trabalho holográficas, regiões onde o conteúdo holográfico pode ser colocado automaticamente pela aplicação.
    • As regiões planar podem restringir a interface de utilizador, para orientar os utilizadores a interagirem com as superfícies que melhor se adequam às suas necessidades.
    • As regiões planar podem ser utilizadas como no mundo real, para equivalentes holográficos a objetos funcionais, como ecrãs LCD, tabelas ou quadros.
    • As regiões planar podem definir áreas de jogo, formando a base dos níveis de videojogos.
    • As regiões planar podem ajudar os agentes virtuais a navegar no mundo real, identificando as áreas do piso em que as pessoas reais são susceptíveis de andar.

Prototipagem e depuração

Ferramentas úteis

  • O emulador do HoloLens pode ser utilizado para desenvolver aplicações através do mapeamento espacial sem acesso a um HoloLens físico. Permite-lhe simular uma sessão em direto num HoloLens num ambiente realista, com todos os dados que a sua aplicação normalmente consumiria, incluindo movimento holoLens, sistemas de coordenadas espaciais e malhas de mapeamento espacial. Isto pode ser utilizado para fornecer entradas fiáveis e repetíveis, o que pode ser útil para depurar problemas e avaliar alterações ao seu código.
  • Para reproduzir um cenário, capture dados de mapeamento espacial através da rede a partir de um HoloLens em direto e, em seguida, guarde-os no disco e reutilize-os em sessões de depuração posteriores.
  • A vista 3D do portal do dispositivo Windows fornece uma forma de ver todas as superfícies espaciais atualmente disponíveis através do sistema de mapeamento espacial. Isto fornece uma base de comparação para as superfícies espaciais dentro da sua aplicação; por exemplo, pode saber facilmente se existem superfícies espaciais em falta ou se estão a ser apresentadas no local errado.

Orientação geral sobre prototipagem

  • Uma vez que os erros nos dados de mapeamento espacial podem afetar fortemente a experiência do utilizador, recomendamos que teste a sua aplicação numa grande variedade de ambientes.
  • Não fique preso com o hábito de testar sempre na mesma localização, por exemplo, na sua secretária. Certifique-se de que testa em várias superfícies de diferentes posições, formas, tamanhos e materiais.
  • Da mesma forma, embora os dados sintéticos ou registados possam ser úteis para a depuração, não dependam demasiado dos mesmos poucos casos de teste. Isto pode atrasar a localização de problemas importantes que testes mais variados teriam apanhado anteriormente.
  • É uma boa ideia efetuar testes com utilizadores reais (e idealmente não treinados), uma vez que podem não utilizar o HoloLens ou a sua aplicação exatamente da mesma forma que o utilizador. Na verdade, pode surpreendê-lo como o comportamento, o conhecimento e as suposições das pessoas podem ser divergentes!

Resolução de problemas

  • Para que as malhas de superfície sejam orientadas corretamente, cada GameObject tem de estar ativo antes de ser enviado para o SurfaceObserver para ter a sua malha construída. Caso contrário, as malhas aparecerão no seu espaço, mas rodadas em ângulos estranhos.
  • O GameObject que executa o script que comunica com o SurfaceObserver tem de ser definido como a origem. Caso contrário, todos os GameObjects que criar e enviar para o SurfaceObserver para que as malhas sejam construídas terão um desvio igual ao desvio do Objeto de Jogo Principal. Isto pode fazer com que as malhas apareçam a vários metros de distância, o que dificulta a depuração do que se está a passar.

Ver também