Membuat penyedia data sistem kesadaran spasial — MRTK2

Sistem Kesadaran Spasial adalah sistem yang dapat diperluas untuk menyediakan aplikasi dengan data tentang lingkungan dunia nyata. Untuk menambahkan dukungan untuk platform perangkat keras baru atau bentuk baru data Kesadaran Spasial, penyedia data kustom mungkin diperlukan.

Artikel ini menjelaskan cara membuat penyedia data kustom, juga disebut Pengamat Spasial, untuk sistem Kesadaran Spasial. Contoh kode yang ditunjukkan di sini adalah dari SpatialObjectMeshObserver implementasi kelas yang berguna untuk memuat data jala 3D di editor.

Catatan

Kode sumber lengkap yang digunakan dalam contoh ini dapat ditemukan di Assets/MRTK/Providers/ObjectMeshObserver folder .

Struktur namespace layanan dan folder

Penyedia data dapat didistribusikan dengan salah satu dari dua cara:

  1. Add-on pihak ketiga
  2. Bagian dari Microsoft Mixed Reality Toolkit

Proses persetujuan untuk pengiriman penyedia data baru ke MRTK akan bervariasi berdasarkan kasus per kasus dan akan dikomunikasikan pada saat proposal awal. Proposal dapat dikirimkan dengan membuat masalah jenis Permintaan Fitur baru.

Add-on pihak ketiga

Ruang nama

Penyedia data diharuskan memiliki namespace layanan untuk mengurangi potensi tabrakan nama. Disarankan agar namespace menyertakan komponen berikut.

  • Nama perusahaan yang menghasilkan add-on
  • Area fitur

Misalnya, penyedia data Kesadaran Spasial yang dibuat dan dikirim oleh perusahaan Contoso mungkin adalah "Contoso.MixedReality.Toolkit.SpatialAwareness".

Struktur folder

Disarankan agar kode sumber untuk penyedia data ditata dalam hierarki folder seperti yang ditunjukkan pada gambar berikut.

Contoh struktur folder

Di mana folder ContosoSpatialAwareness berisi implementasi penyedia data, folder Editor berisi inspektur (dan kode spesifik editor Unity lainnya), dan folder Profil berisi satu atau beberapa objek yang dapat ditulis profil yang telah dibuat sebelumnya.

Pengiriman MRTK

Ruang nama

Jika penyedia data sistem kesadaran spasial dikirimkan ke repositori toolkit Mixed Reality, namespace harus dimulai dengan Microsoft.MixedReality.Toolkit (misalnya: Microsoft.MixedReality.Toolkit.SpatialObjectMeshObserver)

dan kode harus terletak di folder di bawah MRTK/Providers (misalnya: MRTK/Providers/ObjectMeshObserver).

Struktur folder

Semua kode harus terletak di folder di bawah MRTK/Providers (mis: MRTK/Providers/ObjectMeshObserver).

Menentukan objek data spasial

Langkah pertama dalam membuat penyedia data Kesadaran Spasial adalah menentukan jenis data (misalnya: jala atau bidang) yang akan disediakan untuk aplikasi.

Semua objek data spasial harus mengimplementasikan IMixedRealitySpatialAwarenessObject antarmuka.

Fondasi toolkit Mixed Reality menyediakan objek spasial berikut yang dapat digunakan atau diperluas di penyedia data baru.

Menerapkan penyedia data

Tentukan pewarisan kelas antarmuka dan/atau dasar

Semua penyedia data Kesadaran Spasial harus menerapkan IMixedRealitySpatialAwarenessObserver antarmuka, yang menentukan fungsionalitas minimum yang diperlukan oleh sistem Kesadaran Spasial. Fondasi MRTK mencakup BaseSpatialObserver kelas yang menyediakan implementasi default dari fungsionalitas yang diperlukan ini.

public class SpatialObjectMeshObserver :
    BaseSpatialObserver,
    IMixedRealitySpatialAwarenessMeshObserver,
    IMixedRealityCapabilityCheck
{ }

Catatan

Antarmuka IMixedRealityCapabilityCheck digunakan oleh SpatialObjectMeshObserver kelas untuk menunjukkan bahwa antarmuka menyediakan dukungan untuk kemampuan SpatialAwarenessMesh.

Menerapkan atribut MixedRealityDataProvider

Langkah utama dalam membuat penyedia data Kesadaran Spasial adalah menerapkan MixedRealityDataProvider atribut ke kelas . Langkah ini memungkinkan pengaturan profil dan platform default untuk penyedia data, ketika dipilih di profil Kesadaran Spasial serta Nama, jalur folder, dan banyak lagi.

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

Menerapkan metode IMixedRealityDataProvider

Setelah kelas ditentukan, langkah selanjutnya adalah menyediakan implementasi IMixedRealityDataProvider antarmuka.

Catatan

Kelas BaseSpatialObserver , melalui BaseService kelas , hanya menyediakan implementasi kosong untuk IMixedRealityDataProvider metode . Detail metode ini umumnya khusus untuk penyedia data.

Metode yang harus diimplementasikan oleh penyedia data adalah:

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

Menerapkan logika penyedia data

