Vytvoření poskytovatele systémových dat pro povědomí o prostorech

Systém pro povědomí prostorů je rozšiřitelný systém pro poskytování aplikací s daty o reálných prostředích. Pokud chcete přidat podporu pro novou hardwarovou platformu nebo novou formu dat o povědomí o prostorech, může se vyžadovat vlastní zprostředkovatel dat.

Tento článek popisuje, jak vytvořit vlastní zprostředkovatele dat, označované také jako "prostorové pozorovatelé", pro systém pro povědomí prostorů. Vzorový kód, který je zde uveden, je z SpatialObjectMeshObserver implementace třídy, která je SpatialObjectMeshObserver.

Poznámka

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

Obor názvů a struktura složek

Zprostředkovatele dat lze distribuovat jedním ze dvou způsobů:

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

Proces schválení pro odeslání nových zprostředkovatelů dat do MRTK se bude lišit případ od případu a bude se informovat v okamžiku prvotního návrhu. Návrhy lze odeslat vytvořením nového problému s typem žádosti o funkci.

Doplněk třetí strany

Obor názvů

Poskytovatelé dat musí mít obor názvů pro zmírnění potenciálních kolizí názvů. Doporučuje se, aby obor názvů zahrnoval následující komponenty.

  • Název společnosti, která vytvořila doplněk
  • Oblast funkcí

Například poskytovatel dat o povědomí o prostorech, který vytvořil a dodal společnost Contoso, může být contoso. MixedReality. Toolkit. SpatialAwareness ".

Struktura složek

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

Příklad struktury složek

Kde složka ContosoSpatialAwareness obsahuje implementaci poskytovatele dat, složka Editor obsahuje inspektora (a jakýkoliv jiný kód specifický pro Editor Unity) a složka profily obsahuje jeden nebo více předem připravených objektů s skriptem.

Odeslání MRTK

Obor názvů

pokud se poskytovatel systémových dat pro povědomí o prostorech odesílá do úložiště ve smíšeném realitě Toolkit, musí obor názvů začínat na Microsoft. MixedReality. Toolkit (např.: Microsoft. MixedReality. Toolkit. SpatialObjectMeshObserver)

a kód by měl být umístěn 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í poskytovatele dat pro povědomí o prostorech je určení typu dat (např. sítí nebo rovin), které bude poskytovat aplikacím.

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

Mixed Reality Toolkit foundation poskytuje následující prostorové objekty, které se dají použít nebo rozšířit v nových poskytovatelích dat.

Implementace poskytovatele dat

Zadat rozhraní nebo dědičnost základní třídy

Všichni poskytovatelé dat o povědomí o prostorech musí implementovat IMixedRealitySpatialAwarenessObserver rozhraní, které určuje minimální funkčnost požadovanou systémem pro povědomí prostorů. MRTK Foundation obsahuje třídu, BaseSpatialObserver která poskytuje výchozí implementaci této požadované funkčnosti.

public class SpatialObjectMeshObserver :
    BaseSpatialObserver,
    IMixedRealitySpatialAwarenessMeshObserver,
    IMixedRealityCapabilityCheck
{ }

Poznámka

IMixedRealityCapabilityCheckRozhraní používá SpatialObjectMeshObserver třída k označení toho, že poskytuje podporu pro SpatialAwarenessMesh schopnost.

Použít atribut MixedRealityDataProvider

Klíčový krok při vytváření poskytovatele dat pro povědomí o prostorech je použít MixedRealityDataProvider atribut pro třídu. Tento krok umožňuje nastavit výchozí profil a platformy pro poskytovatele dat, když je vybraný v profilu pro sledování prostorových dat, a taky název, cestu ke složce a další.

