Uzamsal farkındalık sistemi veri sağlayıcısı oluşturma — MRTK2
Uzamsal Farkındalık sistemi, uygulamalara gerçek dünya ortamları hakkında veri sağlamak için genişletilebilir bir sistemdir. Yeni bir donanım platformu veya yeni bir Uzamsal Farkındalık verileri biçimi için destek eklemek için özel bir veri sağlayıcısı gerekebilir.
Bu makalede, Uzamsal Farkındalık sistemi için Uzamsal Gözlemciler olarak da adlandırılan özel veri sağlayıcılarının nasıl oluşturulacağı açıklanır. Burada gösterilen örnek kod, düzenleyicide 3B mesh verilerini yüklemek için yararlı olan sınıf uygulamasından alınmıştı.SpatialObjectMeshObserver
Not
Bu örnekte kullanılan kaynak kodunun Assets/MRTK/Providers/ObjectMeshObserver
tamamı klasörde bulunabilir.
Ad alanı ve klasör yapısı
Veri sağlayıcıları iki yoldan biriyle dağıtılabilir:
- Üçüncü taraf eklentileri
- Microsoft Karma Gerçeklik Araç Seti'nin bir parçası
Yeni veri sağlayıcılarının MRTK'ye gönderilmesi için onay süreci büyük/küçük harfe göre değişir ve ilk teklif sırasında iletilecektir. Teklifler, yeni bir Özellik İsteği türü sorunu oluşturularak gönderilebilir.
Üçüncü taraf eklentisi
Ad alanı
Olası ad çakışmalarını azaltmak için veri sağlayıcılarının bir ad alanına sahip olması gerekir. Ad alanının aşağıdaki bileşenleri içermesi önerilir.
- Eklentiyi oluşturan şirket adı
- Özellik alanı
Örneğin, Contoso şirketi tarafından oluşturulan ve gönderilen uzamsal farkındalık veri sağlayıcısı "Contoso.MixedReality.Toolkit.SpatialAwareness" olabilir.
Klasör yapısı
Veri sağlayıcılarının kaynak kodunun aşağıdaki görüntüde gösterildiği gibi bir klasör hiyerarşisinde düzenlenmesi önerilir.
ContosoSpatialAwareness klasörü veri sağlayıcısının uygulamasını içerdiğinde, Düzenleyici klasörü denetçiyi (ve unity düzenleyicisine özgü diğer kodları) içerir ve Profiles klasörü bir veya daha fazla önceden oluşturulmuş profil betiklenebilir nesnesi içerir.
MRTK gönderimi
Ad alanı
Karma Gerçeklik Toolkit deposuna uzamsal farkındalık sistemi veri sağlayıcısı gönderiliyorsa, ad alanı Microsoft.MixedReality.Toolkit ile başlamalıdır (örneğin: Microsoft.MixedReality.Toolkit.SpatialObjectMeshObserver)
ve kod MRTK/Providers altındaki bir klasörde bulunmalıdır (örneğin: MRTK/Providers/ObjectMeshObserver).
Klasör yapısı
Tüm kod MRTK/Providers altındaki bir klasörde bulunmalıdır (örneğin: MRTK/Providers/ObjectMeshObserver).
Uzamsal veri nesnesini tanımlama
Uzamsal Farkındalık veri sağlayıcısı oluşturmanın ilk adımı, uygulamalara sağlayacağı veri türünü (ör. tireler veya düzlemler) belirlemektir.
Tüm uzamsal veri nesneleri arabirimini IMixedRealitySpatialAwarenessObject
uygulamalıdır.
Karma Gerçeklik Toolkit temeli, yeni veri sağlayıcılarında kullanılabilecek veya genişletilebilen aşağıdaki uzamsal nesneleri sağlar.
Veri sağlayıcısını uygulama
Arabirim ve/veya temel sınıf devralmayı belirtme
Tüm Uzamsal Farkındalık veri sağlayıcıları, Uzamsal Farkındalık sisteminin gerektirdiği en düşük işlevselliği belirten arabirimi uygulamalıdır IMixedRealitySpatialAwarenessObserver
. MRTK temeli, bu gerekli işlevselliğin BaseSpatialObserver
varsayılan uygulamasını sağlayan sınıfını içerir.
public class SpatialObjectMeshObserver :
BaseSpatialObserver,
IMixedRealitySpatialAwarenessMeshObserver,
IMixedRealityCapabilityCheck
{ }
Not
IMixedRealityCapabilityCheck
Arabirimi, SpatialAwarenessMesh özelliği için destek sağladığını belirtmek için sınıfı tarafından SpatialObjectMeshObserver
kullanılır.
MixedRealityDataProvider özniteliğini uygulama
Uzamsal Farkındalık veri sağlayıcısı oluşturmanın önemli bir adımı özniteliğini MixedRealityDataProvider
sınıfa uygulamaktır. Bu adım, Uzamsal Farkındalık profilinin yanı sıra Ad, klasör yolu ve daha fazlası için seçildiğinde veri sağlayıcısı için varsayılan profil ve platformların ayarlanmasını sağlar.
[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
{ }
IMixedRealityDataProvider yöntemlerini uygulama
Sınıf tanımlandıktan sonra, bir sonraki adım arabiriminin IMixedRealityDataProvider
uygulanmasını sağlamaktır.
Not
BaseSpatialObserver
sınıfı aracılığıylaBaseService
, yöntemler için IMixedRealityDataProvider
yalnızca boş bir uygulama sağlar. Bu yöntemlerin ayrıntıları genellikle veri sağlayıcısına özeldir.
Veri sağlayıcısı tarafından uygulanması gereken yöntemler şunlardır:
Destroy()
Disable()
Enable()
Initialize()
Reset()
Update()
Veri sağlayıcısı mantığını uygulama
Sonraki adım, veri sağlayıcısı arabirimini uygulayarak veri sağlayıcısının mantığını eklemektir, örneğin IMixedRealitySpatialAwarenessMeshObserver
. Veri sağlayıcısının bu bölümü genellikle platforma özgü olur.
Gözlem değişikliği bildirimleri
Uygulamaların cihazın ortamı anlamasında değişikliklere yanıt vermesine izin vermek için veri sağlayıcısı, arabirimde IMixedRealitySpatialAwarenessObservationtHandler<T>
tanımlandığı gibi bildirim olayları oluşturur.
OnObservationAdded()
OnObservationRemoved()
OnObservationUpdated()
Örneklerden alınan aşağıdaki kod, SpatialObjectMeshObserver
mesh verileri eklendiğinde oluşturma ve olayı gösterir.
// 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;
}
Not
SpatialObjectMeshObserver
3B model yalnızca bir kez yüklendiğinden sınıfı olayları tetiklemiyorOnObservationUpdated
. sınıfındaki WindowsMixedRealitySpatialMeshObserver
uygulama, gözlemlenen bir ağ için olay OnObservationUpdated
oluşturma örneği sağlar.
Unity Profiler izlemesi ekleme
Karma gerçeklik uygulamalarında performans kritik öneme sahiptir. Her bileşen, uygulamaların hesaba katması gereken bir miktar ek yük ekler. Bu amaçla, tüm uzamsal farkındalık veri sağlayıcılarının iç döngüde Unity Profiler izlemesini ve sık kullanılan kod yollarını içermesi önemlidir.
Özel sağlayıcılar izlendiğinde MRTK tarafından kullanılan desenin uygulanması önerilir.
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.
}
}
Not
Profil oluşturucu işaretçisini tanımlamak için kullanılan ad rastgeledir. MRTK aşağıdaki deseni kullanır.
"[product] className.methodName - isteğe bağlı not"
İzlemeleri analiz ederken belirli bileşenlerin ve yöntemlerin tanımlanmasını kolaylaştırmaya yardımcı olmak için özel veri sağlayıcılarının benzer bir desen izlemesi önerilir.
Profil ve denetçi oluşturma
Karma Gerçeklik Araç Seti'nde veri sağlayıcıları profiller kullanılarak yapılandırılır.
Profili tanımlama
Profil içeriği, veri sağlayıcısının erişilebilir özelliklerini yansıtmalıdır (örneğin: güncelleştirme aralığı). Her arabirimde tanımlanan tüm kullanıcı yapılandırılabilir özellikleri profille birlikte bulunmalıdır.
Yeni bir veri sağlayıcısı mevcut bir sağlayıcıyı genişletirse temel sınıflar teşvik edilir. Örneğin, SpatialObjectMeshObserverProfile
, müşterilerin ortam verileri olarak kullanılacak bir 3B model sağlamasına olanak tanımak için öğesini genişletir MixedRealitySpatialAwarenessMeshObserverProfile
.
[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;
}
ÖznitelikCreateAssetMenu
, müşterilerinVarlık>Oluştur>Karma Gerçeklik Araç Seti> Profilleri menüsünü kullanarak profil örneği oluşturmasını sağlamak içinprofil sınıfına uygulanabilir.
Denetçiyi uygulama
Profil denetçileri, profil içeriğini yapılandırmaya ve görüntülemeye yönelik kullanıcı arabirimidir. Her profil denetçisi sınıfı genişletmelidir BaseMixedRealityToolkitConfigurationProfileInspector
.
özniteliği Unity'ye CustomEditor
denetçinin uygulandığı varlığın türünü bildirir.
[CustomEditor(typeof(SpatialObjectMeshObserverProfile))]
public class SpatialObjectMeshObserverProfileInspector : BaseMixedRealityToolkitConfigurationProfileInspector
{ }
Derleme tanımları oluşturma
Karma Gerçeklik Toolkit, bileşenler arasındaki bağımlılıkları belirtmek ve derleme süresini kısaltmak için Unity'ye yardımcı olmak için derleme tanımı (.asmdef) dosyalarını kullanır.
Tüm veri sağlayıcıları ve düzenleyici bileşenleri için derleme tanım dosyalarının oluşturulması önerilir.
Önceki örnekteki klasör yapısı kullanıldığında ContosoSpatialAwareness veri sağlayıcısı için iki .asmdef dosyası olacaktır.
İlk derleme tanımı veri sağlayıcısına yöneliktir. Bu örnekte ContosoSpatialAwareness adı verilir ve örneğin ContosoSpatialAwareness klasöründe bulunur. Bu derleme tanımı, Microsoft.MixedReality.Toolkit'e ve bağımlı olduğu diğer derlemelere bağımlılık belirtmelidir.
ContosoInputEditor derleme tanımı, profil denetçisini ve herhangi bir düzenleyiciye özgü kodu belirtir. Bu dosya düzenleyici kodunun kök klasöründe bulunmalıdır. Bu örnekte, dosya ContosoSpatialAwareness\Editor klasöründe bulunur. Bu derleme tanımı, ContosoSpatialAwareness derlemesine bir başvuru içerir ve şunları içerir:
- Microsoft.MixedReality.Toolkit
- Microsoft.MixedReality.Toolkit.Editor.Inspectors
- Microsoft.MixedReality.Toolkit.Editor.Utilities
Veri sağlayıcısını kaydetme
Veri sağlayıcısı oluşturulduktan sonra uygulamada kullanılacak Uzamsal Farkındalık sistemine kaydedilebilir.
Paketleme ve dağıtım
Üçüncü taraf bileşenler olarak dağıtılan veri sağlayıcıları, paketleme ve dağıtımla ilgili belirli ayrıntılara geliştiricinin tercihine bırakılır. Büyük olasılıkla en yaygın çözüm bir .unitypackage oluşturmak ve Unity Asset Store aracılığıyla dağıtmak olacaktır.
Microsoft Karma Gerçeklik Toolkit paketinin bir parçası olarak bir veri sağlayıcısı gönderilir ve kabul edilirse, Microsoft MRTK ekibi bunu MRTK tekliflerinin bir parçası olarak paketleyip dağıtır.
Ayrıca bkz.
- Uzamsal farkındalık sistemi
IMixedRealitySpatialAwarenessObject
ArabirimBaseSpatialAwarenessObject
sınıfıSpatialAwarenessMeshObject
sınıfıSpatialAwarenessPlanarObject
sınıfıIMixedRealitySpatialAwarenessObserver
ArabirimBaseSpatialObserver
sınıfıIMixedRealitySpatialAwarenessMeshObserver
ArabirimIMixedRealityDataProvider
ArabirimIMixedRealityCapabilityCheck
Arabirim