Mapping spaziale in Unreal
Il mapping spaziale consente di posizionare gli oggetti sulle superfici fisiche del mondo reale. Quando viene eseguito il mapping dell'ambiente intorno a HoloLens, gli ologrammi sembrano più realistici per l'utente. Il mapping spaziale ancora gli oggetti nell'ambiente dell'utente sfruttando i suggerimenti di profondità e dando l'impressione che questi ologrammi si trovino effettivamente nello spazio. Gli ologrammi che fluttuano nello spazio o che si muovono insieme all'utente non vengono percepiti come reali, quindi è sempre necessario inserire gli elementi per comodità quando possibile.
Per altre informazioni su qualità del mapping spaziale, posizionamento, occlusione, rendering e così via, consulta il documento Mapping spaziale.
Il plug-in Microsoft OpenXR deve essere scaricato per usare il mapping spaziale, disponibile in Unreal Marketplace o GitHub.
Abilitazione del mapping spaziale
Per abilitare il mapping spaziale in HoloLens:
- Aprire Modifica > impostazioni progetto e scorrere verso il basso fino alla sezione Piattaforme .
- Seleziona HoloLens e Spatial Perception (Percezione spaziale).
Per acconsentire esplicitamente al mapping spaziale ed eseguire il debug di MRMesh in un gioco HoloLens:
Aprire ARSessionConfig ed espandere la sezione ARSettings > World Mapping .
Seleziona Generate Mesh Data from Tracked Geometry (Genera dati mesh da geometria rilevata), che indica al plug-in di HoloLens di avviare l'acquisizione asincrona dei dati di mapping spaziale e presentarli ad Unreal tramite MRMesh.
Seleziona Render Mesh Data in Wireframe (Esegui il rendering dei dati mesh in wireframe) per visualizzare un contorno wireframe bianco di ogni triangolo in MRMesh.
Mapping spaziale in fase di runtime
Puoi modificare i parametri seguenti per aggiornare il comportamento di runtime del mapping spaziale:
- Aprire Modifica > impostazioni progetto, scorrere verso il basso fino alla sezione Piattaforme e selezionare Mapping spaziale HoloLens>:
- Il parametro Max Triangles Per Cubic Meter (Numero massimo di triangoli per metro cubo) aggiorna la densità dei triangoli nella mesh di mapping spaziale.
- Il parametro Spatial Meshing Volume Size (Dimensioni del volume della mesh spaziale) indica le dimensioni del cubo intorno al giocatore per il rendering e l'aggiornamento dei dati di mapping spaziale.
- Se prevedi che l'ambiente di runtime dell'applicazione sia di grandi dimensioni, è possibile che questo valore debba essere elevato per poter corrispondere allo spazio reale. Il valore può essere più piccolo se l'applicazione deve soltanto posizionare ologrammi sulle superfici immediatamente attorno all'utente. Il volume di mapping spaziale si sposterà quindi contestualmente all'utente.
Uso di MRMesh
In primo luogo, è necessario avviare il mapping spaziale:
Una volta acquisito, è consigliabile disattivare il mapping spaziale per lo spazio. Il mapping spaziale può essere completato dopo un determinato periodo di tempo oppure quando i raycast emessi in ogni direzione restituiscono collisioni con MRMesh.
Per ottenere l'accesso a MRMesh in fase di runtime:
- Aggiungi un componente ARTrackableNotify a un attore del progetto.
- Seleziona il componente ARTrackableNotify ed spandi la sezione Events (Events) nel pannello Details (Dettagli).
- Selezionare il pulsante + sugli eventi da monitorare.
In questo caso viene monitorato l'evento On Add Tracked Geometry (All'aggiunta della geometria rilevata), che cerca mesh reali valide corrispondenti ai dati del mapping spaziale. L'elenco completo degli eventi è disponibile nell'API del componente UARTrackableNotify.
Il materiale della mesh può essere modificato nel grafico eventi del progetto o in C++. Nello screenshot seguente è mostrato il percorso del progetto:
Mapping spaziale in C++
Nel file build.cs del gioco aggiungere AugmentedReality e MRMesh all'elenco PublicDependencyModuleNames:
PublicDependencyModuleNames.AddRange(
new string[] {
"Core",
"CoreUObject",
"Engine",
"InputCore",
"EyeTracker",
"AugmentedReality",
"MRMesh"
});
Per accedere a MRMesh, effettuare la sottoscrizione ai delegati 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
Sono presenti delegati simili per eventi aggiornati e rimossi, rispettivamente AddOnTrackableUpdatedDelegate_Handle e AddOnTrackableRemovedDelegate_Handle.
L'elenco completo degli eventi è disponibile nell'API UARTrackedGeometry.