El sistema de seguimiento de manos usa las palma y los dedos de una persona como entrada. Los datos sobre la posición y rotación de cada dedo, toda la palma y los gestos de mano están disponibles. A partir de Unreal 4.26, el seguimiento de manos se basa en el complemento Unreal HeadMountedDisplay y usa una API común en todas las plataformas y dispositivos XR. La funcionalidad es la misma para los sistemas Windows Mixed Reality y OpenXR.
Posición de mano
La posición de mano le permite realizar un seguimiento y usar las manos y los dedos de los usuarios como entrada, a las que se puede acceder tanto en Planos técnicos como en C++. La API de Unreal envía los datos como un sistema de coordenadas, con tics sincronizados con el motor de Unreal.
La jerarquía se describe mediante EHandKeypoint enumeración:
Puede obtener todos estos datos de las manos de un usuario mediante la función Obtener datos del controlador de movimiento. Esa función devuelve una estructura XRMotionControllerData . A continuación se muestra un script de plano técnico de ejemplo que analiza la estructura XRMotionControllerData para obtener ubicaciones de unión manual y dibuja un sistema de coordenadas de depuración en la ubicación de cada articulación.
Es importante comprobar si la estructura es válida y que es una mano. De lo contrario, puede obtener un comportamiento indefinido en el acceso a posiciones, rotaciones y matrices radii.
La EWMRHandKeypoint enumeración describe la jerarquía ósea de la mano. Puede encontrar cada punto de clave de mano que se muestra en los planos técnicos:
La enumeración completa de C++ se muestra a continuación:
Puede usar GetHandJointTransform para devolver datos espaciales desde la mano. Los datos actualizan cada fotograma, pero si está dentro de un marco, los valores devueltos se almacenan en caché. No se recomienda tener una lógica pesada en esta función por motivos de rendimiento.
Este es un desglose de los parámetros de función de GetHandJointTransform:
Mano : puede ser los usuarios a la izquierda o a la derecha.
Punto clave: el hueso de la mano.
Transformación : coordenadas y orientación de la base ósea. Puede solicitar la base del siguiente hueso para obtener los datos de transformación para el final de un hueso. Un hueso tip especial da fin de distal.
**Radio: radio de la base del hueso.
**Valor devuelto: true si se realiza un seguimiento del hueso de este fotograma, false si no se realiza el seguimiento del hueso.
Animación hand Live Link
Las posturas de mano se exponen a animation mediante el complemento Live Link.
Si los complementos de Windows Mixed Reality y Live Link están habilitados:
Seleccione Window > Live Link para abrir la ventana del editor de Live Link.
Seleccione Origen y habilite origen de seguimiento de manos de Windows Mixed Reality.
Después de habilitar el origen y abrir un recurso de animación, expanda la sección Animación de la pestaña Vista previa escena también vea opciones adicionales.
La jerarquía de animación de mano es la misma que en EWMRHandKeypoint. La animación se puede reasignar mediante WindowsMixedRealityHandTrackingLiveLinkRemapAsset:
Para obtener mallas de mano como geometría rastreada en OpenXR, es necesario llamar a Set Use Hand Mesh with Enabled Tracking Geometry (Establecer uso de malla de mano con geometría de seguimiento habilitada).
Para habilitar ese modo, debe llamar a Set Use Hand Mesh with Enabled Tracking Geometry (Establecer usar malla de mano con geometría de seguimiento habilitada):
Nota:
No es posible habilitar ambos modos al mismo tiempo. Si habilita una, la otra se deshabilita automáticamente.
Acceso a datos de malla de mano
Para poder acceder a los datos de malla de mano, deberá hacer lo siguiente:
Seleccione el recurso ARSessionConfig, expanda la configuración de AR Configuración -> Asignación mundial y active Generar datos de malla a partir de geometría rastreada.
A continuación se muestran los parámetros de malla predeterminados:
Usar datos de malla para la oclusión
Generar colisión para datos de malla
Generar malla de navegación para datos de malla
Representación de datos de malla en Wireframe: parámetro de depuración que muestra la malla generada
Estos valores de parámetro se usan como valores predeterminados de malla de asignación espacial y malla manual. Puede cambiarlos en cualquier momento en planos técnicos o código para cualquier malla.
Referencia de API de C++
Use EEARObjectClassification para buscar valores de malla manual en todos los objetos rastreables.
enum class EARObjectClassification : uint8
{
// Other types
HandMesh,
};
Se llama a los siguientes delegados cuando el sistema detecta cualquier objeto rastreable, incluida una malla de mano.
class FARSupportInterface
{
public:
// Other params
DECLARE_AR_SI_DELEGATE_FUNCS(OnTrackableAdded)
DECLARE_AR_SI_DELEGATE_FUNCS(OnTrackableUpdated)
DECLARE_AR_SI_DELEGATE_FUNCS(OnTrackableRemoved)
};
Asegúrese de que los controladores delegados siguen la firma de función siguiente:
Para trabajar con mallas de mano en planos técnicos:
Agregar un componente ARTrackableNotify a un actor de plano técnico
Vaya al panel Detalles y expanda la sección Eventos .
Sobrescribir al agregar, actualizar o quitar geometría con seguimiento con los siguientes nodos en el gráfico de eventos:
Visualización de malla de mano en OpenXR
La manera recomendada de visualizar malla manual es usar el complemento XRVisualization de Epic junto con el complemento De Microsoft OpenXR.
A continuación, en el editor de planos técnicos, debe usar la función Set Use Hand Mesh del complemento Microsoft OpenXR con Enabled XRVisualization como parámetro:
Para administrar el proceso de representación, debe usar Render Motion Controller desde XRVisualization:
El resultado es:
Si necesita algo más complicado, como dibujar una malla de mano con un sombreador personalizado, debe obtener las mallas como una geometría de seguimiento.
Haces de mano
Obtener posición de mano funciona para interacciones cercanas, como agarrar objetos o presionar botones. Sin embargo, a veces necesita trabajar con hologramas que están lejos de los usuarios. Esto se puede lograr con rayos de mano, que se pueden usar como dispositivos apuntadores en C++ y Planos técnicos. Puede dibujar un rayo de la mano a un punto lejano y, con alguna ayuda del seguimiento de rayos de Unreal, seleccione un holograma que, de lo contrario, estaría fuera de alcance.
Importante
Dado que todos los resultados de la función cambian cada fotograma, todos se pueden llamar. Para obtener más información sobre las funciones puras e impures o invocables, consulte guid de usuario de Blueprint en las funciones.
Para obtener los datos de los rayos de mano, debe usar la función Obtener datos del controlador de movimiento de la sección anterior. La estructura devuelta contiene dos parámetros que puede usar para crear un rayo de mano: posición de objetivo y rotación de objetivo. Estos parámetros forman un rayo dirigido por el codo. Debe tomarlos y encontrar un holograma al que apunta.
A continuación se muestra un ejemplo de determinar si un rayo de mano alcanza un Widget y establece un resultado de posicionamiento personalizado:
Para usar Los rayos de mano en planos técnicos, busque cualquiera de las acciones en Windows Mixed Reality HMD:
Para acceder a ellos en C++, incluya WindowsMixedRealityFunctionLibrary.h en la parte superior del archivo de código que llama.
Enum
También tiene acceso a los casos de entrada en EHMDInputControllerButtons, que se pueden usar en Planos técnicos:
Para el acceso en C++, use la EHMDInputControllerButtons clase enum:
enum class EHMDInputControllerButtons : uint8
{
Select,
Grasp,
//......
};
A continuación se muestra un desglose de los dos casos de enumeración aplicables:
Seleccionar : evento Select desencadenado por el usuario.
Se desencadena en HoloLens 2 pulsando en el aire, mirando y confirmando, o diciendo "Seleccionar" con la entrada de voz habilitada.
Agarre : evento De agarre desencadenado por el usuario.
Se desencadena en HoloLens 2 cerrando los dedos del usuario en un holograma.
Puede acceder al estado de seguimiento de la malla de mano en C++ a través de la EHMDTrackingStatus enumeración que se muestra a continuación:
enum class EHMDTrackingStatus : uint8
{
NotTracked,
//......
Tracked
};
A continuación se muestra un desglose de los dos casos de enumeración aplicables:
NotTracked : la mano no está visible
Seguimiento: la mano está totalmente rastreada
Estructura
La estructura PointerPoseInfo puede proporcionarle información sobre los siguientes datos de la mano:
Origen : origen de la mano
Dirección : dirección de la mano
Arriba : vector hacia arriba de la mano
Orientación : cuaternión de orientación
Estado de seguimiento: estado de seguimiento actual
Puede acceder a la estructura PointerPoseInfo a través de Planos técnicos, como se muestra a continuación:
HoloLens 2 realiza un seguimiento de los gestos espaciales, lo que significa que puede capturar esos gestos como entrada. El seguimiento de gestos se basa en un modelo de suscripción. Debe usar la función "Configurar gestos" para indicar al dispositivo qué gestos desea realizar un seguimiento. Puede encontrar más detalles sobre los gestos en el documento Uso básico de HoloLens 2.
A continuación, debe agregar código para suscribirse a los siguientes eventos:
OpenXR
En OpenXR, se realiza un seguimiento de los eventos de gestos a través de la canalización de entrada. Con la interacción con la mano, el dispositivo puede reconocer automáticamente los gestos pulsar y mantener presionado, pero no los demás. Se denominan asignaciones select y grip de OpenXRMsftHandInteraction. No es necesario habilitar la suscripción; debe declarar los eventos en Project Configuración/Engine/Input, de la siguiente manera:
Puede encontrar la función Blueprint en en Entrada espacial de Windows Mixed Reality y la función de C++ agregando WindowsMixedRealitySpatialInputFunctionLibrary.h en el archivo de código de llamada.
Puede habilitar y deshabilitar la captura de gestos con la CaptureGestures función . Cuando un gesto habilitado desencadena eventos de entrada, la función devuelve true si la captura de gestos se realizó correctamente y false si se produce un error.
Si sigue el recorrido de desarrollo de Unreal que hemos diseñado, significa que ya se encuentra en proceso de explorar los bloques de compilación principales de MRTK. Desde aquí, puede continuar con el siguiente bloque de compilación: