Criando um provedor de dados do sistema de conscientização espacial

O sistema de conscientização espacial é um sistema extensível para fornecer aplicativos com dados sobre ambientes do mundo real. Para adicionar suporte a uma nova plataforma de hardware ou a uma nova forma de dados de conscientização espacial, um provedor de dados personalizado pode ser necessário.

Este artigo descreve como criar provedores de dados personalizados, também chamados de observadores espaciais, para o sistema de conscientização espacial. O código de exemplo mostrado aqui é da SpatialObjectMeshObserver implementação de classe que é útil para carregar dados de malha 3D no editor.

Observação

O código-fonte completo usado neste exemplo pode ser encontrado na Assets/MRTK/Providers/ObjectMeshObserver pasta.

Namespace e estrutura de pastas

Os provedores de dados podem ser distribuídos de duas maneiras:

  1. Complementos de terceiros
  2. Parte da realidade misturada da Microsoft Toolkit

O processo de aprovação para envios de novos provedores de dados para o MRTK variará de acordo com o caso e será comunicado no momento da proposta inicial. As propostas podem ser enviadas criando um novo problema de tipo de solicitação de recurso.

Complemento de terceiros

Namespace

Os provedores de dados precisam ter um namespace para atenuar colisões de nomes potenciais. É recomendável que o namespace inclua os componentes a seguir.

  • Nome da empresa que produz o complemento
  • Área do recurso

Por exemplo, um provedor de dados de conscientização espacial criado e enviado pela empresa contoso pode ser "contoso. MixedReality. Toolkit. SpatialAwareness ".

Estrutura de pastas

É recomendável que o código-fonte para provedores de dados seja layeddo em uma hierarquia de pastas, conforme mostrado na imagem a seguir.

Estrutura de pasta de exemplo

Onde a pasta ContosoSpatialAwareness contém a implementação do provedor de dados, a pasta do Editor contém o Inspetor (e qualquer outro código específico do editor do Unity) e a pasta perfis contém um ou mais objetos programáveis por script predefinidos.

Envio de MRTK

Namespace

se um provedor de dados do sistema de conscientização espacial estiver sendo enviado para a realidade misturada Toolkit repositório, o namespace deverá começar com Microsoft. MixedReality. Toolkit (ex: Microsoft. MixedReality. Toolkit. SpatialObjectMeshObserver)

e o código deve estar localizado em uma pasta sob MRTK/Providers (por exemplo: MRTK/Providers/ObjectMeshObserver).

Estrutura de pastas

Todo o código deve estar localizado em uma pasta abaixo de MRTK/Providers (por exemplo: MRTK/Providers/ObjectMeshObserver).

Definir o objeto de dados espaciais

A primeira etapa na criação de um provedor de dados de conscientização espacial é determinar o tipo de dados (por exemplo, malhas ou aviões) que ele fornecerá aos aplicativos.

Todos os objetos de dados espaciais devem implementar a IMixedRealitySpatialAwarenessObject interface.

a realidade misturada Toolkit foundation fornece os seguintes objetos espaciais que podem ser usados ou estendidos em novos provedores de dados.

Implementar o provedor de dados

Especificar a interface e/ou a herança de classe base

Todos os provedores de dados de reconhecimento espacial devem implementar a IMixedRealitySpatialAwarenessObserver interface, que especifica a funcionalidade mínima exigida pelo sistema de conscientização espacial. O MRTK Foundation inclui a BaseSpatialObserver classe que fornece uma implementação padrão dessa funcionalidade necessária.

public class SpatialObjectMeshObserver :
    BaseSpatialObserver,
    IMixedRealitySpatialAwarenessMeshObserver,
    IMixedRealityCapabilityCheck
{ }

Observação

A IMixedRealityCapabilityCheck interface é usada pela SpatialObjectMeshObserver classe para indicar que ela fornece suporte para o recurso SpatialAwarenessMesh.

Aplicar o atributo MixedRealityDataProvider

Uma etapa fundamental na criação de um provedor de dados de conscientização espacial é aplicar o MixedRealityDataProvider atributo à classe. Esta etapa permite definir o perfil padrão e as plataformas para o provedor de dados, quando selecionado no perfil de conscientização espacial, bem como nome, caminho da pasta e muito mais.

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

Implementar os métodos IMixedRealityDataProvider

Depois que a classe tiver sido definida, a próxima etapa será fornecer a implementação da IMixedRealityDataProvider interface.

Observação

A BaseSpatialObserver classe, por meio da BaseService classe, fornece apenas uma implementação vazia para IMixedRealityDataProvider métodos. Os detalhes desses métodos geralmente são específicos do provedor de dados.

Os métodos que devem ser implementados pelo provedor de dados são:

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

Implementar a lógica do provedor de dados

A próxima etapa é adicionar a lógica do provedor de dados implementando a interface de provedor de dados específica, por exemplo IMixedRealitySpatialAwarenessMeshObserver . Essa parte do provedor de dados normalmente será específica da plataforma.