Langkah selanjutnya adalah menambahkan logika penyedia data dengan menerapkan antarmuka penyedia data tertentu, misalnya IMixedRealitySpatialAwarenessMeshObserver. Bagian penyedia data ini biasanya akan spesifik untuk platform.

Pemberitahuan perubahan pengamatan

Untuk memungkinkan aplikasi merespons perubahan pemahaman perangkat tentang lingkungan, penyedia data menaikkan peristiwa pemberitahuan seperti yang IMixedRealitySpatialAwarenessObservationtHandler<T> didefinisikan dalam antarmuka.

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

Kode berikut dari SpatialObjectMeshObserver contoh menunjukkan penggalangan dan peristiwa saat data jala ditambahkan.

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

Catatan

Kelas SpatialObjectMeshObserver tidak menaikkan OnObservationUpdated peristiwa karena model 3D hanya dimuat sekali. Implementasi di WindowsMixedRealitySpatialMeshObserver kelas memberikan contoh OnObservationUpdated peningkatan peristiwa untuk jala yang diamati.

Menambahkan instrumentasi Unity Profiler

Performa sangat penting dalam aplikasi realitas campuran. Setiap komponen menambahkan beberapa jumlah overhead untuk aplikasi mana yang harus memperhitungkan. Untuk akhir ini, penting bahwa semua penyedia data kesadaran spasial berisi instrumentasi Unity Profiler dalam perulangan dalam dan jalur kode yang sering digunakan.

Disarankan untuk menerapkan pola yang digunakan oleh MRTK saat melengkapi penyedia kustom.

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

Catatan

Nama yang digunakan untuk mengidentifikasi penanda profiler bersifat arbitrer. MRTK menggunakan pola berikut.

"[product] className.methodName - catatan opsional"

Disarankan agar penyedia data kustom mengikuti pola serupa untuk membantu menyederhanakan identifikasi komponen dan metode tertentu saat menganalisis jejak.

Membuat profil dan inspektur

Di Mixed Reality Toolkit, penyedia data dikonfigurasi menggunakan profil.

Tentukan profil

Konten profil harus mencerminkan properti penyedia data yang dapat diakses (misalnya: interval pembaruan). Semua properti yang dapat dikonfigurasi pengguna yang ditentukan di setiap antarmuka harus dimuat dengan profil.

Kelas dasar didorong jika penyedia data baru memperluas penyedia yang ada. Misalnya, SpatialObjectMeshObserverProfile memperluas MixedRealitySpatialAwarenessMeshObserverProfile untuk memungkinkan pelanggan menyediakan model 3D untuk digunakan sebagai data lingkungan.

[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 dapat diterapkan ke kelas profil untuk memungkinkan pelanggan membuat instans profil menggunakan menu Buat>Aset> Mixed RealityProfilToolkit>.

Mengimplementasikan inspektur

Pemeriksa profil adalah antarmuka pengguna untuk mengonfigurasi dan melihat konten profil. Setiap pemeriksa profil harus memperpanjang BaseMixedRealityToolkitConfigurationProfileInspector kelas.

Atribut CustomEditor ini memberi tahu Unity jenis aset yang diterapkan inspektur.

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

Membuat definisi perakitan

Mixed Reality Toolkit menggunakan file assembly definition (.asmdef) untuk menentukan dependensi antar komponen serta untuk membantu Unity dalam mengurangi waktu kompilasi.

Disarankan agar file definisi perakitan dibuat untuk semua penyedia data dan komponen editornya.

Menggunakan struktur folder dalam contoh sebelumnya, akan ada dua file .asmdef untuk penyedia data ContosoSpatialAwareness.

Definisi perakitan pertama adalah untuk penyedia data. Untuk contoh ini, itu akan disebut ContosoSpatialAwareness dan akan terletak di folder ContosoSpatialAwareness contoh. Definisi perakitan ini harus menentukan dependensi pada Microsoft.MixedReality.Toolkit dan rakitan lainnya yang bergantung padanya.

Definisi assembly ContosoInputEditor akan menentukan pemeriksa profil dan kode khusus editor apa pun. File ini harus terletak di folder akar kode editor. Dalam contoh ini, file akan terletak di folder ContosoSpatialAwareness\Editor . Definisi perakitan ini akan berisi referensi ke rakitan ContosoSpatialAwareness serta:

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

Mendaftarkan penyedia data

Setelah dibuat, penyedia data dapat didaftarkan ke sistem Kesadaran Spasial yang akan digunakan dalam aplikasi.

Memilih pengamat jala objek spasial

Pengemasan dan distribusi

Penyedia data yang didistribusikan sebagai komponen pihak ketiga memiliki detail spesifik kemasan dan distribusi yang tersisa ke preferensi pengembang. Kemungkinan, solusi yang paling umum adalah menghasilkan .unitypackage dan mendistribusikan melalui Unity Asset Store.

Jika penyedia data dikirimkan dan diterima sebagai bagian dari paket Microsoft Mixed Reality Toolkit, tim MICROSOFT MRTK akan mengemas dan mendistribusikannya sebagai bagian dari penawaran MRTK.

Lihat juga