Criar um fornecedor de dados do sistema de sensibilização espacial – MRTK2
O sistema de Sensibilização Espacial é um sistema extensível para fornecer às aplicações dados sobre ambientes do mundo real. Para adicionar suporte para uma nova plataforma de hardware ou uma nova forma de dados de Sensibilização Espacial, pode ser necessário um fornecedor de dados personalizado.
Este artigo descreve como criar fornecedores de dados personalizados, também denominados Observadores Espaciais, para o sistema de Sensibilização Espacial. O código de exemplo apresentado aqui é da implementação da SpatialObjectMeshObserver
classe, que é útil para carregar dados de malha 3D no editor.
Nota
O código fonte completo utilizado neste exemplo pode ser encontrado na Assets/MRTK/Providers/ObjectMeshObserver
pasta.
Espaço de nomes e estrutura de pastas
Os fornecedores de dados podem ser distribuídos de uma de duas formas:
- Suplementos de terceiros
- Parte do Microsoft Mixed Reality Toolkit
O processo de aprovação das submissões de novos fornecedores de dados ao MRTK variará caso a caso e será comunicado no momento da proposta inicial. As propostas podem ser submetidas ao criar um novo problema de tipo de Pedido de Funcionalidade.
Suplemento de terceiros
Espaço de Nomes
Os fornecedores de dados têm de ter um espaço de nomes 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 suplemento
- Área de funcionalidades
Por exemplo, um fornecedor de dados de Sensibilização Espacial criado e enviado pela empresa Contoso pode ser "Contoso.MixedReality.Toolkit.SpatialAwareness".
Estrutura de pastas
Recomenda-se que o código fonte dos fornecedores de dados seja apresentado numa hierarquia de pastas, conforme mostrado na imagem seguinte.
Quando a pasta ContosoSpatialAwareness contém a implementação do fornecedor de dados, a pasta Editor contém o inspector (e qualquer outro código específico do editor do Unity) e a pasta Perfis contém um ou mais objetos scriptable de perfil pré-criados.
Submissão do MRTK
Espaço de Nomes
Se um fornecedor de dados do sistema de deteção espacial estiver a ser submetido para o repositório do Mixed Reality Toolkit, o espaço de nomes tem de começar por Microsoft.MixedReality.Toolkit (ex: Microsoft.MixedReality.Toolkit.SpatialObjectMeshObserver)
e o código deve estar localizado numa pasta abaixo de MRTK/Providers (por exemplo: MRTK/Providers/ObjectMeshObserver).
Estrutura de pastas
Todo o código deve estar localizado numa pasta abaixo de MRTK/Providers (por exemplo: MRTK/Providers/ObjectMeshObserver).
Definir o objeto de dados espaciais
O primeiro passo na criação de um fornecedor de dados de Sensibilização Espacial é determinar o tipo de dados (por exemplo: malhas ou planos) que irá fornecer às aplicações.
Todos os objetos de dados espaciais têm de implementar a IMixedRealitySpatialAwarenessObject
interface.
A base Mixed Reality Toolkit fornece os seguintes objetos espaciais que podem ser utilizados ou expandidos em novos fornecedores de dados.
Implementar o fornecedor de dados
Especificar a herança da interface e/ou da classe base
Todos os fornecedores de dados de Sensibilização Espacial têm de implementar a IMixedRealitySpatialAwarenessObserver
interface, que especifica a funcionalidade mínima exigida pelo sistema de Sensibilização Espacial. A base MRTK inclui a BaseSpatialObserver
classe que fornece uma implementação predefinida desta funcionalidade necessária.
public class SpatialObjectMeshObserver :
BaseSpatialObserver,
IMixedRealitySpatialAwarenessMeshObserver,
IMixedRealityCapabilityCheck
{ }
Nota
A IMixedRealityCapabilityCheck
interface é utilizada pela SpatialObjectMeshObserver
classe para indicar que fornece suporte para a capacidade 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 e as plataformas predefinidos para o fornecedor de dados, quando selecionados no perfil de Sensibilizaçã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
Assim que a classe tiver sido definida, o próximo passo é fornecer a implementação da IMixedRealityDataProvider
interface.
Nota
A BaseSpatialObserver
classe, 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 ao implementar a interface de fornecedor de dados específica, por exemplo IMixedRealitySpatialAwarenessMeshObserver
. Normalmente, esta parte do fornecedor de dados será 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 ambiente pelo dispositivo, o fornecedor de dados gera eventos de notificação conforme definido na IMixedRealitySpatialAwarenessObservationtHandler<T>
interface.
OnObservationAdded()
OnObservationRemoved()
OnObservationUpdated()
O código seguinte dos SpatialObjectMeshObserver
exemplos demonstra a criaçã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 gera OnObservationUpdated
eventos, uma vez que o modelo 3D só é carregado uma vez. A implementação na WindowsMixedRealitySpatialMeshObserver
classe fornece um exemplo de criação de um OnObservationUpdated
evento para uma malha observada.
Adicionar instrumentação do Unity Profiler
O desempenho é fundamental em aplicações de realidade mista. Cada componente adiciona alguma quantidade de sobrecarga para as aplicações que têm de ter conta. Para tal, é importante que todos os fornecedores de dados de sensibilização espacial contenham instrumentação do Unity Profiler em ciclo interno e caminhos de código frequentemente utilizados.
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 utilizado para identificar o marcador do gerador de perfis é arbitrário. O MRTK utiliza o seguinte padrão.
"[product] 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 rastreios.
Criar o perfil e o inspetor
No Mixed Reality Toolkit, os fornecedores de dados são configurados com perfis.
Definir o perfil
Os conteúdos do perfil devem espelhar as propriedades acessíveis do fornecedor de dados (por exemplo, intervalo de atualização). Todas as propriedades configuráveis do utilizador definidas em cada interface devem ser contidas no perfil.
As classes base são incentivadas se um novo fornecedor de dados expandir um fornecedor existente. Por exemplo, o SpatialObjectMeshObserverProfile
expande o para permitir que os MixedRealitySpatialAwarenessMeshObserverProfile
clientes forneçam um modelo 3D para ser utilizado 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 com o menu Criar>Recursos> Mixed RealityPerfis do Toolkit>.
Implementar o inspetor
Os inspetores de perfis são a interface de utilizador para configurar e visualizar conteúdos de perfil. Cada inspetor de perfis deve expandir a BaseMixedRealityToolkitConfigurationProfileInspector
classe.
O CustomEditor
atributo informa o Unity do tipo de recurso a que o inspector se aplica.
[CustomEditor(typeof(SpatialObjectMeshObserverProfile))]
public class SpatialObjectMeshObserverProfileInspector : BaseMixedRealityToolkitConfigurationProfileInspector
{ }
Criar definições de assemblagem
Mixed Reality Toolkit utiliza ficheiros de definição de assemblagem (.asmdef) para especificar dependências entre componentes, bem como para ajudar o Unity a reduzir o tempo de compilação.
Recomenda-se que os ficheiros de definição de assemblagem sejam criados para todos os fornecedores de dados e respetivos componentes de editor.
Ao utilizar a estrutura de pastas no exemplo anterior, haveria dois ficheiros .asmdef para o fornecedor de dados ContosoSpatialAwareness.
A primeira definição de assemblagem destina-se ao fornecedor de dados. Para este exemplo, será denominado Deteção ContosoSpatial e estará localizado na pasta ContosoSpatialAwareness do exemplo. Esta definição de assemblagem tem de especificar uma dependência em Microsoft.MixedReality.Toolkit e em quaisquer outras assemblagens de que dependa.
A definição de assemblagem ContosoInputEditor especificará o inspetor de perfis e qualquer código específico do editor. Este ficheiro tem de estar localizado na pasta raiz do código do editor. Neste exemplo, o ficheiro estará localizado na pasta ContosoSpatialAwareness\Editor . Esta definição de assemblagem irá conter uma referência à assemblagem ContosoSpatialAwareness, bem como:
- Microsoft.MixedReality.Toolkit
- Microsoft.MixedReality.Toolkit.Editor.Inspectors
- Microsoft.MixedReality.Toolkit.Editor.Utilities
Registar o fornecedor de dados
Depois de criado, o fornecedor de dados pode ser registado no sistema de Sensibilização Espacial para ser utilizado na aplicação.
Empacotamento e distribuição
Os fornecedores de dados distribuídos como componentes de terceiros têm os detalhes específicos de empacotamento e distribuição deixados à preferência do programador. Provavelmente, a solução mais comum será gerar um .unitypackage e distribuir através do Unity Asset Store.
Se um fornecedor de dados for submetido e aceite como parte do pacote Microsoft Mixed Reality Toolkit, a equipa do Microsoft MRTK irá empacotá-lo e distribuí-lo como parte das ofertas do MRTK.
Ver também
- Sistema de sensibilização espacial
IMixedRealitySpatialAwarenessObject
interface- Classe
BaseSpatialAwarenessObject
- Classe
SpatialAwarenessMeshObject
- Classe
SpatialAwarenessPlanarObject
IMixedRealitySpatialAwarenessObserver
interface- Classe
BaseSpatialObserver
IMixedRealitySpatialAwarenessMeshObserver
interfaceIMixedRealityDataProvider
interfaceIMixedRealityCapabilityCheck
interface