Gestos en Unity

Hay dos formas clave de tomar medidas en la mirada en Unity, gestos de mano y controladores de movimiento en HoloLens y HMD inmersivo. Puede acceder a los datos de ambos orígenes de entrada espacial a través de las mismas API de Unity.

Unity proporciona dos formas principales de acceder a los datos de entrada espaciales para Windows Mixed Reality. Las API de Input.GetButton/Input.GetAxis comunes funcionan en varios SDK XR de Unity, mientras que la API InteractionManager/GestureRecognizer específica de Windows Mixed Reality expone todo el conjunto de datos de entrada espacial.

API de gestos compuestos de alto nivel (GestureRecognizer)

Espacio de nombres:UnityEngine.XR.WSA.Input
Tipos: GestureRecognizer, GestureSettings, InteractionSourceKind

La aplicación también puede reconocer gestos compuestos de nivel superior para orígenes de entrada espaciales, Pulsar, Mantener, Manipular y Navegación. Puedes reconocer estos gestos compuestos en las manos y en los controladores de movimiento mediante GestureRecognizer.

Cada evento Gesture del GestureRecognizer proporciona SourceKind para la entrada, así como el rayo de cabeza de destino en el momento del evento. Algunos eventos proporcionan información adicional específica del contexto.

Solo se requieren algunos pasos para capturar gestos mediante un reconocedor de gestos:

  1. Crear un nuevo reconocedor de gestos
  2. Especificar los gestos que se van a watch para
  3. Suscribirse a eventos para esos gestos
  4. Empezar a capturar gestos

Crear un nuevo reconocedor de gestos

Para usar GestureRecognizer, debe haber creado un Objeto GestureRecognizer:

GestureRecognizer recognizer = new GestureRecognizer();

Especificar los gestos que se van a watch para

Especifique los gestos que le interesan a través de SetRecognizableGestures():

recognizer.SetRecognizableGestures(GestureSettings.Tap | GestureSettings.Hold);

Suscribirse a eventos para esos gestos

Suscríbase a eventos para los gestos que le interesen.

void Start()
{
    recognizer.Tapped += GestureRecognizer_Tapped;
    recognizer.HoldStarted += GestureRecognizer_HoldStarted;
    recognizer.HoldCompleted += GestureRecognizer_HoldCompleted;
    recognizer.HoldCanceled += GestureRecognizer_HoldCanceled;
}

Nota

Los gestos de navegación y manipulación se excluyen mutuamente en una instancia de GestureRecognizer.

Empezar a capturar gestos

De forma predeterminada, un GestureRecognizer no supervisa la entrada hasta que se llama a StartCapturingGestures(). Es posible que se genere un evento de gesto después de llamar a StopCapturingGestures() si se realizó la entrada antes del fotograma donde se procesó StopCapturingGestures(). El GestureRecognizer recordará si estaba activado o desactivado durante el fotograma anterior en el que se produjo realmente el gesto, por lo que es confiable iniciar y detener la supervisión de gestos en función de la orientación de la mirada de este fotograma.

recognizer.StartCapturingGestures();

Detener la captura de gestos

Para detener el reconocimiento de gestos:

recognizer.StopCapturingGestures();

Quitar un reconocedor de gestos

No olvide cancelar la suscripción de eventos suscritos antes de destruir un objeto GestureRecognizer .

void OnDestroy()
{
    recognizer.Tapped -= GestureRecognizer_Tapped;
    recognizer.HoldStarted -= GestureRecognizer_HoldStarted;
    recognizer.HoldCompleted -= GestureRecognizer_HoldCompleted;
    recognizer.HoldCanceled -= GestureRecognizer_HoldCanceled;
}

Representación del modelo de controlador de movimiento en Unity

Modelo de controlador de movimiento y teletransportación
Modelo de controlador de movimiento y teletransportación

Para representar controladores de movimiento en la aplicación que coincidan con los controladores físicos que los usuarios mantienen presionados y articulan a medida que se presionan varios botones, puedes usar el objeto prefabricado MotionController en el kit de herramientas de Mixed Reality. Este objeto prefabricado carga dinámicamente el modelo glTF correcto en tiempo de ejecución desde el controlador de controlador de movimiento instalado del sistema. Es importante cargar estos modelos dinámicamente en lugar de importarlos manualmente en el editor, de modo que la aplicación muestre modelos 3D físicamente precisos para cualquier controlador actual y futuro que puedan tener los usuarios.

  1. Siga las instrucciones de Introducción para descargar el kit de herramientas de Mixed Reality y agregarlo al proyecto de Unity.
  2. Si reemplazaste la cámara por el prefabricado MixedRealityCameraParent como parte de los pasos de Introducción, estás listo. Ese objeto prefabricado incluye la representación del controlador de movimiento. De lo contrario, agregue Assets/HoloToolkit/Input/Prefabs/MotionControllers.prefab a la escena desde el panel Proyecto. Querrá agregar ese objeto prefabricado como elemento secundario de cualquier objeto primario que use para mover la cámara cuando el usuario teletransporte dentro de la escena, de modo que los controladores se incluyan con el usuario. Si la aplicación no implica teletransportar, solo tiene que agregar el objeto prefabricado en la raíz de la escena.

