Nota:
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
El sistema de reconocimiento espacial es un sistema extensible para proporcionar a las aplicaciones datos sobre entornos del mundo real. Para agregar compatibilidad con una nueva plataforma de hardware o una nueva forma de datos de reconocimiento espacial, puede ser necesario un proveedor de datos personalizado.
En este artículo se describe cómo crear proveedores de datos personalizados, también denominados observadores espaciales, para el sistema de reconocimiento espacial. El código de ejemplo que se muestra aquí procede de la implementación de la SpatialObjectMeshObserver clase, que resulta útil para cargar datos de malla 3D en el editor.
Nota:
El código fuente completo usado en este ejemplo se puede encontrar en la Assets/MRTK/Providers/ObjectMeshObserver carpeta .
Estructura de espacios de nombres y carpetas
Los proveedores de datos se pueden distribuir de dos maneras:
- Complementos de terceros
- Parte del kit de herramientas de Microsoft Mixed Reality
El proceso de aprobación de envíos de nuevos proveedores de datos a MRTK variará caso por caso y se comunicará en el momento de la propuesta inicial. Las propuestas se pueden enviar creando un nuevo problema de tipo de solicitud de características.
Complemento de terceros
Namespace
Los proveedores de datos deben tener un espacio de nombres para mitigar posibles colisiones de nombres. Se recomienda que el espacio de nombres incluya los siguientes componentes.
- Nombre de la empresa que produce el complemento
- Área de característica
Por ejemplo, un proveedor de datos de Reconocimiento espacial creado y enviado por la empresa Contoso puede ser "Contoso.MixedReality.Toolkit.SpatialAwareness".
Estructura de carpetas
Se recomienda que el código fuente de los proveedores de datos se retrase en una jerarquía de carpetas, como se muestra en la siguiente imagen.
Donde la carpeta ContosoSpatialAwareness contiene la implementación del proveedor de datos, la carpeta Editor contiene el inspector (y cualquier otro código específico del editor de Unity) y la carpeta Perfiles contiene uno o varios objetos de script de perfil creados previamente.
Envío de MRTK
Namespace
Si se envía un proveedor de datos del sistema de reconocimiento espacial al repositorio de Mixed Reality Toolkit, el espacio de nombres debe comenzar por Microsoft.MixedReality.Toolkit (por ejemplo: Microsoft.MixedReality.Toolkit.SpatialObjectMeshObserver)
y el código debe encontrarse en una carpeta debajo de MRTK/Providers (por ejemplo, MRTK/Providers/ObjectMeshObserver).
Estructura de carpetas
Todo el código debe encontrarse en una carpeta debajo de MRTK/Providers (por ejemplo: MRTK/Providers/ObjectMeshObserver).
Definición del objeto de datos espaciales
El primer paso para crear un proveedor de datos de reconocimiento espacial es determinar el tipo de datos (por ejemplo, mallas o planos) que proporcionará a las aplicaciones.
Todos los objetos de datos espaciales deben implementar la IMixedRealitySpatialAwarenessObject interfaz.
La base Mixed Reality Toolkit proporciona los siguientes objetos espaciales que se pueden usar o ampliar en nuevos proveedores de datos.
Implementación del proveedor de datos
Especificación de la herencia de la interfaz o de la clase base
Todos los proveedores de datos de Reconocimiento espacial deben implementar la IMixedRealitySpatialAwarenessObserver interfaz, que especifica la funcionalidad mínima requerida por el sistema de reconocimiento espacial. La base MRTK incluye la BaseSpatialObserver clase que proporciona una implementación predeterminada de esta funcionalidad necesaria.
public class SpatialObjectMeshObserver :
BaseSpatialObserver,
IMixedRealitySpatialAwarenessMeshObserver,
IMixedRealityCapabilityCheck
{ }
Nota:
La IMixedRealityCapabilityCheck clase usa la SpatialObjectMeshObserver interfaz para indicar que proporciona compatibilidad con la funcionalidad SpatialAwarenessMesh.
Aplicar el atributo MixedRealityDataProvider
Un paso clave para crear un proveedor de datos de Reconocimiento espacial es aplicar el MixedRealityDataProvider atributo a la clase . Este paso permite establecer el perfil predeterminado y las plataformas para el proveedor de datos, cuando se seleccionan en el perfil de reconocimiento espacial, así como el nombre, la ruta de acceso de la carpeta, etc.
[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
{ }
Implementación de los métodos IMixedRealityDataProvider
Una vez definida la clase, el siguiente paso es proporcionar la implementación de la IMixedRealityDataProvider interfaz.
Nota:
La BaseSpatialObserver clase, a través de la BaseService clase , proporciona solo una implementación vacía para IMixedRealityDataProvider los métodos. Los detalles de estos métodos suelen ser específicos del proveedor de datos.
Los métodos que debe implementar el proveedor de datos son:
Destroy()Disable()Enable()Initialize()Reset()Update()
Implementación de la lógica del proveedor de datos
El siguiente paso consiste en agregar la lógica del proveedor de datos mediante la implementación de la interfaz específica del proveedor de datos, por ejemplo IMixedRealitySpatialAwarenessMeshObserver. Esta parte del proveedor de datos suele ser específica de la plataforma.
Notificaciones de cambio de observación
Para permitir que las aplicaciones respondan a los cambios en la comprensión del entorno del dispositivo, el proveedor de datos genera eventos de notificación como se define en la IMixedRealitySpatialAwarenessObservationtHandler<T> interfaz.
OnObservationAdded()OnObservationRemoved()OnObservationUpdated()
El código siguiente de los ejemplos muestra el SpatialObjectMeshObserver aumento y el evento cuando se agregan datos de malla.
// 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:
La SpatialObjectMeshObserver clase no genera OnObservationUpdated eventos, ya que el modelo 3D solo se carga una vez. La implementación de la WindowsMixedRealitySpatialMeshObserver clase proporciona un ejemplo de generación de un OnObservationUpdated evento para una malla observada.
Incorporación de instrumentación de Unity Profiler
El rendimiento es fundamental en las aplicaciones de realidad mixta. Cada componente agrega cierta cantidad de sobrecarga para la que las aplicaciones deben tener en cuenta. Para ello, es importante que todos los proveedores de datos de reconocimiento espacial contengan instrumentación de Unity Profiler en bucle interno y rutas de acceso de código que se usan con frecuencia.
Se recomienda implementar el patrón utilizado por MRTK al instrumentar proveedores 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:
El nombre usado para identificar el marcador del generador de perfiles es arbitrario. MRTK usa el patrón siguiente.
"[product] className.methodName : nota opcional"
Se recomienda que los proveedores de datos personalizados sigan un patrón similar para ayudar a simplificar la identificación de componentes y métodos específicos al analizar seguimientos.
Crear el perfil y el inspector
En Mixed Reality Toolkit, los proveedores de datos se configuran mediante perfiles.
Definición del perfil
El contenido del perfil debe reflejar las propiedades accesibles del proveedor de datos (por ejemplo, intervalo de actualización). Todas las propiedades configurables por el usuario definidas en cada interfaz deben estar contenidas con el perfil.
Se recomiendan las clases base si un nuevo proveedor de datos extiende un proveedor existente. Por ejemplo, extiende SpatialObjectMeshObserverProfile para permitir que los MixedRealitySpatialAwarenessMeshObserverProfile clientes proporcionen un modelo 3D que se usará como datos del entorno.
[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;
}
El CreateAssetMenu atributo se puede aplicar a la clase de perfil para permitir a los clientes crear una instancia de perfil mediante el menú Crear>recursos> Mixed RealityPerfilesdel kit de herramientas>.
Implementación del inspector
Los inspectores de perfiles son la interfaz de usuario para configurar y ver el contenido del perfil. Cada inspector de perfil debe ampliar la BaseMixedRealityToolkitConfigurationProfileInspector clase .
El CustomEditor atributo informa a Unity del tipo de recurso al que se aplica el inspector.
[CustomEditor(typeof(SpatialObjectMeshObserverProfile))]
public class SpatialObjectMeshObserverProfileInspector : BaseMixedRealityToolkitConfigurationProfileInspector
{ }
Creación de definiciones de ensamblado
Mixed Reality Toolkit usa archivos de definición de ensamblado (.asmdef) para especificar dependencias entre componentes, así como para ayudar a Unity a reducir el tiempo de compilación.
Se recomienda crear archivos de definición de ensamblado para todos los proveedores de datos y sus componentes de editor.
Con la estructura de carpetas del ejemplo anterior, habría dos archivos .asmdef para el proveedor de datos ContosoSpatialAwareness.
La primera definición de ensamblado es para el proveedor de datos. En este ejemplo, se llamará ContosoSpatialAwareness y se ubicará en la carpeta ContosoSpatialAwareness del ejemplo. Esta definición de ensamblado debe especificar una dependencia de Microsoft.MixedReality.Toolkit y de cualquier otro ensamblado del que dependa.
La definición del ensamblado ContosoInputEditor especificará el inspector de perfiles y cualquier código específico del editor. Este archivo debe encontrarse en la carpeta raíz del código del editor. En este ejemplo, el archivo se ubicará en la carpeta ContosoSpatialAwareness\Editor . Esta definición de ensamblado contendrá una referencia al ensamblado ContosoSpatialAwareness, así como:
- Microsoft.MixedReality.Toolkit
- Microsoft.MixedReality.Toolkit.Editor.Inspectors
- Microsoft.MixedReality.Toolkit.Editor.Utilities
Registro del proveedor de datos
Una vez creado, el proveedor de datos se puede registrar con el sistema de reconocimiento espacial que se usará en la aplicación.
Empaquetado y distribución
Los proveedores de datos que se distribuyen como componentes de terceros tienen los detalles específicos del empaquetado y la distribución que el desarrollador prefiere. Probablemente, la solución más común será generar un paquete .unity y distribuirlo a través de La Tienda de recursos de Unity.
Si se envía y acepta un proveedor de datos como parte del paquete microsoft Mixed Reality Toolkit, el equipo de Microsoft MRTK lo empaquetará y distribuirá como parte de las ofertas de MRTK.
Vea también
- Sistema de reconocimiento espacial
-
IMixedRealitySpatialAwarenessObjectInterfaz -
BaseSpatialAwarenessObjectClase -
SpatialAwarenessMeshObjectClase -
SpatialAwarenessPlanarObjectClase -
IMixedRealitySpatialAwarenessObserverInterfaz -
BaseSpatialObserverClase -
IMixedRealitySpatialAwarenessMeshObserverInterfaz -
IMixedRealityDataProviderInterfaz -
IMixedRealityCapabilityCheckInterfaz