Compartir a través de


Control de condiciones excepcionales

En su mayor parte, WLT puede detectar y corregir los errores de seguimiento de forma silenciosa, sin la intervención de la aplicación.

Sin embargo, algunas condiciones excepcionales conducen a errores a los que la aplicación podría querer ajustarse.

La pérdida de seguimiento es un ejemplo de estas condiciones.

El seguimiento puede perderse en cualquier momento, por diversos motivos. Puede que se cubran los sensores, que la iluminación no sea adecuada o que no haya características visibles alrededor de la cámara para seguirlas.

En otras partes de esta documentación, se tratan más a fondo estas condiciones excepcionales desde un punto de vista conceptual, incluidas las características de WLT para mitigarlas.

Aquí, profundizaremos en cómo el desarrollador de una aplicación puede aprovechar (opcionalmente) esas características para personalizar el comportamiento de la aplicación durante estas condiciones excepcionales.

Puntos de conexión

Como se explica más detalladamente aquí, un punto de conexión es el contrato entre WLT y la aplicación, para notificar que se han producido condiciones excepcionales, junto con los datos oportunos que la aplicación puede usar para responder.

Componentes Adjuster

Hay disponible una implementación de estas respuestas de aplicación en forma de componentes "Adjuster". El principal es el componente AdjusterFixed.

AdjusterFixed se puede usar tal cual, pero saber lo que hace puede ser instructivo, especialmente para un desarrollador que quiera personalizar aún más el comportamiento.

Es importante saber que los componentes Adjuster desempeñan dos roles:

  1. Administran el punto de conexión subyacente.
  2. Proporcionan implementaciones de las respuestas de la aplicación a condiciones excepcionales.

Administración de los puntos de conexión

Examinar los miembros Start() y OnDestroy() constituye la mayor parte de la administración de los puntos de conexión necesaria.

En Start(), se crea el punto de conexión (AttachmentPoint) subyacente y se dan las funciones miembro de AdjusterFixed como devoluciones de llamada (vea los párrafos siguientes).

En OnDestroy(), se quitan estas conexiones de devolución de llamada y se libera el punto de conexión.

Devoluciones de llamada de control de condiciones

Las dos devoluciones de llamada implementan el comportamiento deseado de la aplicación durante estas condiciones excepcionales.

Control del estado de seguimiento

En HandleStateAdjust(), el componente AdjusterFixed deshabilita los objetos contenidos en un fragmento que no se está siguiendo en ese momento.

        protected virtual void HandleAdjustState(AttachmentPointStateType state)
        {
            bool visible = state == AttachmentPointStateType.Normal;
            if (visible != gameObject.activeSelf)
            {
                gameObject.SetActive(visible);
            }
        }

Aunque este sencillo comportamiento es perfecto para muchas aplicaciones, es fácil imaginar casos en los que no sería suficiente.

  1. El objeto debe estar oculto, pero no deshabilitado (debe seguir actualizándose).
  2. Se prefiere un método alternativo para ocultar el objeto (por ejemplo, moverlo fuera del plano de recorte).
  3. En lugar de ocultar el objeto, debe representarse con un material diferente (por ejemplo, material de rayos X).
  4. En lugar de ocultar el objeto, debe representarse un objeto alternativo.
  5. Etc.

Afortunadamente, el desarrollador de la aplicación es libre de implementar cualquiera de estos u otros comportamientos, con el único límite de la imaginación.

El medio más sencillo para especificar un comportamiento personalizado es implementar un componente personalizado derivado de AdjusterFixed. Después, se puede heredar la administración de los puntos de conexión e invalidar los controladores para crear el comportamiento personalizado.

Control del cambio de posición

Como se explica en la documentación conceptual, el sistema WLT puede determinar que un objeto se puede mantener mejor en su posición del mundo físico cambiando su posición en el espacio inmovilizado. Informará a la aplicación de esa situación a través del mecanismo AttachmentPoint.

Por supuesto, la aplicación es libre de omitir estos ajustes. Sin embargo, el comportamiento que proporciona el componente AdjusterFixed (y AdjusterMoving) es aplicar de inmediato esa transformación de cambio de posición.

        protected virtual void HandleAdjustLocation(Pose adjustment)
        {
            Pose pose = gameObject.transform.GetGlobalPose();
            pose = adjustment.Multiply(pose);
            gameObject.transform.SetGlobalPose(pose);
        }

Eso es lo que la aplicación quiere casi siempre. Cabe preguntarse entonces por qué alguien querría invalidar la función HandlePositionAdjust() de AdjusterFixed.

La respuesta, por supuesto, es que es posible que la aplicación quiera realizar otras acciones además de corregir la posición. Un efecto material temporal puede ayudar a notificar al usuario que se ha realizado un cambio. Es posible que el cambio de posición se alargue durante unos segundos. O bien, si un cambio de posición es demasiado drástico, es posible que la aplicación prefiera descartar el objeto en lugar de moverlo.

AdjusterFixed frente a AdjusterMoving

Un análisis más detallado del componente AdjusterMoving muestra que es casi idéntico al componente AdjusterFixed del que se deriva.

La diferencia entre los dos es que AdjusterMoving supone que su destino se mueve constantemente por el entorno. Por tanto, en cada actualización, notifica al sistema WLT su nueva posición.

El costo de AdjusterMoving procede principalmente de la adición de una función Update(), no del trabajo realizado dentro de la función. Sin embargo, para un objeto que es "principalmente" estacionario y se mueve raramente del script, puede ser ventajoso usar un componente AdjusterFixed y llamar a AdjusterFixed.UpdatePosition() después de cada vez que se mueve el objeto.

Personalice el comportamiento, pero solo si desea hacerlo

De nuevo, se espera que el patrón sea coherente en todo World Locking Tools. WLT proporciona un comportamiento de línea base sencillo, pero generalmente útil. Se espera que esta implementación:

  1. Satisfaga las necesidades de la aplicación.
  2. Proporcione una implementación de línea base para que usted la mejore.
  3. Proporcione una implementación de ejemplo desde la que dar rienda suelta a su imaginación.

Consulte también