Tworzenie dostawcy danych systemu rozpoznawania przestrzennego — MRTK2
System rozpoznawania przestrzennego to rozszerzalny system zapewniający aplikacjom dane dotyczące rzeczywistych środowisk. Aby dodać obsługę nowej platformy sprzętowej lub nowej formy danych świadomości przestrzennej, może być wymagany niestandardowy dostawca danych.
W tym artykule opisano sposób tworzenia niestandardowych dostawców danych, nazywanych również obserwatorami przestrzennymi, dla systemu rozpoznawania przestrzennego. Przykładowy kod pokazany tutaj pochodzi z SpatialObjectMeshObserver
implementacji klasy, która jest przydatna do ładowania danych siatki 3D w edytorze.
Uwaga
Kompletny kod źródłowy używany w tym przykładzie można znaleźć w folderze Assets/MRTK/Providers/ObjectMeshObserver
.
Przestrzeń nazw i struktura folderów
Dostawcy danych mogą być dystrybuowani na jeden z dwóch sposobów:
- Dodatki innych firm
- Część zestawu narzędzi Microsoft Mixed Reality Toolkit
Proces zatwierdzania przesyłania nowych dostawców danych do zestawu narzędzi MRTK będzie się różnić w zależności od przypadku i zostanie przekazany w momencie pierwotnego wniosku. Propozycje można przesłać, tworząc nowy problem z typem żądania funkcji.
Dodatek innej firmy
Obszaru nazw
Dostawcy danych muszą mieć przestrzeń nazw, aby wyeliminować potencjalne kolizje nazw. Zaleca się, aby przestrzeń nazw zawierała następujące składniki.
- Nazwa firmy produkująca dodatek
- Obszar funkcji
Na przykład dostawca danych rozpoznawania przestrzennego utworzony i dostarczony przez firmę Contoso może mieć wartość "Contoso.MixedReality.Toolkit.SpatialAwareness".
Struktura folderów
Zaleca się, aby kod źródłowy dostawców danych został ułożone w hierarchii folderów, jak pokazano na poniższej ilustracji.
Gdzie folder ContosoSpatialAwareness zawiera implementację dostawcy danych, folder Editor zawiera inspektora (i dowolny inny kod specyficzny dla edytora aparatu Unity), a folder Profiles zawiera jeden lub więcej wstępnie utworzonych obiektów skryptowych profilu.
Przesyłanie zestawu narzędzi MRTK
Obszaru nazw
Jeśli dostawca danych systemu rozpoznawania przestrzennego jest przesyłany do repozytorium Mixed Reality Toolkit, przestrzeń nazw musi zaczynać się od microsoft.MixedReality.Toolkit (np. Microsoft.MixedReality.Toolkit.SpatialObjectMeshObserver)
kod powinien znajdować się w folderze poniżej zestawu narzędzi MRTK/Providers (np. MRTK/Providers/ObjectMeshObserver).
Struktura folderów
Cały kod powinien znajdować się w folderze poniżej zestawu narzędzi MRTK/Providers (np. MRTK/Providers/ObjectMeshObserver).
Definiowanie obiektu danych przestrzennych
Pierwszym krokiem tworzenia dostawcy danych rozpoznawania przestrzennego jest określenie typu danych (np. siatki lub płaszczyzny), które będą zapewniane aplikacjom.
Wszystkie obiekty danych przestrzennych muszą implementować IMixedRealitySpatialAwarenessObject
interfejs.
Podstawy zestawu narzędzi Mixed Reality udostępniają następujące obiekty przestrzenne, których można używać lub rozszerzać u nowych dostawców danych.
Implementowanie dostawcy danych
Określanie dziedziczenia interfejsu i/lub klasy bazowej
Wszyscy dostawcy danych rozpoznawania przestrzennego muszą zaimplementować IMixedRealitySpatialAwarenessObserver
interfejs, który określa minimalną funkcjonalność wymaganą przez system rozpoznawania przestrzennego. Podstawy zestawu narzędzi MRTK obejmują klasę BaseSpatialObserver
, która zapewnia domyślną implementację tej wymaganej funkcjonalności.
public class SpatialObjectMeshObserver :
BaseSpatialObserver,
IMixedRealitySpatialAwarenessMeshObserver,
IMixedRealityCapabilityCheck
{ }
Uwaga
Interfejs IMixedRealityCapabilityCheck
jest używany przez klasę SpatialObjectMeshObserver
, aby wskazać, że zapewnia obsługę funkcji SpatialAwarenessMesh.
Stosowanie atrybutu MixedRealityDataProvider
Kluczowym krokiem tworzenia dostawcy danych rozpoznawania przestrzennego jest zastosowanie atrybutu MixedRealityDataProvider
do klasy. Ten krok umożliwia ustawienie domyślnych profilów i platform dostawcy danych, po wybraniu w profilu świadomości przestrzennej, a także nazwy, ścieżki folderu i nie tylko.
[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
{ }
Implementowanie metod IMixedRealityDataProvider
Po zdefiniowaniu klasy następnym krokiem jest zapewnienie implementacji interfejsu IMixedRealityDataProvider
.
Uwaga
Klasa BaseSpatialObserver
za pośrednictwem BaseService
klasy udostępnia tylko puste implementacje metod IMixedRealityDataProvider
. Szczegóły tych metod są zwykle specyficzne dla dostawcy danych.
Metody, które powinny być implementowane przez dostawcę danych, to:
Destroy()
Disable()
Enable()
Initialize()
Reset()
Update()
Implementowanie logiki dostawcy danych
Następnym krokiem jest dodanie logiki dostawcy danych przez zaimplementowanie określonego interfejsu dostawcy danych, na przykład IMixedRealitySpatialAwarenessMeshObserver
. Ta część dostawcy danych będzie zwykle specyficzna dla platformy.
Powiadomienia o zmianie obserwacji
Aby umożliwić aplikacjom reagowanie na zmiany w zrozumieniu środowiska przez urządzenie, dostawca danych zgłasza zdarzenia powiadomień zgodnie z definicją w interfejsie IMixedRealitySpatialAwarenessObservationtHandler<T>
.
OnObservationAdded()
OnObservationRemoved()
OnObservationUpdated()
Poniższy kod z SpatialObjectMeshObserver
przykładów przedstawia wywoływanie i zdarzenie podczas dodawania danych siatki.
// 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;
}
Uwaga
Klasa SpatialObjectMeshObserver
nie zgłasza OnObservationUpdated
zdarzeń, ponieważ model 3D jest ładowany tylko raz. Implementacja w WindowsMixedRealitySpatialMeshObserver
klasie stanowi przykład podniesienia OnObservationUpdated
zdarzenia dla obserwowanej siatki.
Dodawanie instrumentacji profilera aparatu Unity
Wydajność ma kluczowe znaczenie w aplikacjach rzeczywistości mieszanej. Każdy składnik dodaje pewną ilość narzutów, dla których aplikacje muszą być uwzględniane. W tym celu ważne jest, aby wszyscy dostawcy danych świadomości przestrzennej zawierali instrumentację profilera aparatu Unity w pętli wewnętrznej i często używane ścieżki kodu.
Zaleca się zaimplementowanie wzorca używanego przez zestaw narzędzi MRTK podczas instrumentowania dostawców niestandardowych.
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.
}
}
Uwaga
Nazwa używana do identyfikowania znacznika profilera jest dowolna. Zestaw narzędzi MRTK używa następującego wzorca.
"[product] className.methodName — opcjonalna uwaga"
Zaleca się, aby niestandardowi dostawcy danych postępowali zgodnie z podobnym wzorcem, aby ułatwić identyfikację określonych składników i metod podczas analizowania śladów.
Tworzenie profilu i inspektora
W Mixed Reality Toolkit dostawcy danych są skonfigurowani przy użyciu profilów.
Definiowanie profilu
Zawartość profilu powinna odzwierciedlać dostępne właściwości dostawcy danych (np. interwał aktualizacji). Wszystkie konfigurowalne właściwości użytkownika zdefiniowane w każdym interfejsie powinny być zawarte w profilu.
Klasy bazowe są zachęcane, jeśli nowy dostawca danych rozszerza istniejącego dostawcę. Na przykład rozszerzenie SpatialObjectMeshObserverProfile
MixedRealitySpatialAwarenessMeshObserverProfile
, aby umożliwić klientom zapewnienie modelu 3D, który będzie używany jako dane środowiska.
[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;
}
Atrybut CreateAssetMenu
można zastosować do klasy profilu, aby umożliwić klientom tworzenie wystąpienia profilu przy użyciu menu Tworzenie>zasobów>Mixed Reality Profile zestawu narzędzi>.
Implementowanie inspektora
Inspektorzy profilów to interfejs użytkownika służący do konfigurowania i wyświetlania zawartości profilu. Każdy inspektor profilu powinien rozszerzyć klasę BaseMixedRealityToolkitConfigurationProfileInspector
.
Atrybut CustomEditor
informuje aparat Unity o typie zasobu, do którego ma zastosowanie inspektor.
[CustomEditor(typeof(SpatialObjectMeshObserverProfile))]
public class SpatialObjectMeshObserverProfileInspector : BaseMixedRealityToolkitConfigurationProfileInspector
{ }
Tworzenie definicji zestawów
Mixed Reality Toolkit używa plików definicji zestawu (asmdef) do określania zależności między składnikami, a także pomaga aparatu Unity w skróceniu czasu kompilacji.
Zaleca się utworzenie plików definicji zestawu dla wszystkich dostawców danych i ich składników edytora.
Korzystając ze struktury folderów we wcześniejszym przykładzie, istnieją dwa pliki asmdef dla dostawcy danych ContosoSpatialAwareness.
Pierwsza definicja zestawu dotyczy dostawcy danych. W tym przykładzie zostanie ona nazwana ContosoSpatialAwareness i będzie znajdować się w folderze ContosoSpatialAwareness w przykładzie. Ta definicja zestawu musi określać zależność od zestawu Microsoft.MixedReality.Toolkit i innych zestawów, od których zależy.
Definicja zestawu ContosoInputEditor określi inspektora profilu i dowolny kod specyficzny dla edytora. Ten plik musi znajdować się w folderze głównym kodu edytora. W tym przykładzie plik zostanie umieszczony w folderze ContosoSpatialAwareness\Editor . Ta definicja zestawu będzie zawierać odwołanie do zestawu ContosoSpatialAwareness, a także:
- Microsoft.MixedReality.Toolkit
- Microsoft.MixedReality.Toolkit.Editor.Inspectors
- Microsoft.MixedReality.Toolkit.Editor.Utilities
Rejestrowanie dostawcy danych
Po utworzeniu dostawca danych można zarejestrować w systemie rozpoznawania przestrzennego, który będzie używany w aplikacji.
Pakowanie i dystrybucja
Dostawcy danych, którzy są dystrybuowani jako składniki innych firm, mają szczegółowe informacje na temat pakowania i dystrybucji pozostawione preferencjom dewelopera. Prawdopodobnie najbardziej typowym rozwiązaniem będzie wygenerowanie pliku unitypackage i rozpowszechnianie za pośrednictwem magazynu zasobów aparatu Unity.
Jeśli dostawca danych zostanie przesłany i zaakceptowany w ramach pakietu Microsoft Mixed Reality Toolkit, zespół MRTK firmy Microsoft spakuje i rozpowszechnia go w ramach ofert MRTK.
Zobacz też
- System rozpoznawania przestrzennego
IMixedRealitySpatialAwarenessObject
Interfejs- Klasa
BaseSpatialAwarenessObject
- Klasa
SpatialAwarenessMeshObject
- Klasa
SpatialAwarenessPlanarObject
IMixedRealitySpatialAwarenessObserver
Interfejs- Klasa
BaseSpatialObserver
IMixedRealitySpatialAwarenessMeshObserver
InterfejsIMixedRealityDataProvider
InterfejsIMixedRealityCapabilityCheck
Interfejs