[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

Po definování třídy je dalším krokem poskytnutí implementace IMixedRealityDataProvider rozhraní.

Poznámka

BaseSpatialObserverTřída prostřednictvím BaseService třídy poskytuje pouze prázdné implementace pro IMixedRealityDataProvider metody. Podrobnosti o těchto metodách jsou všeobecně specifické pro konkrétního poskytovatele dat.

Mezi metody, které by měly být implementovány poskytovatelem dat, patří:

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

Implementace logiky poskytovatele dat

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

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

Aby aplikace mohla reagovat na změny v porozumění prostředí, zprostředkovatel dat vyvolá události oznámení, jak jsou definované 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 do mřížky.

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

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

Přidat instrumentaci Unity profileru

Výkon je v aplikacích se smíšenými realitami kritický. Každá součást přidává určitou režii, za kterou musí aplikace přihlédnout. K tomuto účelu je důležité, aby všichni poskytovatelé dat o povědomí o prostorech obsahovali instrumentaci Unity profileru v interní smyčce a často používané cesty kódu.

Doporučuje se implementovat vzor, který je využíván MRTK při instrumentaci vlastních poskytovatelů.

        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.

"[produkt] className. methodName – nepovinná Poznámka"

Doporučuje se, aby vlastní zprostředkovatelé dat sledovali podobný vzor, který usnadňuje identifikaci specifických komponent a metod při analýze trasování.

Vytvořit profil a kontrolora

v Toolkit Mixed Reality jsou poskytovatelé dat nakonfigurováni pomocí profilů.

Definovat profil

Obsah profilu by měl zrcadlit dostupné vlastnosti poskytovatele dat (např. interval aktualizace). Všechny konfigurovatelné vlastnosti uživatele definované v každém rozhraní by měly být součástí profilu.

Základní třídy jsou doporučovány v případě, že nový zprostředkovatel dat rozšiřuje stávajícího poskytovatele. Například SpatialObjectMeshObserverProfile rozšiřuje, MixedRealitySpatialAwarenessMeshObserverProfile aby zákazníci mohli zadat 3D model, který se má použít 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;
}

CreateAssetMenuatribut se dá použít u třídy profile, aby zákazníci mohli vytvořit instanci profilu pomocí nabídky CreateAssetMenu>>>>>> .

Implementace inspektoru

Inspektory profilu jsou uživatelské rozhraní pro konfiguraci a zobrazení obsahu profilu. Každý inspektor profilu by měl tuto BaseMixedRealityToolkitConfigurationProfileInspector třídu zvětšit.

CustomEditorAtribut informuje o Unity typ assetu, na který se inspektor vztahuje.

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

Vytvořit definice sestavení

Mixed Reality Toolkit používá soubory definice sestavení (. asmdef) k určení závislostí mezi komponentami a k usnadnění Unity při zkrácení doby kompilace.

Doporučuje se, aby se soubory definic sestavení vytvořily pro všechny poskytovatele dat a jejich komponenty editoru.

Pomocí struktury složek v předchozím příkladu by existovaly dva soubory. asmdef pro poskytovatele dat ContosoSpatialAwareness.

První definice sestavení je pro poskytovatele dat. V tomto příkladu se bude volat 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šechna ostatní sestavení, na kterých závisí.

Definice sestavení ContosoInputEditor bude určovat profil inspektora a jakýkoliv 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 se soubor nachází ve složce ContosoSpatialAwareness\Editor . Tato definice sestavení bude obsahovat odkaz na ContosoSpatialAwareness sestavení a také:

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

Registrace poskytovatele dat

Po vytvoření se dá poskytovatel dat zaregistrovat v systému pro osvětu prostorů, který se má použít v aplikaci.

Výběr pozorovatele mřížky prostorového objektu

Balení a distribuce

Poskytovatelé dat, kteří jsou distribuováni jako komponenty třetích stran, mají konkrétní podrobnosti o balení a distribuci vlevo k předvolbě vývojáře. Nejběžnějším řešením je pravděpodobně vygenerování. unitypackage a distribuce prostřednictvím úložiště assetů Unity.

pokud se poskytovatel dat odešle a přijme jako součást balíčku microsoft Mixed Reality Toolkit, tým Microsoft MRTK ho zabalí a rozešle jako součást nabídek MRTK.

Viz také