공간 인식 시스템 데이터 공급자 만들기

공간 인식 시스템은 응용 프로그램에 실제 환경에 대 한 데이터를 제공 하기 위한 확장 가능한 시스템입니다. 새 하드웨어 플랫폼에 대 한 지원을 추가 하거나 새로운 형식의 공간 인식 데이터를 추가 하려면 사용자 지정 데이터 공급자가 필요할 수 있습니다.

이 문서에서는 공간 인식 시스템에 대해 공간 관찰자 라고도 하는 사용자 지정 데이터 공급자를 만드는 방법을 설명 합니다. 여기에 표시 된 예제 코드는 SpatialObjectMeshObserverSpatialObjectMeshObserver는 데 유용 하 게 사용할 수 있는 클래스 구현에서 가져온 것입니다.

참고

이 예제에서 사용 되는 전체 소스 코드는 폴더에 있습니다 Assets/MRTK/Providers/ObjectMeshObserver .

네임 스페이스 및 폴더 구조

데이터 공급자는 다음 두 가지 방법 중 하나로 배포할 수 있습니다.

  1. 타사 추가 기능
  2. Microsoft Mixed Reality의 일부 Toolkit

새 데이터 공급자를 MRTK에 제출 하는 승인 프로세스는 사례별로 다르며 초기 제안의 시점에 전달 됩니다. 새 기능 요청 유형 문제를 만들어 제안을 제출할 수 있습니다.

타사 추가 기능

Namespace

데이터 공급자는 잠재적 이름 충돌을 완화 하기 위해 네임 스페이스가 필요 합니다. 네임 스페이스는 다음 구성 요소를 포함 하는 것이 좋습니다.

  • 추가 기능을 생성 하는 회사 이름
  • 기능 영역

예를 들어 Contoso 회사에서 만들고 제공 하는 공간 인식 데이터 공급자는 "Toolkit MixedReality" 일 수 있습니다. SpatialAwareness ".

폴더 구조

다음 이미지와 같이 폴더 계층 구조에서 데이터 공급자에 대 한 소스 코드를 레이아웃 되도록 하는 것이 좋습니다.

폴더 구조의 예

ContosoSpatialAwareness 폴더에는 데이터 공급자의 구현이 포함 되 고, Editor 폴더에는 검사기 (및 기타 Unity 편집기 관련 코드)가 포함 되며, Profiles 폴더에는 미리 작성 된 프로필 스크립트 가능한 개체가 하나 이상 포함 되어 있습니다.

MRTK 제출

Namespace

공간 인식 시스템 데이터 공급자가 혼합 현실 Toolkit 리포지토리에제출 되는 경우 네임 스페이스는 MixedReality로 시작 해야 Toolkit Toolkit 합니다 (예: MixedReality. SpatialObjectMeshObserver)

코드는 MRTK/Providers (예: Mrtk/providers/ObjectMeshObserver) 아래에 있는 폴더에 있어야 합니다.

폴더 구조

모든 코드는 MRTK/Providers (예: MRTK/Providers/ObjectMeshObserver) 아래에 있는 폴더에 있어야 합니다.

공간 데이터 개체 정의

공간 인식 데이터 공급자를 만드는 첫 번째 단계는 응용 프로그램에 제공 하는 데이터 형식 (예: 메시 또는 평면)을 결정 하는 것입니다.

모든 공간 데이터 개체는 인터페이스를 구현 해야 합니다 IMixedRealitySpatialAwarenessObject .

혼합 현실 Toolkit foundation은 새 데이터 공급자에서 사용 하거나 확장할 수 있는 다음 공간 개체를 제공 합니다.

데이터 공급자 구현

인터페이스 및/또는 기본 클래스 상속 지정

모든 공간 인식 데이터 공급자는 IMixedRealitySpatialAwarenessObserver 공간 인식 시스템에 필요한 최소 기능을 지정 하는 인터페이스를 구현 해야 합니다. MRTK foundation에는 BaseSpatialObserver 이 필수 기능의 기본 구현을 제공 하는 클래스가 포함 되어 있습니다.

