Criação de um fornecedor de dados do sistema de sensibilização espacial

O Sistema de Sensibilização Espacial é um sistema extensível para fornecer aplicações com dados sobre ambientes do mundo real. Para adicionar suporte para uma nova plataforma de hardware ou uma nova forma de dados de Consciência Espacial, pode ser necessário um fornecedor de dados personalizado.

Este artigo descreve como criar fornecedores de dados personalizados, também chamados Observadores Espaciais, para o sistema de Sensibilização Espacial. O código de exemplo aqui mostrado é da implementação da SpatialObjectMeshObserver classe que é útil para carregar SpatialObjectMeshObserver

Nota

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

Espaço de nome e estrutura de pasta

Os fornecedores de dados podem ser distribuídos de uma de duas formas:

  1. Complementos de terceiros
  2. Parte do Microsoft Mixed Reality Toolkit

O processo de aprovação para a apresentação de novos fornecedores de dados ao MRTK variará caso a caso e será comunicado no momento da proposta inicial. As propostas podem ser submetidas através da criação de um novo número de pedido de recurso.

Complemento de terceiros

Espaço de Nomes

Os fornecedores de dados são obrigados a ter um espaço de nome para mitigar potenciais colisões de nomes. Recomenda-se que o espaço de nomes inclua os seguintes componentes.

  • Nome da empresa que produz o add-on
  • Área de recursos

Por exemplo, um fornecedor de dados de sensibilização espacial criado e enviado pela empresa Contoso pode ser "Contoso.MixedReality.Toolkit.SpatialAwareness".

Estrutura de pasta

Recomenda-se que o código-fonte dos fornecedores de dados seja escondido numa hierarquia de pasta, tal como mostrado na imagem seguinte.

Exemplo de estrutura de pasta

Quando a pasta ContosoSpatialAwareness contém a implementação do fornecedor de dados, a pasta Editor contém o inspetor (e qualquer outro código específico do editor de Unidade), e a pasta Perfis contém um ou mais objetos scriptáveis de perfil pré-fabricados.

Submissão mrtk

Espaço de Nomes

Se um fornecedor de dados do sistema de sensibilização espacial estiver a ser submetido ao repositório de ferramentas de realidade mista,o espaço de nomes deve começar com Microsoft.MixedReality.Toolkit (ex: Microsoft.MixedReality.Toolkit.SpatialObjectMeshObserver)

e o código deve ser colocado numa pasta sob MRTK/Fornecedores (ex: MRTK/Providers/ObjectMeshObserver).

Estrutura de pasta

Todo o código deve ser colocado numa pasta abaixo do MRTK/Providers (ex: MRTK/Providers/ObjectMeshObserver).

Defina o objeto de dados espaciais

O primeiro passo para a criação de um fornecedor de dados de sensibilização espacial é determinar o tipo de dados (ex: malhas ou aviões) que irá fornecer às aplicações.

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

A fundação Mixed Reality Toolkit fornece os seguintes objetos espaciais que podem ser usados ou estendidos em novos fornecedores de dados.

Implementar o fornecedor de dados

Especificar interface e/ou herança de classe base

Todos os fornecedores de dados de sensibilização espacial devem implementar a IMixedRealitySpatialAwarenessObserver interface, que especifica a funcionalidade mínima exigida pelo sistema de Sensibilização Espacial. A fundação MRTK inclui a BaseSpatialObserver classe que fornece uma implementação padrão desta funcionalidade necessária.

public class SpatialObjectMeshObserver :
    BaseSpatialObserver,
    IMixedRealitySpatialAwarenessMeshObserver,
    IMixedRealityCapabilityCheck
{ }

Nota

A IMixedRealityCapabilityCheck interface é usada pela classe para indicar que fornece suporte para a capacidade SpatialObjectMeshObserver SpatialAwarenessMesh.

Aplicar o atributo MixedRealityDataProvider

Um passo fundamental na criação de um fornecedor de dados de sensibilização espacial é aplicar o MixedRealityDataProvider atributo à classe. Este passo permite definir o perfil predefinido e a plataforma(s) para o fornecedor de dados, quando selecionado no perfil de Consciência Espacial, bem como nome, caminho de 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

Uma vez definida a classe, o próximo passo é fornecer a implementação da IMixedRealityDataProvider interface.

Nota

A BaseSpatialObserver aula, através da BaseService classe, fornece apenas uma implementação vazia para IMixedRealityDataProvider métodos. Os detalhes destes métodos são geralmente específicos do fornecedor de dados.

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

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

Implementar a lógica do fornecedor de dados

O próximo passo é adicionar a lógica do fornecedor de dados implementando, por exemplo, a interface específica do fornecedor de IMixedRealitySpatialAwarenessMeshObserver dados. Esta parte do fornecedor de dados será normalmente específica da plataforma.

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

