Mapeamento Espacial em Unreal
O mapeamento espacial permite-lhe colocar objetos em superfícies físicas no mundo real. Quando o mundo à volta do HoloLens é mapeado, os hologramas parecem mais reais para o utilizador. O mapeamento espacial também ancora objetos no mundo do utilizador ao tirar partido das ajudas de profundidade, ajudando a convencê-los 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, pelo que pretende colocar sempre itens para conforto sempre que possível.
Pode encontrar mais informações sobre a qualidade, posicionamento, oclusão, composição e muito mais do mapeamento espacial no documento mapeamento espacial .
O plug-in Microsoft OpenXR deve ser transferido para utilizar o mapeamento espacial, disponível no Unreal Marketplace ou no GitHub.
Ativar o Mapeamento Espacial
Para ativar o mapeamento espacial no HoloLens:
- Abra Editar > Definições do Projeto e desloque-se para baixo até à secção Plataformas .
- Selecione HoloLens e verifique a Perceção Espacial.
Para optar pelo mapeamento espacial e depurar o MRMesh num jogo do HoloLens:
Abra a ARSessionConfig e expanda a secção ARSettings World Mapping (Mapeamento Mundial de ARSettings>).
Selecione Gerar Dados de Malha a partir da Geometria Controlada, que indica ao plug-in do HoloLens para começar a obter dados de mapeamento espacial de forma assíncrona e a utilizá-lo para Unreal através do MRMesh.
Selecione Render Mesh Data in Wireframe (Compor Dados de Malha no Wireframe ) para mostrar um contorno de wireframe branco de cada triângulo no MRMesh.
Mapeamento Espacial no runtime
Pode modificar os seguintes parâmetros para atualizar o comportamento do runtime de mapeamento espacial:
- Abra Editar > Definições do Projeto, desloque-se para baixo até à secção Plataformas e selecione Mapeamento Espacial do HoloLens>:
- Os Triângulos Máximos Por Metro Cúbico atualizam a densidade dos triângulos na malha de mapeamento espacial.
-
O Tamanho do Volume do Spatial Meshing é o tamanho do cubo à volta do leitor para compor e atualizar dados de mapeamento espacial.
- Se se espera que o ambiente de runtime da aplicação esperado seja grande, este valor poderá ter de ser grande para corresponder ao espaço do mundo real. O valor pode ser mais pequeno se a aplicação só precisar de colocar hologramas em superfícies imediatamente à volta do utilizador. À medida que o utilizador anda por todo o mundo, o volume de mapeamento espacial move-se com eles.
Trabalhar com MRMesh
Primeiro, tem de iniciar o Mapeamento Espacial:
Assim que o mapeamento espacial tiver sido capturado para o espaço, recomendamos que desative o mapeamento espacial. O mapeamento espacial pode ser concluído após um determinado período de tempo ou quando os raycasts em cada direção devolvem colisões contra o MRMesh.
Para obter acesso ao MRMesh no runtime:
- Adicione um Componente ARTrackableNotify a um ator de Esquema.
- Selecione o componente ARTrackableNotify e expanda a secção Eventos no painel Detalhes .
- Selecione o + botão nos eventos que pretende monitorizar.
Neste caso, o evento Ao Adicionar Geometria Monitorizada está a ser monitorizado, que procura malhas mundiais válidas que correspondam aos dados de mapeamento espacial. Pode encontrar a lista completa de eventos na API de componente UARTrackableNotify .
Pode alterar o material da malha no Gráfico de Eventos do Esquema ou em C++. A captura de ecrã abaixo mostra a rota do Esquema:
Mapeamento Espacial em C++
No ficheiro build.cs do seu jogo, adicione AugmentedReality e MRMesh à lista PublicDependencyModuleNames:
PublicDependencyModuleNames.AddRange(
new string[] {
"Core",
"CoreUObject",
"Engine",
"InputCore",
"EyeTracker",
"AugmentedReality",
"MRMesh"
});
Para aceder ao MRMesh, subscreva os delegados 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();
}
}
Nota
Existem delegados semelhantes para eventos atualizados e removidos, AddOnTrackableUpdatedDelegate_Handle e AddOnTrackableRemovedDelegate_Handle respetivamente.
Pode encontrar a lista completa de eventos na API UARTrackedGeometry .