public class SpatialObjectMeshObserver :
    BaseSpatialObserver,
    IMixedRealitySpatialAwarenessMeshObserver,
    IMixedRealityCapabilityCheck
{ }

참고

IMixedRealityCapabilityCheck인터페이스는 SpatialObjectMeshObserver 클래스에서 SpatialAwarenessMesh 기능에 대 한 지원을 제공 함을 나타내는 데 사용 됩니다.

MixedRealityDataProvider 특성 적용

공간 인식 데이터 공급자를 만드는 핵심 단계는 특성을 클래스에 적용 하는 것입니다 MixedRealityDataProvider . 이 단계에서는 공간 인식 프로필에서 선택 하 고 이름, 폴더 경로 등을 사용 하 여 데이터 공급자에 대 한 기본 프로필 및 플랫폼을 설정할 수 있습니다.

[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 메서드 구현

클래스가 정의 되 면 다음 단계는 인터페이스의 구현을 제공 하는 것입니다 IMixedRealityDataProvider .

참고

클래스를 BaseSpatialObserver 통해 클래스는 BaseService 메서드에 대해 빈 구현만 제공 IMixedRealityDataProvider 합니다. 이러한 메서드의 세부 정보는 일반적으로 데이터 공급자별로 다릅니다.

데이터 공급자에 의해 구현 되어야 하는 메서드는 다음과 같습니다.

  • Destroy()
  • Disable()
  • Enable()
  • Initialize()
  • Reset()
  • Update()

데이터 공급자 논리 구현

다음 단계는 특정 데이터 공급자 인터페이스를 구현 하 여 데이터 공급자의 논리를 추가 하는 것입니다 (예:) IMixedRealitySpatialAwarenessMeshObserver . 데이터 공급자의이 부분은 일반적으로 플랫폼별로 지정 됩니다.

관찰 변경 알림

응용 프로그램이 환경에 대 한 장치 이해의 변경에 대응할 수 있도록 하기 위해 데이터 공급자는 인터페이스에 정의 된 알림 이벤트를 발생 시킵니다 IMixedRealitySpatialAwarenessObservationtHandler<T> .

  • OnObservationAdded()
  • OnObservationRemoved()
  • OnObservationUpdated()

예의 다음 코드에서는 SpatialObjectMeshObserver 메시 데이터를 추가할 때 발생 하는 이벤트를 보여 줍니다.

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

참고

SpatialObjectMeshObserverOnObservationUpdated 3d 모델은 한 번만 로드 되므로 클래스는 이벤트를 발생 시 키 지 않습니다. 클래스의 구현에서는 WindowsMixedRealitySpatialMeshObserverOnObservationUpdated 관찰 된 망상의 이벤트를 발생 시키는 예제를 제공 합니다.

Unity 프로파일러 계측 추가

혼합 현실 응용 프로그램에서 성능이 중요 합니다. 모든 구성 요소는 응용 프로그램을 고려해 야 하는 몇 가지 오버 헤드를 추가 합니다. 이를 위해 모든 공간 인식 데이터 공급자는 내부 루프 및 자주 사용 되는 코드 경로에서 Unity Profiler 계측을 포함 하는 것이 중요 합니다.

사용자 지정 공급자를 계측할 때 MRTK에서 사용한 패턴을 구현 하는 것이 좋습니다.

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

참고

프로파일러 표식을 식별 하는 데 사용 되는 이름은 임의로 지정 됩니다. MRTK는 다음 패턴을 사용 합니다.

"[product] className. methodName-선택 사항

사용자 지정 데이터 공급자는 추적을 분석할 때 특정 구성 요소 및 메서드를 쉽게 식별할 수 있도록 비슷한 패턴을 따르는 것이 좋습니다.

프로필 및 검사기 만들기

혼합 현실 Toolkit에서 데이터 공급자는 프로필을 사용 하 여 구성 됩니다.

프로필 정의

프로필 콘텐츠는 데이터 공급자의 액세스 가능 속성 (예: 업데이트 간격)을 미러링합니다. 각 인터페이스에 정의 된 모든 사용자 구성 가능 속성은 프로필에 포함 되어야 합니다.

기본 클래스는 새 데이터 공급자가 기존 공급자를 확장 하는 경우에 권장 됩니다. 예를 들어는를 SpatialObjectMeshObserverProfile 확장 MixedRealitySpatialAwarenessMeshObserverProfile 하 여 고객이 환경 데이터로 사용할 3d 모델을 제공할 수 있도록 합니다.

[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;
}

CreateAssetMenu특성은 프로필 클래스에 적용 되어 고객이 asset CreateAssetMenu>>>>>> 만들기 메뉴를 사용 하 여 프로필 인스턴스를 만들 수 있도록 합니다.

검사기 구현

프로필 검사기는 프로필 내용을 구성 하 고 볼 수 있는 사용자 인터페이스입니다. 각 프로필 검사자는 클래스를 확장 해야 합니다 BaseMixedRealityToolkitConfigurationProfileInspector .

CustomEditor특성은 검사기가 적용 되는 자산의 유형을 Unity에 알려 줍니다.

[CustomEditor(typeof(SpatialObjectMeshObserverProfile))]
public class SpatialObjectMeshObserverProfileInspector : BaseMixedRealityToolkitConfigurationProfileInspector
{ }

어셈블리 정의 만들기

혼합 현실에서는 어셈블리 정의 (. asmdef) 파일을 사용 하 여 구성 요소 간의 종속성을 지정 하 고 컴파일 시간을 단축 하는 Unity를 지원할 Toolkit.

모든 데이터 공급자와 해당 편집기 구성 요소에 대해 어셈블리 정의 파일을 만드는 것이 좋습니다.

이전 예제에서 폴더 구조 를 사용 하는 경우 ContosoSpatialAwareness 데이터 공급자에 대 한 두 개의. asmdef 파일이 있습니다.

첫 번째 어셈블리 정의는 데이터 공급자에 대 한 것입니다. 이 예에서는 ContosoSpatialAwareness 라고 하 고 예제의 ContosoSpatialAwareness 폴더에 배치 됩니다. 이 어셈블리 정의는 MixedReality에 대 한 종속성을 지정 해야 합니다. Toolkit 및 해당 어셈블리가 종속 된 다른 어셈블리

ContosoInputEditor 어셈블리 정의는 프로필 검사자 및 모든 편집기 관련 코드를 지정 합니다. 이 파일은 편집기 코드의 루트 폴더에 있어야 합니다. 이 예제에서 파일은 ContosoSpatialAwareness\Editor 폴더에 있습니다. 이 어셈블리 정의에는 ContosoSpatialAwareness 어셈블리에 대 한 참조 및가 포함 됩니다.

  • MixedReality. Toolkit
  • MixedReality. Toolkit. 편집기. 검사기
  • MixedReality. Toolkit. 편집기. 유틸리티

데이터 공급자 등록

데이터 공급자를 만든 후에는 응용 프로그램에서 사용할 공간 인식 시스템에 등록할 수 있습니다.

공간 개체 메시 관찰자 선택

패키징 및 배포

타사 구성 요소로 배포 되는 데이터 공급자에는 개발자의 기본 설정에 대 한 패키징 및 배포에 대 한 구체적인 정보가 있습니다. 가장 일반적인 해결책은 unitypackage를 생성 하 고 Unity Asset Store를 통해 배포 하는 것입니다.

microsoft Mixed Reality Toolkit 패키지의 일부로 데이터 공급자를 제출 하 고 수락한 경우 microsoft mrtk 팀은 mrtk 제품의 일부로 패키지 하 고 배포 합니다.

참고 항목

  • 공간 인식 시스템
  • 감열재
  • 클래스
  • 클래스
  • 클래스
  • 감열재
  • 클래스
  • 감열재
  • 감열재
  • 감열재