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:
- Add-on pihak ketiga
- 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.
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.
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
- Sistem kesadaran spasial
IMixedRealitySpatialAwarenessObject
AntarmukaBaseSpatialAwarenessObject
kelasSpatialAwarenessMeshObject
kelasSpatialAwarenessPlanarObject
kelasIMixedRealitySpatialAwarenessObserver
AntarmukaBaseSpatialObserver
kelasIMixedRealitySpatialAwarenessMeshObserver
AntarmukaIMixedRealityDataProvider
AntarmukaIMixedRealityCapabilityCheck
Antarmuka