Ampliación de la caja de herramientas de robótica: Cambios físicos en Unity 2022
Simule robots sofisticados y conscientes del medio ambiente con las nuevas herramientas de sensor de fuerza de dinámica inversa. Explore la dinámica con el Physics Debugger completamente renovado. Aproveche las mejoras de rendimiento en interpolación, consultas por lotes y más.
Simule robots sofisticados y conscientes del medio ambiente con las nuevas herramientas de sensor de fuerza de dinámica inversa. Explore la dinámica con el Physics Debugger completamente renovado. Aproveche las mejoras de rendimiento en interpolación, consultas por lotes y más.
Physics Debugger es una herramienta esencial para comprender el funcionamiento interno del motor de física, así como para dar sentido al comportamiento particular observado en un proyecto. Un buen depurador es una herramienta crítica para crear física rica, moderna y convincente. Con eso en mente, rediseñamos completamente la interfaz de usuario (UI) y agregamos algunas funciones interesantes.
Para incluir más información en el mismo espacio, agrupamos las propiedades en pestañas y luego las expandimos con las propiedades recién agregadas.
Antes, tanto los componentes Rigidbody como ArticulationBody tenían una sección plegable de "Información" en el Inspector que se podía expandir para ver información adicional, como la velocidad lineal actual. Sin embargo, una vez ampliado, el rendimiento general del Editor se degradó significativamente. Además, antes era complicado comparar parámetros de diferentes cuerpos, ya que necesitabas abrir dos paneles de Inspector. Para abordar estos problemas, movimos todas las propiedades a la pestaña "Información" de la ventana del depurador de física, donde se muestran las propiedades de cada uno de los objetos seleccionados, para que pueda compararlos fácilmente uno al lado del otro.
Ahora se pueden visualizar los puntos de contacto, junto con la normal de contacto y la distancia de separación.
Las consultas de física, como Physics.Raycast o Physics.CastSphere, normalmente forman parte de algún comportamiento de física personalizado, como controladores de personajes personalizados o controladores de vehículos. Son invisibles y difíciles de depurar. Para ayudar con eso, esta versión ofrece una visualización opcional de las consultas de física.
Hasta ahora, Unity tenía herramientas que admitían solo lo que se denomina dinámica directa: dado un conjunto de objetos y las fuerzas que se les aplican, calcular sus trayectorias. Si bien esto es increíblemente útil, queríamos expandir nuestra caja de herramientas de robótica. Entonces, Unity 2022.1 agrega soporte para la dinámica inversa: dado un objeto y una trayectoria deseada, calcula las fuerzas que causan esa trayectoria cuando se simula.
Este esfuerzo abarcará múltiples versiones, a medida que lo desarrollamos iterativamente. En Unity 2022.1, exponemos un conjunto de funciones para calcular los componentes de la fuerza total actual aplicada a ArticulationBodies que deben contrarrestarse antes de aplicar la fuerza externa para impulsarlos a lo largo de la trayectoria deseada. Más conceptos interesantes se expondrán en versiones posteriores, como la fuerza conjunta requerida para contrarrestar el impulso aplicado por el solucionador. Lo invitamos a probar esto y dejarnos saber lo que piensa en el foro .
En concreto, las nuevas funciones son:
- obtenga la fuerza actual aplicada al cuerpo por la unidad . Es una indicación de la dificultad con la que un disco intenta alcanzar el objetivo de disco deseado. Depende de la rigidez y la amortiguación de la transmisión, así como de la posición objetivo delta actual y la velocidad objetivo delta;
- conseguir las fuerzas conjuntas necesarias para contrarrestar las fuerzas de gravedad , Coriolis y centrífugas que actúan sobre el cuerpo; y
- obtener la fuerza conjunta necesaria para alcanzar la aceleración deseada.
Interpolación y extrapolación
Rigidbody utiliza tanto la interpolación como la extrapolación para dar la impresión de un movimiento suave mientras simula a una frecuencia comparativamente baja. Internamente, esto se implementa calculando las poses de transformación en cada actualización. En el caso de la interpolación, las dos últimas poses simuladas se utilizan para calcular una nueva pose de transformación para este fotograma. En el caso de la extrapolación, se utilizan en su lugar la última pose y velocidad simuladas. Sin embargo, dado que está diseñado para ser liviano, no comunicamos estas poses al motor de física. Las poses solo se presentan a los sistemas fuera de la física (por ejemplo, gráficos y animación). Por eso, por ejemplo, un raycast no detectará un cuerpo en la pose interpolada.
Para evitar que la física notara los cambios de transformación, el mecanismo consistía en hacer que Physics.SyncTransforms() llamara a cada actualización justo antes de escribir la pose, seguido de una llamada de método interno para borrar todas las actualizaciones de transformación para la física. Eso causó dos clases de problemas:
- Si una escena tiene al menos un cuerpo interpolado, todos los cambios de transformación en todos los componentes de física se sincronizaron con el motor de física en cada actualización (aunque en su mayoría se necesitan una vez por FixedUpdate); y
- Si se realizó un cambio en una transformación que tenía un componente Rigidbody con interpolación, la interpolación para este objeto se interrumpió porque el cambio de transformación realizado por el usuario se propagó al motor de física y cambió efectivamente la última pose simulada (la pose no se almacena por separado – es solo la pose que el motor de física usa actualmente).
Para abordar estos problemas, actualizamos el código de interpolación para que no necesite sincronizar todas las transformaciones para cada cuadro. Este cambio también mejora el rendimiento; el nuevo código de interpolación se ejecuta más rápido que antes (dependiendo de la complejidad de la escena).
Abordar los comentarios en los foros
Una sección del foro está dedicada a discutir varias versiones preliminares experimentales de la tecnología física, y algunos de los cambios implementados en esta versión se originaron allí:
- Muchos proyectos, especialmente los más grandes, a menudo usan muchas capas de GameObject, por lo que la matriz que describe las combinaciones de capas y produce pares de contacto para la física también se vuelve bastante grande. En esta versión, destacamos la fila y la columna actualmente seleccionadas para que sea más fácil de usar.
- Una articulación se utiliza para vincular dos cuerpos rígidos y define las restricciones sobre su movimiento relativo. A partir de Unity 2020.2, también se puede usar una articulación para vincular un Rigidbody a un ArticulationBody. Para hacerlo posible, cada clase conjunta recibió una propiedad adicional que se muestra en el Inspector. La vinculación a Rigidbody y ArticulationBody al mismo tiempo es imposible, por lo que mostrar ambas opciones cuando ya se ha configurado una ocupa espacio vertical sin ningún motivo. Ahora, solo se muestra la propiedad que se estableció.
- Un Rigidbody cinemático es un tipo especial de cuerpo que puede influir en otros cuerpos, sin dejar que nada más lo afecte. En ese sentido, es similar a un colisionador estático, con la excepción de que está destinado a moverse con frecuencia. Los casos de uso típicos son los controladores de personajes, la física impulsada por la animación, la simulación de muñecas en realidad virtual (VR), etc. Se controla estableciendo un objetivo cinemático que el cuerpo alcanzará en un solo cuadro de simulación. La principal diferencia con el colisionador estático aquí es que el objetivo cinemático no se alcanza mediante teletransportación instantánea (cambio de pose), sino calculando las velocidades lineales y angulares requeridas para alcanzar el objetivo en un cuadro, y luego pasándolas al solucionador. De esa manera, el movimiento puede contribuir a las matrices jacobianas de restricción correctamente, y, por lo tanto, cualquier cadena de unión adjunta reaccionará correctamente (sin fallas). En esta versión de Unity, exponemos unanuevo método para establecer tanto la posición como la rotación del objetivo cinemático en una sola operación.
- La modificación de contacto, introducida en Unity 2021.2, permite cambiar los detalles del punto de contacto generados por la fase estrecha , justo antes de que se usen para crear restricciones de contacto para el solucionador. En esta versión, estamos agregando captadores nuevos para las velocidades del cuerpo en un par de contacto, para casos de uso avanzado como este ejemplo de fricción anisotrópica personalizada .
- La versión PhysX se actualizó a 4.1.2, la última en la línea 4.x hasta la fecha. Es una versión menor, por lo que solo soluciona fallas y fallas críticas. Las notas de la versión están disponibles aquí .
- Cuando un cuerpo dinámico se superpone a un colisionador, el solucionador tiene como objetivo encontrar un impulso correctivo que los separe y satisfaga todas las restricciones. Internamente, este impulso se calcula para cada punto de contacto en un par, pero solo teníamos un valor agregado que arrojó una suma total sobre todos los puntos . Con este lanzamiento, estamos exponiendo una nueva propiedad de la estructura ContactPoint que permite recuperar impulsos para cada punto de contacto.
- Estamos observando de cerca los comentarios sobre el componente ArticulationBody provenientes de la comunidad de robótica. Para facilitar la creación y el ajuste del comportamiento de algunas partes robóticas más pequeñas, anclamos los controladores de límite de las articulaciones en el espacio de la pantalla para que ya no ocluyan los colisionadores en la escena.
- Las consultas por lotes de física fueron el resultado de una hackweek de Unity y se enviaron directamente para habilitar ciertos casos de uso, pero con una funcionalidad mínima. Continúan evolucionando, con nuevas funciones para permitir aún más casos de uso, como aquellos con patrones de subprocesos más sofisticados, y los tipos de consultas son más diversos. En esta versión en particular, permitimos que las consultas por lotes se ejecuten en cualquier escena física y agregamos un nuevo tipo de consulta por lotes ( Physics.ClosestPointCommand ).
- Para que una malla se pueda usar con MeshCollider, primero debe hornearse. La cocción es un proceso costoso de producir las estructuras de búsqueda espacial requeridas para la detección de colisiones. Normalmente, sucede implícitamente cada vez que se cambia la propiedad de malla de MeshCollider, y se ejecuta en el subproceso principal, bloqueando cualquier trabajo adicional hasta que se complete. En Unity 2019.3, expusimos un método seguro para subprocesos para ejecutar el horneado del subproceso principal a pedido. La intención era permitir mallas generadas por procedimientos más sofisticadas, ya que ahora se podía trabajar en la generación de contenido y el horneado de mallas, obteniendo una utilización de subprocesos mucho mayor. Sin embargo, una desventaja particular de esta función era que solo permitía hornear con las opciones de cocción predeterminadas.. En esta versión, lo corregimos al exponer una nueva variante de Physics.BakeMesh que admite hornear con cualquier opción de cocción.