Kod aracılığıyla örgü gözlemcilerini yapılandırma — MRTK2

Bu makalede Uzamsal Farkındalık sistemini ve ilgili Mesh Gözlemcisi veri sağlayıcılarını programlı olarak yapılandırmaya yönelik bazı temel mekanizmalar ve API'ler ele alınacaktır.

Mesh gözlemcilerine erişme

Arabirimi uygulayan IMixedRealitySpatialAwarenessMeshObserver Mesh Observer sınıfları, Uzamsal Farkındalık sistemine platforma özgü mesh verileri sağlar. Uzamsal Farkındalık profilinde birden çok Gözlemci yapılandırılabilir.

Uzamsal Farkındalık sisteminin veri sağlayıcılarına erişmek çoğunlukla diğer Karma Gerçeklik Toolkit hizmetiyle aynıdır. Uzamsal Farkındalık hizmeti API'ler aracılığıyla GetDataProvider<T> erişmek için arabirime IMixedRealityDataProviderAccess atanmalıdır. Bu hizmet daha sonra mesh gözlemcisi nesnelerine doğrudan çalışma zamanında erişmek için kullanılabilir.

// Use CoreServices to quickly get access to the IMixedRealitySpatialAwarenessSystem
var spatialAwarenessService = CoreServices.SpatialAwarenessSystem;

// Cast to the IMixedRealityDataProviderAccess to get access to the data providers
var dataProviderAccess = spatialAwarenessService as IMixedRealityDataProviderAccess;

var meshObserver = dataProviderAccess.GetDataProvider<IMixedRealitySpatialAwarenessMeshObserver>();

Yardımcı, CoreServices.GetSpatialAwarenessSystemDataProvider<T>() aşağıda gösterildiği gibi bu erişim düzenini basitleştirir.

// Get the first Mesh Observer available, generally we have only one registered
var meshObserver = CoreServices.GetSpatialAwarenessSystemDataProvider<IMixedRealitySpatialAwarenessMeshObserver>();

// Get the SpatialObjectMeshObserver specifically
var meshObserverName = "Spatial Object Mesh Observer";
var spatialObjectMeshObserver = dataProviderAccess.GetDataProvider<IMixedRealitySpatialAwarenessMeshObserver>(meshObserverName);

Örgü gözlemi başlatma ve durdurma

Uzamsal Farkındalık sistemiyle uğraşırken en yaygın görevlerden biri, özelliği çalışma zamanında dinamik olarak kapatmak/açmaktır. Bu, ve IMixedRealitySpatialAwarenessObserver.Suspend API'leri IMixedRealitySpatialAwarenessObserver.Resume aracılığıyla Gözlemci başına yapılır.

// Get the first Mesh Observer available, generally we have only one registered
var observer = CoreServices.GetSpatialAwarenessSystemDataProvider<IMixedRealitySpatialAwarenessMeshObserver>();

// Suspends observation of spatial mesh data
observer.Suspend();

// Resumes observation of spatial mesh data
observer.Resume();

Bu kod işlevi, uzamsal farkındalık sistemi üzerinden doğrudan erişim yoluyla da basitleştirilebilir.

var meshObserverName = "Spatial Object Mesh Observer";
CoreServices.SpatialAwarenessSystem.ResumeObserver<IMixedRealitySpatialAwarenessMeshObserver>(meshObserverName);

Tüm ağ gözlemlerini başlatma ve durdurma

Uygulamadaki tüm örgü gözlemini başlatmak/durdurmak genellikle uygundur. Bu, yararlı Uzamsal Farkındalık sistemi API'leri ResumeObservers() ve SuspendObservers()aracılığıyla gerçekleştirilebilir.

// Resume Mesh Observation from all Observers
CoreServices.SpatialAwarenessSystem.ResumeObservers();

// Suspend Mesh Observation from all Observers
CoreServices.SpatialAwarenessSystem.SuspendObservers();

Kısa çizgileri listeleme ve bunlara erişme

Mesh'lere erişim Gözlemci başına yapılabilir ve ardından API aracılığıyla bu Mesh Gözlemcisi tarafından bilinen tireler boyunca IMixedRealitySpatialAwarenessMeshObserver numaralandırılabilir.

Düzenleyicide çalıştırılıyorsa, nesnesini bir varlık dosyasına kaydetmek Mesh için kullanabilirsinizAssetDatabase.CreateAsset().

Cihazda çalıştırılıyorsa, verileri bir model dosya türüne seri hale getirmek MeshFilter için kullanılabilecek birçok topluluk ve mağaza eklentisi vardır.

// Get the first Mesh Observer available, generally we have only one registered
var observer = CoreServices.GetSpatialAwarenessSystemDataProvider<IMixedRealitySpatialAwarenessMeshObserver>();

// Loop through all known Meshes
foreach (SpatialAwarenessMeshObject meshObject in observer.Meshes.Values)
{
    Mesh mesh = meshObject.Filter.mesh;
    // Do something with the Mesh object
}

Uzamsal ağı gösterme ve gizleme

Aşağıdaki örnek kodu kullanarak kısa çizgileri program aracılığıyla gizlemek/göstermek mümkündür:

// Get the first Mesh Observer available, generally we have only one registered
var observer = CoreServices.GetSpatialAwarenessSystemDataProvider<IMixedRealitySpatialAwarenessMeshObserver>();

// Set to not visible
observer.DisplayOption = SpatialAwarenessMeshDisplayOptions.None;

// Set to visible and the Occlusion material
observer.DisplayOption = SpatialAwarenessMeshDisplayOptions.Occlusion;

Mesh gözlem olaylarına kaydolma

Bileşenler, Mesh Gözlem olaylarını IMixedRealitySpatialAwarenessObservationHandler<SpatialAwarenessMeshObject> almak için uygulamasını ve ardından Uzamsal Farkındalık sistemine kaydolabilir.

DemoSpatialMeshHandler (Assets/MRTK/Examples/Demos/SpatialAwareness/Scripts) betiği, Mesh Gözlemcisi olaylarını dinlemek için yararlı bir örnek ve başlangıç noktasıdır.

Bu, DemoSpatialMeshHandler betiğinin ve Mesh Gözlem olayı dinlemenin basitleştirilmiş bir örneğidir.

// Simplify type
using SpatialAwarenessHandler = IMixedRealitySpatialAwarenessObservationHandler<SpatialAwarenessMeshObject>;

public class MyMeshObservationExample : MonoBehaviour, SpatialAwarenessHandler
{
    private void OnEnable()
    {
        // Register component to listen for Mesh Observation events, typically done in OnEnable()
        CoreServices.SpatialAwarenessSystem.RegisterHandler<SpatialAwarenessHandler>(this);
    }

    private void OnDisable()
    {
        // Unregister component from Mesh Observation events, typically done in OnDisable()
        CoreServices.SpatialAwarenessSystem.UnregisterHandler<SpatialAwarenessHandler>(this);
    }

    public virtual void OnObservationAdded(MixedRealitySpatialAwarenessEventData<SpatialAwarenessMeshObject> eventData)
    {
        // Do stuff
    }

    public virtual void OnObservationUpdated(MixedRealitySpatialAwarenessEventData<SpatialAwarenessMeshObject> eventData)
    {
        // Do stuff
    }

    public virtual void OnObservationRemoved(MixedRealitySpatialAwarenessEventData<SpatialAwarenessMeshObject> eventData)
    {
        // Do stuff
    }
}

Ayrıca bkz.