Compartir a través de


Gestos en Unity

Hay dos maneras 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 espacial para Windows Mixed Reality. Las API de Input.GetButton/Input.GetAxis comunes funcionan en varios SDK de XR de Unity, mientras que la API InteractionManager/GestureRecognizer específica de Windows Mixed Reality expone el conjunto completo 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 los orígenes de entrada espaciales, Pulsar, Mantener, Manipular y Navegar. Puede 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 hay unos pocos pasos necesarios para capturar gestos mediante un reconocedor de gestos:

  1. Crear un nuevo reconocedor de gestos
  2. Especificar los gestos que se van a inspeccionar
  3. Suscribirse a eventos para esos gestos
  4. Iniciar la captura de gestos

Crear un nuevo reconocedor de gestos

Para usar GestureRecognizer, debe haber creado un elemento GestureRecognizer:

GestureRecognizer recognizer = new GestureRecognizer();

Especificar los gestos que se van a inspeccionar

Especifique qué gestos 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 un GestureRecognizer.

Iniciar la captura de 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 marco 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 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 y articulan a medida que se presionan varios botones, puedes usar el objeto prefabricado MotionController en mixed Reality Toolkit. 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ísicomente precisos para cualquier controlador actual y futuro que los usuarios puedan tener.

  1. Siga las instrucciones de introducción para descargar mixed Reality Toolkit y agregarla al proyecto de Unity.
  2. Si ha reemplazado la cámara por el prefabricado MixedRealityCameraParent como parte de los pasos de introducción, ¡es bueno ir! 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 el teletransporte, solo tiene que agregar el objeto prefabricado en la raíz de la escena.

Iniciar objetos

Iniciar 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 dedicado algún tiempo a pensar profundamente en cómo representar un comportamiento de lanzamiento físicomente correcto y hemos llegado a unas pocas directrices, habilitadas a través de las actualizaciones de 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 alta precisión.

  • Incorpore la velocidad angular del controlador. Esta lógica está incluida 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 producido 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 que ese evento se propaga a través de Bluetooth al sistema operativo. Esto significa que si sondea para un cambio de estado del controlador desde presionado a no presionado o hacia el otro lado, 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 hacia delante 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 mantenidos, pero compone nuestro problema de tiempo para dirigirse al objeto a medida que calculamos la trayectoria durante 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 presiona o suelta 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 el controlador que representa cada fotograma, la aplicación debe colocar el GameObject del controlador en la posición del controlador previsto hacia delante para la hora de fotones del fotograma actual. Obtiene estos datos 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 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. La velocidad y la velocidad angulares se notifican con respecto a la posición de agarre, no a la posición del puntero.

Si se produce, se seguirá mejorando con futuras actualizaciones de Windows y puede encontrar más información aquí.

Controladores de gestos y movimiento en MRTK

Puede acceder al controlador de movimiento y gestos 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 mixed Reality Academy:

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 la exploración de 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.

Consulte también