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:

  1. Üçüncü taraf eklentileri
  2. 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.

Örnek klasör yapısı

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.

Uzamsal nesne örgü gözlemcisini seçme

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.