Mapeamento espacial no Unreal
O mapeamento espacial permite que você coloque objetos em superfícies físicas no mundo real. Quando o mundo em torno do HoloLens é mapeado, os hologramas parecem mais reais para o usuário. O mapeamento espacial também ancora objetos no mundo do usuário aproveitando as indicações de profundidade, ajudando a convencê-los de que esses hologramas estão realmente no espaço. Os hologramas que flutuam no espaço ou que se movem com o usuário não parecerão reais. Portanto, o ideal é sempre posicionar os itens visando o conforto, quando possível.
No documento Mapeamento espacial, você pode encontrar mais informações sobre posicionamento, oclusão, renderização e qualidade do mapeamento espacial, além de outras informações.
É preciso baixar o plug-in Microsoft OpenXR para usar o mapeamento espacial. Ele está disponível no Unreal Marketplace ou no GitHub.
Como habilitar o mapeamento espacial
Para habilitar o mapeamento espacial no HoloLens:
- Abra Editar Configurações do Projeto e role o painel para baixo até a seção Plataformas.
- Selecione HoloLens e marque Percepção Espacial.
Para aceitar o mapeamento espacial e depurar o MRMesh em um jogo do HoloLens:
Abra o ARSessionConfig e expanda a seção ARSettings Mapeamento do Mundo.
Verifique Gerar Dados de Malha de Geometria Rastreada, que diz ao plug-in do HoloLens para iniciar a obtenção assíncrona de dados de mapeamento espacial e exibi-los no Unreal por meio do MRMesh.
Marque Renderizar Dados de Malha em Grade de Linhas para mostrar um contorno de grade de linhas branco de todos os triângulos no MRMesh.
Mapeamento espacial em runtime
Você pode modificar os seguintes parâmetros para atualizar o comportamento do runtime de mapeamento espacial:
- Abra Editar > Configurações do Projeto, role o painel para baixo até a seção Plataformas e selecione HoloLens > Mapeamento Espacial:
- A opção Máximo de Triângulos por Metro Cúbico atualiza a densidade dos triângulos na malha de mapeamento espacial.
- A opção Tamanho do Volume de Malha Espacial é o tamanho do cubo em volta do jogador para renderizar e atualizar os dados de mapeamento espacial.
- Se for previsto que o ambiente do runtime do aplicativo será grande, esse valor precisará ser grande para corresponder ao espaço do mundo real. O valor poderá ser menor se o aplicativo só precisar posicionar os hologramas nas superfícies imediatamente próximas do usuário. À medida que o usuário se movimenta pelo mundo, o volume de mapeamento espacial se moverá com ele.
Como trabalhar com o MRMesh
Primeiro, você precisa iniciar o mapeamento espacial:
Depois que o mapeamento espacial é capturado para o espaço, recomendamos desativá-lo. O mapeamento espacial poderá ser concluído após determinado período ou quando as conversões de raio em cada direção retornarem colisões na MRMesh.
Para obter acesso ao MRMesh em runtime:
- Adicione um componente ARTrackableNotify a um ator do Blueprint.
- Selecione o componente ARTrackableNotify e expanda a seção Eventos no painel Detalhes.
- Selecione o botão + nos eventos que deseja monitorar.
Nesse caso, o evento adicionar geometria rastreada está sendo monitorado, o qual procura malhas válidas do mundo que correspondem aos dados de mapeamento espacial. Você pode encontrar a lista completa de eventos na API do componente UARTrackableNotify.
Você pode alterar o material da malha no Gráfico de Eventos do Blueprint ou no C++. A captura de tela a seguir mostra a rota de Blueprint:
Mapeamento espacial em C++
No arquivo build.cs do jogo, adicione AugmentedReality e MRMesh à lista PublicDependencyModuleNames:
PublicDependencyModuleNames.AddRange(
new string[] {
"Core",
"CoreUObject",
"Engine",
"InputCore",
"EyeTracker",
"AugmentedReality",
"MRMesh"
});
Para acessar a MRMesh, assine os delegados de OnTrackableAdded:
#include "ARBlueprintLibrary.h"
#include "MRMeshComponent.h"
void AARTrackableMonitor::BeginPlay()
{
Super::BeginPlay();
// Subscribe to Tracked Geometry delegates
UARBlueprintLibrary::AddOnTrackableAddedDelegate_Handle(
FOnTrackableAddedDelegate::CreateUObject(this, &AARTrackableMonitor::OnTrackableAdded)
);
}
void AARTrackableMonitor::OnTrackableAdded(UARTrackedGeometry* Added)
{
// When tracked geometry is received, check that it's from spatial mapping
if(Added->GetObjectClassification() == EARObjectClassification::World)
{
UMRMeshComponent* MRMesh = Added->GetUnderlyingMesh();
}
}
Observação
Há delegados semelhantes para eventos atualizados e removidos, AddOnTrackableUpdatedDelegate_Handle e AddOnTrackableRemovedDelegate_Handle, respectivamente.
Você pode encontrar a lista completa de eventos na API de UARTrackedGeometry.