Para permitir que as aplicações respondam a alterações na compreensão do dispositivo sobre o ambiente, o fornecedor de dados eleva os eventos de notificação conforme definido na IMixedRealitySpatialAwarenessObservationtHandler<T> interface.

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

O seguinte código dos SpatialObjectMeshObserver exemplos demonstra a elevação e o 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;
}

Nota

A SpatialObjectMeshObserver classe não aumenta os OnObservationUpdated eventos uma vez que o modelo 3D só é carregado uma vez. A implementação na WindowsMixedRealitySpatialMeshObserver classe fornece um exemplo de elevação de um evento para uma malha OnObservationUpdated observada.

Adicionar instrumentação de perfis de unidade

O desempenho é fundamental em aplicações de realidade mista. Cada componente adiciona uma quantidade de despesas gerais para as quais as aplicações devem ter em conta. Para tal, é importante que todos os fornecedores de dados de sensibilização espacial contenham a instrumentação do Perfil de Unidade em loop interno e sejam frequentemente utilizados caminhos de código.

Recomenda-se implementar o padrão utilizado pelo MRTK ao instrumentar fornecedores 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.
            }
        }

Nota

O nome usado para identificar o marcador de perfis é arbitrário. O MRTK utiliza o seguinte padrão.

"[produto] className.methodName - nota opcional"

Recomenda-se que os fornecedores de dados personalizados sigam um padrão semelhante para ajudar a simplificar a identificação de componentes e métodos específicos ao analisar vestígios.

Crie o perfil e o inspetor

No Conjunto de Ferramentas de Realidade Mista, os fornecedores de dados são configurados utilizando perfis.

Definir o perfil

Os conteúdos de perfil devem espelhar as propriedades acessíveis do fornecedor de dados (ex: intervalo de atualização). Todas as propriedades configuráveis do utilizador definidas em cada interface devem ser contidas com o perfil.

As classes base são encorajadas se um novo fornecedor de dados alargar um fornecedor existente. Por exemplo, o SpatialObjectMeshObserverProfile estende o para permitir que os MixedRealitySpatialAwarenessMeshObserverProfile clientes forneçam um modelo 3D para serem usados como dados ambientais.

[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 na classe de perfil para permitir que os clientes criem uma instância de perfil utilizando o menu CreateAssetMenu>>>>>>

Implementar o inspetor

Os inspetores de perfil são a interface do utilizador para configurar e visualizar conteúdos de perfil. Cada inspetor de perfis deve alargar a BaseMixedRealityToolkitConfigurationProfileInspector classe.

O CustomEditor atributo informa a Unidade do tipo de ativo a que o inspetor se aplica.

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

Criar definição de montagem(s)

O Mixed Reality Toolkit utiliza ficheiros de montagem(.asmdef)para especificar dependências entre componentes, bem como para ajudar a Unidade na redução do tempo de compilação.

Recomenda-se que os ficheiros de definição de montagem sejam criados para todos os fornecedores de dados e seus componentes editoriais.

Utilizando a estrutura da pasta no exemplo anterior, existiriam dois ficheiros .asmdef para o fornecedor de dados ContosoSpatialAwareness.

A primeira definição de montagem destina-se ao fornecedor de dados. Para este exemplo, será chamado de ConsciênciaPatial Contoso e ficará localizado na pasta contosoSpatialAwareness do exemplo. Esta definição de montagem deve especificar uma dependência do Microsoft.MixedReality.Toolkit e de quaisquer outros conjuntos de que dependa.

A definição de montagem do ContosoInputEditor especificará o inspetor de perfil e qualquer código específico do editor. Este ficheiro deve estar na pasta raiz do código editor. Neste exemplo, o ficheiro estará localizado na pasta ContosoSpatialAwareness\Editor. Esta definição de montagem conterá uma referência ao conjunto de consciências espaciais ContosoS, bem como:

  • Microsoft.MixedReality.Toolkit
  • Microsoft.MixedReality.Toolkit.Editor.Inspetores
  • Microsoft.MixedReality.Toolkit.Editor.Utilities

Registar o fornecedor de dados

Uma vez criado, o fornecedor de dados pode ser registado no sistema de Sensibilização Espacial a utilizar na aplicação.

Selecionando o observador de malha de objeto espacial

Embalagem e distribuição

Os fornecedores de dados que são distribuídos como componentes de terceiros têm os detalhes específicos da embalagem e distribuição deixadas à preferência do desenvolvedor. Provavelmente, a solução mais comum será gerar uma .unidadepackage e distribuir através da Unity Asset Store.

Se um fornecedor de dados for submetido e aceite como parte do pacote Microsoft Mixed Reality Toolkit, a equipa mrtk da Microsoft irá empacotá-lo e distribuí-lo como parte das ofertas mrtk.

Ver também