Creazione di un provider di dati del sistema di consapevolezza spaziale - MRTK2
Il sistema Spatial Awareness è un sistema estendibile per fornire alle applicazioni dati sugli ambienti reali. Per aggiungere il supporto per una nuova piattaforma hardware o una nuova forma di dati di consapevolezza spaziale, potrebbe essere necessario un provider di dati personalizzato.
Questo articolo descrive come creare provider di dati personalizzati, detti anche osservatori spaziali, per il sistema di consapevolezza spaziale. Il codice di esempio illustrato di seguito è tratto dall'implementazione della SpatialObjectMeshObserver
classe che è utile per il caricamento di dati mesh 3D nell'editor.
Nota
Il codice sorgente completo usato in questo esempio è disponibile nella Assets/MRTK/Providers/ObjectMeshObserver
cartella .
Struttura di spazi dei nomi e cartelle
I provider di dati possono essere distribuiti in uno dei due modi seguenti:
- Componenti aggiuntivi di terze parti
- Parte di Microsoft Realtà mista Toolkit
Il processo di approvazione per l'invio di nuovi provider di dati a MRTK varierà caso per caso e verrà comunicato al momento della proposta iniziale. Le proposte possono essere inviate creando un nuovo problema di tipo richiesta di funzionalità.
Componente aggiuntivo di terze parti
Spazio dei nomi
I provider di dati devono avere uno spazio dei nomi per attenuare potenziali conflitti di nomi. È consigliabile che lo spazio dei nomi includa i componenti seguenti.
- Nome della società che produce il componente aggiuntivo
- Area funzionale
Ad esempio, un provider di dati Spatial Awareness creato e spedito dalla società Contoso può essere "Contoso.MixedReality.Toolkit.SpatialAwareness".
Struttura di cartelle
È consigliabile disporre il codice sorgente per i provider di dati in una gerarchia di cartelle, come illustrato nell'immagine seguente.
In cui la cartella ContosoSpatialAwareness contiene l'implementazione del provider di dati, la cartella Editor contiene il controllo (e qualsiasi altro codice specifico dell'editor Unity) e la cartella Profiles contiene uno o più oggetti profilati preconfigurati.
Invio di MRTK
Spazio dei nomi
Se un provider di dati del sistema di consapevolezza spaziale viene inviato al repository di Realtà mista Toolkit, lo spazio dei nomi deve iniziare con Microsoft.MixedReality.Toolkit (ad esempio: Microsoft.MixedReality.Toolkit.SpatialObjectMeshObserver)
e il codice deve trovarsi in una cartella sotto MRTK/Providers (ad esempio MRTK/Providers/ObjectMeshObserver).
Struttura di cartelle
Tutto il codice deve trovarsi in una cartella sotto MRTK/Providers (ad esempio MRTK/Providers/ObjectMeshObserver).
Definire l'oggetto dati spaziali
Il primo passaggio per la creazione di un provider di dati Di consapevolezza spaziale consiste nel determinare il tipo di dati (ad esempio mesh o piani) che fornirà alle applicazioni.
Tutti gli oggetti dati spaziali devono implementare l'interfaccia IMixedRealitySpatialAwarenessObject
.
La base di Realtà mista Toolkit fornisce gli oggetti spaziali seguenti che possono essere usati o estesi nei nuovi provider di dati.
Implementare il provider di dati
Specificare l'ereditarietà dell'interfaccia e/o della classe di base
Tutti i provider di dati Spatial Awareness devono implementare l'interfaccia IMixedRealitySpatialAwarenessObserver
, che specifica la funzionalità minima richiesta dal sistema di consapevolezza spaziale. La base MRTK include la BaseSpatialObserver
classe che fornisce un'implementazione predefinita di questa funzionalità necessaria.
public class SpatialObjectMeshObserver :
BaseSpatialObserver,
IMixedRealitySpatialAwarenessMeshObserver,
IMixedRealityCapabilityCheck
{ }
Nota
L'interfaccia IMixedRealityCapabilityCheck
SpatialObjectMeshObserver
viene usata dalla classe per indicare che fornisce supporto per la funzionalità SpatialAwarenessMesh.
Applicare l'attributo MixedRealityDataProvider
Un passaggio chiave per la creazione di un provider di dati Di consapevolezza spaziale consiste nell'applicare l'attributo MixedRealityDataProvider
alla classe . Questo passaggio abilita l'impostazione del profilo predefinito e delle piattaforme per il provider di dati, se selezionata nel profilo Di consapevolezza spaziale, oltre a Nome, percorso cartella e altro ancora.
[MixedRealityDataProvider(
typeof(IMixedRealitySpatialAwarenessSystem),
SupportedPlatforms.WindowsEditor | SupportedPlatforms.MacEditor | SupportedPlatforms.LinuxEditor,
"Spatial Object Mesh Observer",
"ObjectMeshObserver/Profiles/DefaultObjectMeshObserverProfile.asset",
"MixedRealityToolkit.Providers")]
public class SpatialObjectMeshObserver :
BaseSpatialObserver,
IMixedRealitySpatialAwarenessMeshObserver,
IMixedRealityCapabilityCheck
{ }
Implementare i metodi IMixedRealityDataProvider
Dopo aver definito la classe, il passaggio successivo consiste nel fornire l'implementazione dell'interfaccia IMixedRealityDataProvider
.
Nota
La BaseSpatialObserver
classe , tramite la BaseService
classe , fornisce solo implementazioni vuote per IMixedRealityDataProvider
i metodi. I dettagli di questi metodi sono in genere specifici del provider di dati.
I metodi che devono essere implementati dal provider di dati sono:
Destroy()
Disable()
Enable()
Initialize()
Reset()
Update()
Implementare la logica del provider di dati
Il passaggio successivo consiste nell'aggiungere la logica del provider di dati implementando l'interfaccia del provider di dati specifica, ad esempio IMixedRealitySpatialAwarenessMeshObserver
. Questa parte del provider di dati in genere sarà specifica della piattaforma.
Notifiche di modifica delle osservazioni
Per consentire alle applicazioni di rispondere alle modifiche nella comprensione dell'ambiente del dispositivo, il provider di dati genera eventi di notifica come definito nell'interfaccia IMixedRealitySpatialAwarenessObservationtHandler<T>
.
OnObservationAdded()
OnObservationRemoved()
OnObservationUpdated()
Il codice seguente degli esempi illustra la generazione e l'evento SpatialObjectMeshObserver
quando vengono aggiunti dati mesh.
// The data to be sent when mesh observation events occur.
// This member variable is initialized as part of the Initialize() method.
private MixedRealitySpatialAwarenessEventData<SpatialAwarenessMeshObject> meshEventData = null;
/// <summary>
/// Sends the observations using the mesh data contained within the configured 3D model.
/// </summary>
private void SendMeshObjects()
{
if (!sendObservations) { return; }
if (spatialMeshObject != null)
{
MeshFilter[] meshFilters = spatialMeshObject.GetComponentsInChildren<MeshFilter>();
for (int i = 0; i < meshFilters.Length; i++)
{
SpatialAwarenessMeshObject meshObject = SpatialAwarenessMeshObject.Create(
meshFilters[i].sharedMesh,
MeshPhysicsLayer,
$"Spatial Object Mesh {currentMeshId}",
currentMeshId,
ObservedObjectParent);
meshObject.GameObject.transform.localPosition = meshFilters[i].transform.position;
meshObject.GameObject.transform.localRotation = meshFilters[i].transform.rotation;
ApplyMeshMaterial(meshObject);
meshes.Add(currentMeshId, meshObject);
// Initialize the meshEventData variable with data for the added event.
meshEventData.Initialize(this, currentMeshId, meshObject);
// Raise the event via the spatial awareness system.
SpatialAwarenessSystem?.HandleEvent(meshEventData, OnMeshAdded);
currentMeshId++;
}
}
sendObservations = false;
}
Nota
La SpatialObjectMeshObserver
classe non genera OnObservationUpdated
eventi perché il modello 3D viene caricato una sola volta. L'implementazione nella WindowsMixedRealitySpatialMeshObserver
classe fornisce un esempio di generazione di un OnObservationUpdated
evento per una mesh osservata.
Aggiungere la strumentazione del profiler unity
Le prestazioni sono fondamentali nelle applicazioni di realtà mista. Ogni componente comporta un sovraccarico per cui le applicazioni devono tenere conto. A questo scopo, è importante che tutti i provider di dati di consapevolezza spaziale contengano la strumentazione del profiler Unity nel ciclo interno e i percorsi di codice usati di frequente.
È consigliabile implementare il modello utilizzato da MRTK durante la strumentazione di provider personalizzati.
private static readonly ProfilerMarker UpdateObserverPerfMarker = new ProfilerMarker("[MRTK] WindowsMixedRealitySpatialMeshObserver.UpdateObserver");
/// <summary>
/// Requests updates from the surface observer.
/// </summary>
private void UpdateObserver()
{
using (UpdateObserverPerfMarker.Auto())
{
// Code to be measured.
}
}
Nota
Il nome usato per identificare il marcatore del profiler è arbitrario. MRTK usa il modello seguente.
"[product] className.methodName - nota facoltativa"
È consigliabile che i provider di dati personalizzati seguano un modello simile per semplificare l'identificazione di componenti e metodi specifici durante l'analisi delle tracce.
Creare il profilo e il controllo
In Realtà mista Toolkit i provider di dati vengono configurati usando i profili.
Definire il profilo
Il contenuto del profilo deve eseguire il mirroring delle proprietà accessibili del provider di dati (ad esempio, intervallo di aggiornamento). Tutte le proprietà configurabili dall'utente definite in ogni interfaccia devono essere contenute con il profilo.
Le classi di base sono incoraggiate se un nuovo provider di dati estende un provider esistente. Ad esempio, SpatialObjectMeshObserverProfile
estende per MixedRealitySpatialAwarenessMeshObserverProfile
consentire ai clienti di fornire un modello 3D da usare come dati dell'ambiente.
[CreateAssetMenu(
menuName = "Mixed Reality Toolkit/Profiles/Spatial Object Mesh Observer Profile",
fileName = "SpatialObjectMeshObserverProfile",
order = 100)]
public class SpatialObjectMeshObserverProfile : MixedRealitySpatialAwarenessMeshObserverProfile
{
[SerializeField]
[Tooltip("The model containing the desired mesh data.")]
private GameObject spatialMeshObject = null;
/// <summary>
/// The model containing the desired mesh data.
/// </summary>
public GameObject SpatialMeshObject => spatialMeshObject;
}
L'attributo CreateAssetMenu
può essere applicato alla classe del profilo per consentire ai clienti di creare un'istanza del profilo usando il menu Crea>asset>Realtà mista Toolkit>Profiles.
Implementare il controllo
I controlli profilo sono l'interfaccia utente per la configurazione e la visualizzazione del contenuto del profilo. Ogni controllo profilo deve estendere la BaseMixedRealityToolkitConfigurationProfileInspector
classe .
L'attributo CustomEditor
indica a Unity il tipo di asset a cui si applica il controllo.
[CustomEditor(typeof(SpatialObjectMeshObserverProfile))]
public class SpatialObjectMeshObserverProfileInspector : BaseMixedRealityToolkitConfigurationProfileInspector
{ }
Creare definizioni di assembly
Realtà mista Toolkit usa file di definizione dell'assembly (con estensione asmdef) per specificare le dipendenze tra i componenti e per facilitare Unity nella riduzione del tempo di compilazione.
È consigliabile creare file di definizione dell'assembly per tutti i provider di dati e i relativi componenti dell'editor.
Usando la struttura di cartelle nell'esempio precedente, sono presenti due file con estensione asmdef per il provider di dati ContosoSpatialAwareness.
La prima definizione dell'assembly è per il provider di dati. Per questo esempio, verrà chiamato ContosoSpatialAwareness e si troverà nella cartella ContosoSpatialAwareness dell'esempio. Questa definizione di assembly deve specificare una dipendenza da Microsoft.MixedReality.Toolkit e da qualsiasi altro assembly da cui dipende.
La definizione dell'assembly ContosoInputEditor specifica il controllo del profilo e qualsiasi codice specifico dell'editor. Questo file deve trovarsi nella cartella radice del codice dell'editor. In questo esempio il file si troverà nella cartella ContosoSpatialAwareness\Editor . Questa definizione di assembly conterrà un riferimento all'assembly ContosoSpatialAwareness e:
- Microsoft.MixedReality.Toolkit
- Microsoft.MixedReality.Toolkit.Editor.Inspectors
- Microsoft.MixedReality.Toolkit.Editor.Utilities
Registrare il provider di dati
Dopo la creazione, il provider di dati può essere registrato con il sistema di consapevolezza spaziale da usare nell'applicazione.
Creazione di pacchetti e distribuzione
I provider di dati distribuiti come componenti di terze parti hanno i dettagli specifici della creazione di pacchetti e della distribuzione lasciati alla preferenza dello sviluppatore. Probabilmente, la soluzione più comune sarà generare un pacchetto unity e distribuire tramite Unity Asset Store.
Se un provider di dati viene inviato e accettato come parte del pacchetto Microsoft Realtà mista Toolkit, il team microsoft MRTK lo conterrà e lo distribuirà come parte delle offerte MRTK.
Vedi anche
- Sistema di consapevolezza spaziale
IMixedRealitySpatialAwarenessObject
Interfaccia- Classe
BaseSpatialAwarenessObject
- Classe
SpatialAwarenessMeshObject
- Classe
SpatialAwarenessPlanarObject
IMixedRealitySpatialAwarenessObserver
Interfaccia- Classe
BaseSpatialObserver
IMixedRealitySpatialAwarenessMeshObserver
InterfacciaIMixedRealityDataProvider
InterfacciaIMixedRealityCapabilityCheck
Interfaccia