Reastreo de manos

Nota

Solo está disponible en las versiones 1.1.0 y posteriores del complemento de OpenXR.

La API de seguimiento de manos fue originalmente agregada a OpenXR por Microsoft para hacer que la información de seguimiento de las manos y los dedos de los usuarios esté disponible para el cliente de XR. La API proporciona datos de posición para todos los huesos de las manos de los jugadores, pero deja cierto margen para la interpretación en cómo se implementa la API por parte del tiempo de ejecución de XR.

En SteamVR, se agregó soporte basado en el sistema de seguimiento de manos existente de Valve, que también proporciona datos completamente articulados de los huesos extrapolados a partir de las entradas del controlador y los sensores de proximidad si el seguimiento de manos no es compatible de forma nativa en el sistema utilizado.

Meta agregó soporte para esta API a su tiempo de ejecución móvil de OpenXR, vinculado a su funcionalidad existente de seguimiento de manos en el Quest. Ten en cuenta que debes habilitar el seguimiento de manos en la configuración de exportación para que esto esté activo. La API de seguimiento de manos solo se utiliza para el seguimiento puro de manos, no se presenta ningún dato de posición cuando se usan controladores.

Nota

Al usar la API de seguimiento de manos, es importante tener en cuenta las capacidades de la plataforma de destino. Esto puede mejorar con el tiempo a medida que se proporcionen comentarios al grupo de trabajo de OpenXR.

La API de seguimiento de manos define la estructura ósea a la que todos los tiempos de ejecución XR deben adherirse, sin embargo, no dicta la orientación de los huesos en reposo ni ningún requisito de tamaño.

../../../_images/hand_tracking_bones.png

Imagen cortesía de la especificación OpenXR de Khronos.

La API de seguimiento de manos es independiente del sistema de acciones y no utiliza sus poses. Los datos de seguimiento de manos se proporcionan internamente en el espacio global (relativo al punto de origen del volumen de seguimiento), por lo que los nodos de seguimiento de manos deben tener el nodo ARVROrigin como su padre, no un nodo ARVRController.

El complemento expone la API de seguimiento de manos como dos sistemas separados. Uno que actualiza las posiciones de un árbol de nodos y otro que actualiza los huesos de un Skeleton para que se pueda utilizar la deformación de malla.

Nodos basados en el rastreo de manos

Esta implementación es la más versátil, ya que no requiere ningún conocimiento del modelo de mano en la posición de reposo. Es importante tener en cuenta que el complemento incluye dos escenas de ejemplo llamadas left_hand_nodes.tscn y right_hand_nodes.tscn, que se pueden instanciar como nodos secundarios del nodo ARVROrigin. Estas escenas contienen lógica para redimensionar automáticamente las mallas utilizadas para que se ajusten al tamaño de los datos de los huesos proporcionados.

../../../_images/arvr_nodes_example.png

En la raíz de esta escena hay un nodo Spatial que tiene asignado el script config/OpenXRHand.gdns. Esta clase del complemento posicionará el nodo espacial en la base de la mano (consultar la imagen de la palma mencionada anteriormente) y actualizará la posición y orientación de sus hijos.

../../../_images/arvr_openxr_hand.png

Hay dos propiedades aquí:

  • Hand identifica si estamos rastreando la posición de la mano izquierda o la mano derecha.

  • Motion Range solo está disponible en SteamVR y limita cuán lejos puede cerrarse la mano. Esto solo se utiliza en conjunto con el seguimiento inferido de las manos basado en la entrada del controlador.

Nuestro nodo espacial necesita una serie de nodos secundarios con nombres codificados que serán actualizados por nuestro sistema de seguimiento de manos. El tipo de nodos no es importante, nuestro script de ejemplo utiliza nodos MeshInstance para visualizar los huesos también.

../../../_images/hand_tracking_nodes.png

Primero encontramos el nodo secundario Wrist, debajo de este hay nodos para cada dedo. Cada nodo comienza con el nombre del dedo seguido del nombre del hueso. Los nombres de los dedos son Thumb, Index, Middle, Ring y Little. Los nombres de los huesos son Metacarpal, Proximal, Intermediate, Distal y Tip. Por lo tanto, IndexDistal es el hueso distal del dedo índice.

Nota

¡El pulgar es el único dedo que no tiene un hueso intermedio!

Las relaciones padre-hijo de estos nodos son importantes y la mano solo se verá correctamente si se sigue esta estructura exactamente. Cabe destacar que agregar nodos adicionales no es un problema, las escenas de ejemplo agregan varios huesos adicionales para completar el aspecto de la mano. También es importante mencionar que las escenas de ejemplo tienen scripts adjuntos al nodo de la muñeca que actualizan el tamaño y las posiciones de estos nodos adicionales.

