Vytvoření zprostředkovatele dat systému pro sledování prostoru – MRTK2

Systém Spatial Awareness je rozšiřitelný systém, který poskytuje aplikacím data o reálných prostředích. Pokud chcete přidat podporu pro novou hardwarovou platformu nebo novou formu dat Spatial Awareness, může být vyžadován vlastní zprostředkovatel dat.

Tento článek popisuje, jak vytvořit vlastní zprostředkovatele dat, označované také jako spatial observers, pro systém Spatial Awareness. Zde uvedený ukázkový kód pochází z SpatialObjectMeshObserver implementace třídy, která je užitečná pro načítání dat 3D sítě v editoru.

Poznámka

Kompletní zdrojový kód použitý v tomto příkladu Assets/MRTK/Providers/ObjectMeshObserver najdete ve složce .

Obor názvů a struktura složek

Poskytovatelé dat je možné distribuovat jedním ze dvou způsobů:

  1. Doplňky třetích stran
  2. Součást sady Microsoft Mixed Reality Toolkit

Postup schvalování pro předložení nových poskytovatelů údajů MRTK se bude případ od případu lišit a bude oznámen v okamžiku původního návrhu. Návrhy je možné odeslat vytvořením nového typu žádosti o funkci.

Doplněk třetí strany

Obor názvů

Poskytovatelé dat musí mít obor názvů, aby se zmírnily případné kolize názvů. Doporučuje se, aby obor názvů zahrnoval následující komponenty.

  • Název společnosti vytvářející doplněk
  • Oblast funkce

Například zprostředkovatel dat Spatial Awareness vytvořený a dodávaný společností Contoso může být Contoso.MixedReality.Toolkit.SpatialAwareness.

Struktura složek

Doporučuje se, aby byl zdrojový kód pro zprostředkovatele dat uspořádaný v hierarchii složek, jak je znázorněno na následujícím obrázku.

Příklad struktury složek

Pokud složka ContosoSpatialAwareness obsahuje implementaci zprostředkovatele dat, složka Editor obsahuje inspektor (a jakýkoli jiný kód specifický pro editor Unity) a složka Profiles obsahuje jeden nebo více předem vytvořených skriptovatelných objektů profilu.

Odeslání MRTK

Obor názvů

Pokud se do úložiště Mixed Reality Toolkit odesílají zprostředkovatel dat systému sledování prostoru, musí obor názvů začínat na Microsoft.MixedReality.Toolkit (např. Microsoft.MixedReality.Toolkit.SpatialObjectMeshObserver).

a kód by se měl nacházet ve složce pod MRTK/Providers (např . MRTK/Providers/ObjectMeshObserver).

Struktura složek

Veškerý kód by měl být umístěný ve složce pod MRTK/Providers (např. MRTK/Providers/ObjectMeshObserver).

Definování objektu prostorových dat

Prvním krokem při vytváření zprostředkovatele dat Spatial Awareness je určení typu dat (například sítí nebo rovin), který bude poskytovat aplikacím.

Všechny objekty prostorových dat musí implementovat IMixedRealitySpatialAwarenessObject rozhraní .

Základ sady Mixed Reality Toolkit poskytuje následující prostorové objekty, které je možné použít nebo rozšířit u nových zprostředkovatelů dat.

Implementace zprostředkovatele dat

Určení dědičnosti rozhraní nebo základní třídy

Všichni zprostředkovatelé dat Spatial Awareness musí implementovat IMixedRealitySpatialAwarenessObserver rozhraní, které určuje minimální funkčnost vyžadovanou systémem Spatial Awareness. Základ MRTK zahrnuje BaseSpatialObserver třídu, která poskytuje výchozí implementaci této požadované funkce.

public class SpatialObjectMeshObserver :
    BaseSpatialObserver,
    IMixedRealitySpatialAwarenessMeshObserver,
    IMixedRealityCapabilityCheck
{ }

Poznámka

Rozhraní IMixedRealityCapabilityCheck používá SpatialObjectMeshObserver třída k označení, že poskytuje podporu pro spatialAwarenessMesh schopnost.

Použití atributu MixedRealityDataProvider

Klíčovým krokem při vytváření zprostředkovatele dat Spatial Awareness je použití atributu MixedRealityDataProvider na třídu . Tento krok umožňuje nastavit výchozí profil a platformy pro zprostředkovatele dat, pokud je vybraný v profilu Spatial Awareness, a také název, cestu ke složce a další možnosti.

[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
{ }

Implementace metod IMixedRealityDataProvider

Jakmile je třída definována, dalším krokem je poskytnutí implementace IMixedRealityDataProvider rozhraní.

Poznámka

Třída BaseSpatialObserver prostřednictvím BaseService třídy poskytuje pouze prázdné implementace metod IMixedRealityDataProvider . Podrobnosti o těchto metodách jsou obecně specifické pro zprostředkovatele dat.

Zprostředkovatel dat by měl implementovat následující metody:

  • Destroy()
  • Disable()
  • Enable()
  • Initialize()
  • Reset()
  • Update()

Implementace logiky zprostředkovatele dat

Dalším krokem je přidání logiky zprostředkovatele dat implementací konkrétního rozhraní zprostředkovatele dat, například IMixedRealitySpatialAwarenessMeshObserver. Tato část poskytovatele dat bude obvykle specifická pro danou platformu.

Oznámení o změnách pozorování

Aby mohly aplikace reagovat na změny v porozumění prostředí zařízením, zprostředkovatel dat vyvolává události oznámení, jak jsou definovány v IMixedRealitySpatialAwarenessObservationtHandler<T> rozhraní.

  • OnObservationAdded()
  • OnObservationRemoved()
  • OnObservationUpdated()

Následující kód z SpatialObjectMeshObserver příkladů ukazuje vyvolání a událost při přidání dat sítě.

// 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;
}