Iniciar objetos

La creación de objetos en la realidad virtual es un problema más difícil de lo que puede parecer al principio. Al igual que con la mayoría de las interacciones basadas físicamente, al lanzar en el juego actúa de forma inesperada, es inmediatamente obvio y rompe la inmersión. Hemos pasado algún tiempo pensando profundamente en cómo representar un comportamiento de lanzamiento físicomente correcto y hemos llegado con algunas directrices, habilitadas a través de actualizaciones para nuestra plataforma, que nos gustaría compartir con usted.

Puede encontrar un ejemplo de cómo se recomienda implementar el lanzamiento aquí. Este ejemplo sigue estas cuatro directrices:

  • Use la velocidad del controlador en lugar de la posición. En la actualización de noviembre a Windows, se introdujo un cambio en el comportamiento cuando se encuentra en el estado de seguimiento posicional "Aproximado". Cuando se encuentra en este estado, la información de velocidad sobre el controlador seguirá siendo notificada siempre y cuando creemos que su alta precisión, que a menudo es más larga que la posición sigue siendo de alta precisión.

  • Incorpore la velocidad angular del controlador. Esta lógica se encuentra en el throwing.cs archivo del GetThrownObjectVelAngVel método estático, dentro del paquete vinculado anteriormente:

    1. A medida que se conserva la velocidad angular, el objeto lanzado debe mantener la misma velocidad angular que tenía en el momento del lanzamiento: objectAngularVelocity = throwingControllerAngularVelocity;

    2. Como es probable que el centro de masa del objeto lanzado no esté en el origen de la posición de agarre, es probable que tenga una velocidad diferente a la del controlador en el marco de referencia del usuario. La parte de la velocidad del objeto aportada de esta manera es la velocidad tangencial instantánea del centro de masa del objeto lanzado alrededor del origen del controlador. Esta velocidad tangencial es el producto cruzado de la velocidad angular del controlador con el vector que representa la distancia entre el origen del controlador y el centro de masa del objeto lanzado.

      Vector3 radialVec = thrownObjectCenterOfMass - throwingControllerPos;
      Vector3 tangentialVelocity = Vector3.Cross(throwingControllerAngularVelocity, radialVec);
      
    3. La velocidad total del objeto lanzado es la suma de la velocidad del controlador y esta velocidad tangencial: objectVelocity = throwingControllerVelocity + tangentialVelocity;

  • Preste mucha atención al momento en el que aplicamos la velocidad. Cuando se presiona un botón, puede tardar hasta 20 ms en propagarse a través de Bluetooth al sistema operativo. Esto significa que si sondea un cambio de estado del controlador de apretada a no presionada o al revés, la información de posición del controlador que obtiene con él realmente estará por delante de este cambio en estado. Además, la posición del controlador presentada por nuestra API de sondeo se predice para reflejar una posición probable en el momento en que se mostrará el período, que podría ser superior a 20 ms en el futuro. Esto es bueno para representar objetos retenidos, pero combina nuestro problema de tiempo para tener como destino el objeto a medida que calculamos la trayectoria por el momento en que el usuario liberó el lanzamiento. Afortunadamente, con la actualización de noviembre, cuando se envía un evento de Unity como InteractionSourcePressed o InteractionSourceReleased , el estado incluye los datos históricos de la posición desde atrás cuando se presionó o liberó el botón. Para obtener la representación más precisa del controlador y el destino del controlador durante los lanzamientos, debe usar correctamente el sondeo y el evento, según corresponda:

    • Para representar cada fotograma , la aplicación debe colocar el GameObject del controlador en la posición del controlador predicho hacia delante para el tiempo de foton del fotograma actual. Estos datos se obtienen de las API de sondeo de Unity, como XR. InputTracking.GetLocalPosition o XR. WSA. Input.InteractionManager.GetCurrentReading.
    • Para que el controlador tenga como destino una prensa o una versión, la aplicación debe hacer raycast y calcular las trayectorias en función de la posición del controlador histórico para ese evento de prensa o lanzamiento. Obtiene estos datos de las API de eventos de Unity, como InteractionManager.InteractionSourcePressed.
  • Use la posición de agarre. Angular velocidad y velocidad se notifican con relación a la posición de agarre, no a la posición del puntero.

La iniciación seguirá mejorando con futuras actualizaciones de Windows y puede esperar encontrar más información en ella aquí.

Controladores de gestos y movimiento en MRTK

Puede acceder al gesto y al controlador de movimiento desde el Administrador de entrada.

Seguimiento de tutoriales

Los tutoriales paso a paso, con ejemplos de personalización más detallados, están disponibles en la academia de Mixed Reality:

Entrada de MR 213: controlador de movimiento
Entrada de MR 213: controlador de movimiento

Siguiente punto de control de desarrollo

Si sigue el recorrido de desarrollo de Unity que hemos diseñado, está en medio de explorar los bloques de creación principales de MRTK. Desde aquí, puede continuar con el siguiente bloque de compilación:

O bien puede saltar a las funcionalidades y las API de la plataforma de realidad mixta:

Puede volver a los puntos de control de desarrollo de Unity en cualquier momento.

Consulta también