Notificações de alteração de observação

Para permitir que os aplicativos respondam às alterações na compreensão do dispositivo do ambiente, o provedor de dados gera eventos de notificação, conforme definido na IMixedRealitySpatialAwarenessObservationtHandler<T> interface.

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

O código a seguir dos SpatialObjectMeshObserver exemplos demonstra o lançamento e evento quando os dados de malha são adicionados.

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

Observação

A SpatialObjectMeshObserver classe não gera OnObservationUpdated eventos, pois o modelo 3D só é carregado uma vez. A implementação na WindowsMixedRealitySpatialMeshObserver classe fornece um exemplo de como gerar um OnObservationUpdated evento para uma malha observada.

Adicionar instrumentação do criador de perfil do Unity

O desempenho é essencial em aplicativos de realidade misturada. Cada componente adiciona alguma quantidade de sobrecarga para os aplicativos que devem ser contados. Para esse fim, é importante que todos os provedores de dados de reconhecimento espacial contenham instrumentação do Unity Profiler no loop interno e caminhos de código frequentemente utilizados.

É recomendável implementar o padrão utilizado pelo MRTK ao instrumentar provedores personalizados.

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

Observação

O nome usado para identificar o marcador do criador de perfil é arbitrário. O MRTK usa o seguinte padrão.

"[Product] className. methodName-observação opcional"

É recomendável que os provedores de dados personalizados sigam um padrão semelhante para ajudar a simplificar a identificação de componentes e métodos específicos ao analisar os rastreamentos.

Criar o perfil e o Inspetor

na realidade misturada Toolkit, os provedores de dados são configurados usando perfis.

Definir o perfil

O conteúdo do perfil deve espelhar as propriedades acessíveis do provedor de dados (ex: intervalo de atualização). Todas as propriedades configuráveis pelo usuário definidas em cada interface devem estar contidas no perfil.

As classes base serão incentivadas se um novo provedor de dados estender um provedor existente. Por exemplo, o SpatialObjectMeshObserverProfile estende o MixedRealitySpatialAwarenessMeshObserverProfile para permitir que os clientes forneçam um modelo 3D a ser usado como os dados do ambiente.

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

o CreateAssetMenu atributo pode ser aplicado à classe de perfil para permitir que os clientes criem uma instância de perfil usando o menu create > assets > Mixed reality Toolkit > profiles .

Implementar o Inspetor

Os inspetores de perfil são a interface do usuário para configurar e exibir o conteúdo do perfil. Cada Inspetor de perfil deve estender a BaseMixedRealityToolkitConfigurationProfileInspector classe.

O CustomEditor atributo informa ao Unity o tipo de ativo ao qual o Inspetor se aplica.

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

Criar definição (ões) de assembly

a realidade misturada Toolkit usa arquivos de definição de assembly (. asmdef) para especificar dependências entre componentes, bem como para auxiliar o Unity na redução do tempo de compilação.

É recomendável que os arquivos de definição de assembly sejam criados para todos os provedores de dados e seus componentes do editor.

Usando a estrutura de pastas no exemplo anterior, haveria dois arquivos. asmdef para o provedor de dados ContosoSpatialAwareness.

A primeira definição do assembly é para o provedor de dados. Para este exemplo, ele será chamado de ContosoSpatialAwareness e estará localizado na pasta ContosoSpatialAwareness do exemplo. Esta definição de assembly deve especificar uma dependência em Microsoft. MixedReality. Toolkit e quaisquer outros assemblies sobre os quais depende.

A definição do assembly ContosoInputEditor especificará o Inspetor de perfil e qualquer código específico do editor. Esse arquivo deve estar localizado na pasta raiz do código do editor. Neste exemplo, o arquivo estará localizado na pasta ContosoSpatialAwareness\Editor . Essa definição de assembly conterá uma referência ao assembly ContosoSpatialAwareness, bem como:

  • Microsoft. MixedReality. Toolkit
  • Microsoft. MixedReality. Toolkit. Editor. inspetores
  • Microsoft. MixedReality. Toolkit. Editor. Utilities

Registrar o provedor de dados

Depois de criado, o provedor de dados pode ser registrado com o sistema de reconhecimento espacial a ser usado no aplicativo.

Selecionando o observador de malha de objetos espaciais

Empacotamento e distribuição

Os provedores de dados que são distribuídos como componentes de terceiros têm os detalhes específicos de empacotamento e distribuição deixados para a preferência do desenvolvedor. Provavelmente, a solução mais comum será gerar um. unitypackage e distribuir por meio do repositório de ativos do Unity.

se um provedor de dados for enviado e aceito como parte do pacote de Toolkit da realidade misturada da microsoft, a equipe do microsoft MRTK irá empacotá-lo e distribuí-lo como parte das ofertas do MRTK.

Consulte também