코드를 통해 메시 관찰자 구성 - MRTK2

이 문서에서는 공간 인식 시스템 및 관련 Mesh Observer 데이터 공급자를 프로그래밍 방식으로 구성하는 몇 가지 주요 메커니즘 및 API에 대해 설명합니다.

메시 관찰자 액세스

인터페이스를 구현 IMixedRealitySpatialAwarenessMeshObserver 하는 메시 관찰자 클래스는 공간 인식 시스템에 플랫폼별 메시 데이터를 제공합니다. 공간 인식 프로필에서 여러 관찰자를 구성할 수 있습니다.

공간 인식 시스템의 데이터 공급자에 액세스하는 것은 대부분 다른 Mixed Reality 도구 키트 서비스와 동일합니다. API를 통해 GetDataProvider<T> 액세스하려면 공간 인식 서비스를 인터페이스로 IMixedRealityDataProviderAccess 캐스팅해야 하며, 이를 활용하여 런타임에 Mesh Observer 개체에 직접 액세스할 수 있습니다.

// 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>();

도우미는 CoreServices.GetSpatialAwarenessSystemDataProvider<T>() 아래와 같이 이 액세스 패턴을 간소화합니다.

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

메시 관찰 시작 및 중지

공간 인식 시스템을 처리할 때 가장 일반적인 작업 중 하나는 런타임에 기능을 동적으로 해제/켜는 것입니다. 이 작업은 및 IMixedRealitySpatialAwarenessObserver.Suspend API를 통해 관찰자별로 IMixedRealitySpatialAwarenessObserver.Resume 수행됩니다.

// 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();

이 코드 기능은 공간 인식 시스템을 통해 직접 액세스를 통해 간소화할 수도 있습니다.

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

모든 메시 관찰 시작 및 중지

일반적으로 애플리케이션의 모든 메시 관찰을 시작/중지하는 것이 편리합니다. 이는 유용한 공간 인식 시스템 API ResumeObservers()SuspendObservers()을 통해 달성할 수 있습니다.

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

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

메시 열거 및 액세스

메시 액세스는 관찰자별로 수행한 다음 API를 통해 메시 관찰자에게 알려진 메시를 통해 IMixedRealitySpatialAwarenessMeshObserver 열거할 수 있습니다.

편집기에서 실행하는 경우 를 사용하여 AssetDatabase.CreateAsset() 개체를 Mesh 자산 파일에 저장할 수 있습니다.

디바이스에서 실행되는 경우 데이터를 모델 파일 형식으로 직렬화하는 MeshFilter 데 사용할 수 있는 많은 커뮤니티 및 저장소 플러그 인이 있습니다.

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

공간 메시 표시 및 숨기기

아래 샘플 코드를 사용하여 프로그래밍 방식으로 메시를 숨기/표시할 수 있습니다.

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

메시 관찰 이벤트 등록

구성 요소는 를 구현한 IMixedRealitySpatialAwarenessObservationHandler<SpatialAwarenessMeshObject> 다음 공간 인식 시스템에 등록하여 메시 관찰 이벤트를 수신할 수 있습니다.

DemoSpatialMeshHandler (Assets/MRTK/Examples/Demos/SpatialAwareness/Scripts) 스크립트는 Mesh Observer 이벤트를 수신 대기하기 위한 유용한 예제 및 시작점입니다.

이는 DemoSpatialMeshHandler 스크립트 및 메시 관찰 이벤트 수신 대기의 간소화된 예입니다.

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

추가 정보