Poznámka

Třída SpatialObjectMeshObserver nevyvolává OnObservationUpdated události, protože 3D model je načten pouze jednou. Implementace ve WindowsMixedRealitySpatialMeshObserver třídě poskytuje příklad vyvolání OnObservationUpdated události pro pozorovanou síť.

Přidání instrumentace profileru Unity

Výkon je v aplikacích hybridní reality velmi důležitý. Každá komponenta přidává určitou režii, kterou musí aplikace počítat. Za tímto účelem je důležité, aby všichni poskytovatelé dat pro sledování prostoru obsahovali instrumentaci Unity Profileru ve vnitřní smyčce a často využívané cesty kódu.

Při instrumentaci vlastních zprostředkovatelů se doporučuje implementovat model, který používá MRTK.

        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.
            }
        }

Poznámka

Název použitý k identifikaci značky profileru je libovolný. MRTK používá následující vzor.

"[product] className.methodName – volitelná poznámka"

Doporučujeme, aby vlastní zprostředkovatelé dat postupoval podobným způsobem, aby se zjednodušila identifikace konkrétních komponent a metod při analýze trasování.

Vytvoření profilu a inspektoru

V Mixed Reality Toolkit se zprostředkovatelé dat konfigurují pomocí profilů.

Definování profilu

Obsah profilu by měl odrážet přístupné vlastnosti zprostředkovatele dat (např. interval aktualizace). Všechny uživatelem konfigurovatelné vlastnosti definované v každém rozhraní by měly být obsaženy v profilu.

Základní třídy jsou podporovány, pokud nový zprostředkovatel dat rozšiřuje existujícího zprostředkovatele. Například rozšiřuje MixedRealitySpatialAwarenessMeshObserverProfile , aby zákazníci mohli poskytovat 3D model, SpatialObjectMeshObserverProfile který se použije jako data prostředí.

[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;
}

Atribut CreateAssetMenu lze použít u třídy profilu, aby zákazníci mohli vytvořit instanci profilu pomocí nabídky Vytvořit>prostředky>Mixed Reality Profily sady Nástrojů>.

Implementace inspektoru

Kontroly profilů jsou uživatelské rozhraní pro konfiguraci a zobrazení obsahu profilu. Každá kontrola profilu by měla rozšířit BaseMixedRealityToolkitConfigurationProfileInspector třídu .

Atribut CustomEditor informuje Unity o typu prostředku, na který se inspektor vztahuje.

[CustomEditor(typeof(SpatialObjectMeshObserverProfile))]
public class SpatialObjectMeshObserverProfileInspector : BaseMixedRealityToolkitConfigurationProfileInspector
{ }

Vytvoření definic sestavení

sada Mixed Reality Toolkit používá definiční soubory sestavení (.asmdef) k určení závislostí mezi komponentami a také k tomu, aby unity pomohla zkrátit dobu kompilace.

Doporučuje se vytvářet definiční soubory sestavení pro všechny zprostředkovatele dat a jejich součásti editoru.

Při použití struktury složek v předchozím příkladu by pro zprostředkovatele dat ContosoSpatialAwareness existovaly dva soubory .asmdef.

První definice sestavení je pro zprostředkovatele dat. V tomto příkladu bude mít název ContosoSpatialAwareness a bude umístěný ve složce ContosoSpatialAwareness v příkladu. Tato definice sestavení musí určovat závislost na Microsoft.MixedReality.Toolkit a všech ostatních sestaveních, na kterých závisí.

Definice sestavení ContosoInputEditor určí inspektor profilu a libovolný kód specifický pro editor. Tento soubor musí být umístěn v kořenové složce kódu editoru. V tomto příkladu bude soubor umístěný ve složce ContosoSpatialAwareness\Editor . Tato definice sestavení bude obsahovat odkaz na sestavení ContosoSpatialAwareness a také:

  • Microsoft.MixedReality.Toolkit
  • Microsoft.MixedReality.Toolkit.Editor.Inspectors
  • Microsoft.MixedReality.Toolkit.Editor.Utilities

Registrace poskytovatele dat

Po vytvoření je možné poskytovatele dat zaregistrovat do systému Spatial Awareness, který se použije v aplikaci.

Výběr pozorovatele prostorové sítě objektů

Balení a distribuce

Poskytovatelé dat distribuovaná jako komponenty třetích stran mají konkrétní podrobnosti o balení a distribuci ponechány na preferencích vývojáře. Nejběžnějším řešením bude pravděpodobně vygenerovat balíček .unitypackage a distribuovat ho prostřednictvím úložiště prostředků Unity.

Pokud je poskytovatel dat odeslán a přijat jako součást balíčku Microsoft Mixed Reality Toolkit, tým Microsoft MRTK ho zabalí a distribuuje jako součást nabídek MRTK.

Viz také