Rastreo de manos basado en esqueleto

El segundo método compatible con el complemento OpenXR es exponer los datos de los huesos como un nodo Skeleton. En este caso, la solución se divide en dos clases, una para ubicar la mano en el espacio y la segunda para animar el esqueleto mencionado actualizando las poses de los huesos del esqueleto.

Este enfoque permite deformar una malla, lo que es una solución visualmente más atractiva; sin embargo, las diferencias en la implementación entre las plataformas pueden plantear algunos problemas.

Nota

Microsoft ha agregado otra API a OpenXR que permite obtener una malla de mano con piel correctamente animada; sin embargo, dado que actualmente son la única plataforma que admite esta API, aún no ha sido agregada al complemento.

En este momento, el complemento solo expone los datos tal como los proporciona el tiempo de ejecución de OpenXR. El complemento tiene una implementación de ejemplo basada en mallas que Valve ha puesto a disposición públicamente; sin embargo, estas funcionan de manera más confiable cuando se utilizan junto con SteamVR. Estas escenas son scenes/left_hand_mesh.tscn y scenes/right_hand_mesh.tscn, y pueden ser agregadas como nodos secundarios al nodo ARVROrigin.

../../../_images/arvr_mesh_example.png

A continuación se presenta una descripción general de los pasos necesarios para implementar su propia versión.

Nota

La mejor manera de implementar esta lógica es pedir a un artista que modele una mano en un software 3D utilizando las dimensiones reales de las manos y crear una armadura para la mano que siga la estructura de huesos tal como lo dicta la especificación de OpenXR en la imagen al principio de este artículo. Al realizar el "skinning" se debe tener especial cuidado, teniendo en cuenta que si el seguimiento completo de la mano está disponible, la distancia entre las articulaciones se determinará por el tamaño real de la mano del jugador y, por lo tanto, puede ser diferente al modelo 3D. Después de importar el modelo a Godot, puede agregar los scripts necesarios para que todo funcione correctamente.

Para colocar la malla de la mano en el espacio, es necesario agregar un nodo como hijo del nodo ARVROrigin. Este nodo debe tener el script config/OpenXRPose.gdns adjunto. Al importar un archivo 3D, puede agregar este script al nodo raíz del modelo importado.

El script OpenXRPose no solo es utilizado por la lógica de la mano, sino que también expone otras ubicaciones de poses configuradas en el mapa de acciones.

../../../_images/arvr_openxr_pose.png

Las siguientes propiedades pueden establecerse en este nodo:

  • Invisible If Inactive habilita la lógica que hará que este nodo se vuelva invisible automáticamente si la mano no está siendo rastreada.

  • Action especifica qué acción en el mapa de acciones está siendo rastreada, esto debe configurarse como el tipo especial SkeletonBase.

  • Path especifica la ruta de entrada de OpenXR, que es /user/hand/left para la mano izquierda y /user/hand/right para la mano derecha.

El siguiente paso es agregar el script config/OpenXRSkeleton.gdns al nodo del esqueleto del modelo 3D. Este script tiene las mismas dos propiedades que el script OpenXRHand, es decir, Hand y Motion Range, y se utilizan de la misma manera.

Tenga en cuenta que los nombres de los huesos están estandarizados, la lista de nombres de los huesos se presenta a continuación y deben ser sufijados con _L o _R dependiendo de si el hueso es para la mano izquierda o la mano derecha:

  • Palm

  • Wrist

  • Thumb_Metacarpal

  • Thumb_Proximal

  • Thumb_Distal

  • Thumb_Tip

  • Index_Metacarpal

  • Index_Proximal

  • Index_Intermediate

  • Index_Distal

  • Index_Tip

  • Middle_Metacarpal

  • Middle_Proximal

  • Middle_Intermediate

  • Middle_Distal

  • Middle_Tip

  • Ring_Metacarpal

  • Ring_Proximal

  • Ring_Intermediate

  • Ring_Distal

  • Ring_Tip

  • Little_Metacarpal

  • Little_Proximal

  • Little_Intermediate

  • Little_Distal

  • Little_Tip

Finalmente, y esto es una funcionalidad estándar de Godot, una adición común al seguimiento de manos es rastrear la ubicación de la punta de un dedo para la interacción con la física. Esto se puede lograr con el nodo BoneAttachment. Simplemente agréguelo como un nodo secundario al nodo Skeleton y seleccione el hueso que desea rastrear. Ahora puede agregar el objeto de física deseado como nodo secundario de este nodo.