Traemos un articulo original de iRacing que nos ha parecido muy interesante y que trata un tema muy peliagudo; los daños y el sistema de daños entre vehículos. Como muchos de vosotros os veis afectados por este tipo de situaciones día si y día también nos parece apropiado hacer el esfuerzo de traducirlo y presentarlo aquí sin perder ni un ápice de la esencia original.
Comenzando
Mi nombre es Richard Jobling y soy Ingeniero de Software Senior aquí en iRacing. Durante mucho tiempo mi principal objetivo en iRacing ha sido desarrollar nuestro nuevo modelo de daños. Ha sido un largo viaje, y me gustaría compartir algunos detalles del camino.
Cuando hablamos por primera vez de mejorar los daños en el iRacing, nos centramos en el objetivo de añadir piezas a los coches que se romperían durante el impacto. Inmediatamente empecé a añadir más cosas a nuestra lista de cosas por hacer, como mejorar las partículas y los sonidos para complementar las partes frágiles.
Como recién contratado en ese momento, pensé con optimismo que esto no sería demasiado trabajo. Seguramente podría integrar algunos middleware de física existentes para simular las partes del coche y otros middleware para efectos de partículas.
Sin embargo, a medida que pasábamos más tiempo discutiendo las prioridades, se hizo evidente que en iRacing valoramos más que en otros juegos la autenticidad de nuestra simulación. Esto significa que todo tiene que funcionar en conjunto para ser físicamente preciso. Cuando hablamos de nuevas características, tenemos que considerar todos los procesos físicos que tienen lugar.
En caso de daños en el coche, no basta con quitar las piezas y los efectos durante un accidente. Para iRacing queremos modelar lo más posible todo lo que ocurre durante un impacto: flexión, crujido, rotura, separación, etc.
Además, como la física es tan importante para iRacing, queríamos mantener el control de nuestro código en lugar de depender del middleware. Dicho esto, los sistemas existentes tenían muchas deficiencias que queríamos mejorar en el futuro.
Y así el proyecto creció hasta el punto en que hemos escrito sistemas completamente nuevos para colisiones y daños y hemos reelaborado gran parte de la física.
Conos
En lugar de hacer frente a los daños de inmediato, primero trabajamos en la dinamización de los conos de pista. Esto nos ayudaría a aprender más sobre qué mejorar.
Construyendo sobre la tecnología existente implementamos con éxito conos dinámicos que en la superficie parecían un gran paso adelante. Sin embargo, por mucho que los conos se estuvieran moviendo, estaba claro que nuestros sistemas actuales necesitaban mejorar.
La colisión para coches y conos se representan como una serie de esferas. Esto es genial porque es simple y podemos probar eficientemente muchas esferas contra la geometría de nuestra pista. Sin embargo, el uso de esferas dificulta la representación de formas largas, planas o delgadas o incluso conos. Además, siempre habría huecos entre las esferas, y la forma final del conjunto termina siendo irregular, por lo que necesitamos un conjunto separado de planos para el otro coche/cono.
Probar un conjunto de esferas de objetos contra otros planos de objetos funciona lo suficientemente bien. Desafortunadamente, puede llevar a inconsistencias cuando se invierte el orden de los objetos. Así, por ejemplo, el cono funciona bien cuando se prueba contra los planos del coche, pero no al revés.
Así que nuestros problemas eran que no podíamos representar bien nuestras formas sin usar muchas más esferas y que necesitábamos dos representaciones de colisión diferentes en uso, lo que llevó a algunos problemas de asimetría.
Además, si podemos reducir nuestra colisión a una representación, entonces los impactos entre coches serían más consistentes de cliente a cliente. Esto ayudaría a mejorar lo que a todo el mundo le gusta llamar el netcode.
También, siempre hemos luchado con las esferas que se pegan a través de los muros a altas velocidades, y ahora los conos podrían quedar atrapados en los coches. Queríamos mejorar también en estas áreas.
Puedes ver las dos diferentes representaciones de colisión a continuación.
¿Qué es lo que ya funciona?
Después de probar los conos, sabíamos que necesitábamos hacer grandes cambios, así que tenía sentido hacer un balance de lo que estaba funcionando bien para nosotros.
Simular física para iRacing es único en algunos aspectos que difieren del típico middleware y no son inmediatamente obvios, pero marcan una diferencia significativa en nuestra búsqueda del realismo. Cualquier cosa nueva necesitaría mantener estas características personalizadas.
Las colisiones en iRacing no son como la física habitual de las bolas de billar en los videojuegos. Normalmente, un impacto en un videojuego se simplifica, por lo que se considera instantáneo. Cuando un objeto rebota en otro, la respuesta es inmediata, y los objetos que se movían uno hacia el otro viajarán lejos del otro con alguna pérdida de energía.
Esto funciona en la mayoría de los juegos, pero no es muy realista en los casos que nos importan. Por ejemplo, cuando los coches rebotan unos contra otros, queremos que los conductores sean capaces de mantener el control de forma realista. Si los impactos afectan a los coches al instante, es difícil para los jugadores predecir y reaccionar a tiempo. Los coches de verdad no son infinitamente rígidos; los impactos implican flexibilidad que lleva un poco de tiempo.
Este es un fenómeno importante que iRacing captura ejecutando la física a una alta frecuencia de 360hz e implementando lo que se conoce como el método de penalización para las fuerzas de impacto.
Las fuerzas de penalización, por su naturaleza, pueden extender el impacto sobre múltiples cuadros y permitirnos modelar más variedad en la forma en que los materiales chocan.
También es importante para iRacing la superficie de la carretera, que tiene que ser suave para conducir, pero también lo suficientemente detallada como para incluir todos los baches y hundimientos del mundo real que nuestro láser escanea.
La mayoría de los juegos utilizan un triángulo de malla de baja resolución para la colisión en la pista. En iRacing nuestras superficies se definen paramétricamente como tramos de carretera de barrido suave en los que superponemos un mapa de baches separado. El mapa de baches es lo que captura todos los detalles de la pista en alta fidelidad.
Esta alta resolución es crítica, por lo que nuestro modelo de neumáticos tiene suficiente detalle para trabajar cuando se reproduce una representación precisa de las características de la pista y las sensaciones en carretera.
Formas de colisión GJK
Para mejorar las formas de colisión decidimos reemplazar el enfoque de esferas y planos envejecidos, pero eficientes, por un nuevo sistema que utilizaría conjuntos de formas convexas.
Las formas convexas son una buena opción porque todavía podemos procesarlas eficientemente, y combinando un conjunto de ellas somos capaces de emparejar la forma del coche muy de cerca.
Para soportar formas convexas, implementamos el algoritmo GJK que también hace que sea trivial añadir formas como las necesarias para nuestros neumáticos. Los detalles del algoritmo GJK los podemos omitir y solo mirar como se ven las nuevas formas.
A continuación se muestra nuestro coche con las formas GJK recién definidas.
Con el nuevo enfoque, ahora podemos colisionar un conjunto de formas con las de otro. Así que ambos coches usan las mismas formas para las colisiones, resolviendo nuestros problemas de asimetría y dándonos resultados más consistentes.
Otra propiedad de las viejas esferas era que podíamos moverlas para representar los efectos del daño. Cada esfera se movía hacia adentro para aproximarse a la forma en que el auto se doblaba o aplastaba en ese lugar.
Para nuestras formas convexas, también podemos mejorar esto. Podemos transformar nuestras formas convexas basándonos en el daño. De hecho, podemos controlar el morphing, por lo que cada forma sólo se ve afectada en las zonas dañadas, lo que nos da un control más preciso que las esferas.
Modelar estas formas convexas ha sido un gran trabajo para el equipo de arte. Para cada coche, necesitan reexaminar exactamente cómo se construyen para que podamos construir las formas apropiadas. Las formas para el chasis subyacente, los paneles de la carrocería, las alas y todo lo demás necesitan ser modeladas, para que encajen correctamente en el coche y se separen en los lugares correctos. En muchos casos, tenemos que volver a los materiales de referencia para averiguar exactamente cómo se construyó ese coche en el mundo real para ajustarlo lo más posible.
Manifolds de contacto
Desafortunadamente, la física del contacto con las formas convexas no es tan simple como la de una esfera y un plano.
Con nuestro antiguo sistema, podíamos reducir cada par de contactos de esfera/plano a un único punto para el cual calcularíamos las fuerzas de colisión y fricción.
Esto era sencillo, pero significaba que para apoyar un cono en el suelo necesitábamos al menos cuatro esferas en la base, una para cada esquina si iba a descansar de forma realista en lugar de rodar. Para la mayoría de los objetos, esto nos llevó a añadir aún más esferas.
En el caso de las formas convexas, por el contrario, podemos representar la forma del cono utilizando sólo dos formas convexas: una caja para la base y una pirámide para la parte superior.
Pero para apoyar el cono en el suelo, todavía tenemos que determinar las fuerzas de apoyo en cuanto a cómo se asienta en contacto con la carretera.
En lugar de dividir la forma del cono como hicimos con nuestras esferas, preferimos determinar cómo se apoya la base en el suelo.
Esto se resuelve con lo que a veces se llama un colector de contactos. El colector mantiene un conjunto de contactos recogidos en los últimos cuadros. Los contactos son retenidos para que podamos en su momento construir un conjunto estable de puntos de anclaje que soporten el cono.
A continuación se muestra una imagen que muestra algunos conos y sus colectores de contacto cuando están en reposo. El mismo enfoque se utiliza para todas las partes importantes del coche ya que entran en contacto con el suelo y las paredes circundantes, así como con otros coches y objetos.
Colisiones en pista
Desafortunadamente, cuando se trata de pruebas contra nuestra superficie de pista personalizada, las nuevas formas convexas no son tan sencillas como las esferas.
Era relativamente fácil construir planos para cada esfera basándose en los datos de las vías circundantes. Esto no era eficiente, pero era factible con el número de esferas que usábamos para los coches. También era conveniente aplicar el detalle preciso del mapa de baches a los planos.
Sin embargo, cuando se consideran las formas convexas, no es práctico reducir la superficie de la pista a un conjunto de planos lisos. Las formas largas pueden estirarse potencialmente a través de partes de la pista que deberían inclinarse o elevarse, y esto no sería capturado por niveles planos.
Como ya se ha mencionado, la mayoría de los juegos utilizan una malla triangular de baja resolución para representar el entorno. Esta es una representación más práctica de las formas de GJK, pero tiene sus propios problemas que deben ser abordados.
En nuestro caso, necesitamos un alto nivel de detalle. Para alcanzar la fidelidad requerida, necesitamos que el teselado de la malla esté al menos a medio metro.
Para una pista como la de Nürburgring que puede llegar a requerir aproximadamente 5 millones de triángulos. Almacenar tantos triángulos por sí solos usará casi 100meg.
Afortunadamente, hay estructuras de datos que podemos usar para acelerar las consultas de colisión de malla, pero esas ocupan una memoria aún más valiosa. Nuestros intentos iniciales terminaron con enormes gastos generales de datos y rendimiento en comparación con el sistema anterior.
Después de mucho rascarnos la cabeza, pudimos diseñar nuestra propia estructura de datos personalizada que era lo suficientemente compacta y eficiente para nuestro alto nivel de detalle.
Para crear nuestros datos de malla, hemos creado una herramienta de preprocesamiento que lee las definiciones paramétricas de las pistas y después de mucho trabajo produce una malla triangular óptima en nuestro formato personalizado. La herramienta se esfuerza por teselar con precisión consistente a lo largo de toda la superficie de la carretera, a la vez que mantiene todas las hendiduras y transiciones destacadas en las que nuestros chicos trabajan tan duro.
La consistencia nos ayuda a mantener un rendimiento estable sin importar en qué parte de los coches de la pista están compitiendo. Con nuestro sistema existente las curvas cerradas u otras áreas detalladas funcionarían peor debido al detalle adicional, ahora podemos tener el mismo nivel de detalle en todas las áreas y con el mismo rendimiento.
Aquí hay una captura de pantalla de una de estas mallas de pista.
Es imposible ver el detalle sutil en la malla requerida por el modelo de neumático. Sin embargo, sin él, cada pista perdería su carácter y se sentiría muy suave y artificial.
Una ventaja del enfoque de malla es que es adaptable a las colisiones de partículas. Por lo tanto, cuando introdujimos los nuevos efectos de las partículas hace algún tiempo, pudimos utilizar las mallas antes que esperar a que se produjera el nuevo sistema de colisión y daños. Así que las mallas ya están ahí fuera y en uso.
Montajes de daños
Colisionar con otros coches y con el medio ambiente es sólo uno de los aspectos que necesitamos modelar. Otra área importante que debemos considerar es cómo simular el daño resultante.
Como se mencionó, para las esferas nuestro viejo sistema funcionaba moviendo las posiciones de las esferas para aproximar el aplastamiento. Las fuerzas para un contacto de esfera se dividieron en lo que llamamos fuerzas elásticas y plásticas para modelar tanto los efectos de colisión como de daño.
Ahora que tenemos formas convexas que se transforman para modelar con precisión el aplastamiento, necesitamos un método complementario para rastrear nuestro estado de daño.
Además, queremos poder desmontar algunas piezas del coche cuando haya suficientes daños. Y en muchos casos queremos que esas piezas permanezcan atadas al coche, por ejemplo, cuando un capó se rompe pero permanece con bisagras y debe aletear hacia arriba y hacia abajo.
Esto llevó a la adición de lo que llamamos monturas. Cada coche, además de tener múltiples formas de colisión, ahora también tiene un conjunto de soportes asociados a cada parte del coche. Cada montaje se daña en un área local para esa parte y también puede modelar un resorte de conexión para simular bisagras y otros accesorios.
Colocamos y especificamos todos los soportes necesarios para los daños y los accesorios a lo largo del coche. Cada montura puede ser ajustada para representar la construcción subyacente en esa ubicación.
A medida que las formas detectan la colisión, generan fuerzas que se propagan a través de cada montura causando el daño apropiado. Cada contacto que se toma a su vez daña gradualmente las monturas, lo que provoca que la forma de la colisión se aplaste y eventualmente, cuando es posible, se desprenda.
A continuación puede ver una imagen que muestra nuestro coche con cajas en las localizaciones de montaje.
Desmontaje de piezas
También necesitamos modelar con precisión las consecuencias del desmontaje de piezas. Para cada parte, necesitamos determinar la masa y la inercia y cómo eso afecta al coche en su conjunto cuando se coloca en posición o cuando se retira.
En iRacing tenemos un sofisticado solucionador multi-carrocería usado para calcular cómo interactúan todas las partes conectadas del coche dadas todas las fuerzas externas e internas que actúan sobre el sistema en cada paso de la simulación.
El sistema de carrocería múltiple es fundamental para modelar nuestros coches y nos permite construir una representación precisa de toda la geometría de conexión para, entre otras cosas, la suspensión, la transmisión y el chasis.
Debido a que el solucionador multicuerpo tiene que hacer mucho trabajo en tiempo real, nuestro sistema está diseñado para precompilar el código óptimo para realizar los cálculos a 360hz. Desafortunadamente, debido a que precompilamos el código, esto significa que la disposición de los cuerpos necesita ser arreglada. En otras palabras, no podemos desconectar o reconectar fácilmente las carrocerías del coche.
Para eliminar las piezas a medida que se rompen, necesitábamos retocar este sistema sin sacrificar el rendimiento. Pudimos hacer esto aumentando el sistema de carrocerías múltiples para que las carrocerías de los chasis pudieran mantener totales de masa e inercia extraíbles que actualizamos dinámicamente cada vez que alguna pieza necesita romperse o encajar.
Después de que una pieza se suelta, la reemplazamos con una nueva pieza separada que realiza su propia colisión y física para que pueda rebotar y caer por la carretera de forma independiente.
También es necesario desmontar las ruedas. Dado que las ruedas ya forman parte del multicuerpo, necesitamos un enfoque similar para poder eliminar su masa.
Con todas estas masas individuales ahora dinámicamente contabilizadas, podemos eliminar con precisión la masa y, por lo tanto, la energía durante grandes colisiones.
A continuación se muestra nuestro coche de ejemplo con todas las piezas y un par de ruedas dañadas y quitadas.
Muros pegajosos
Un problema desafortunado con nuestro viejo sistema era que para impactos grandes el coche podía terminar atascado dentro de una pared. A pesar de algunos arreglos inteligentes, nunca fuimos capaces de resolver esto completamente, y era otra área que queríamos mejorar.
Para el nuevo sistema, tuvimos los mismos problemas, que se derivan del enfoque del método de penalización. El método de penalización requiere que las formas de colisión se superpongan. La profundidad de la superposición se utiliza para determinar una fuerza de colisión apropiada. Desafortunadamente para los objetos blandos u objetos que se mueven muy rápidamente, este enfoque comienza a fallar. Si algunas formas atraviesan las paredes y pasan al lado equivocado, entonces el coche en su conjunto se atascará.
Este problema lo veíamos con frecuencia en nuestras nuevas formas, especialmente en piezas como los paneles de la carrocería y las capotas, que eran más delgadas que las viejas esferas típicas.
Este problema es en parte la razón por la que es más común que el middleware modele las colisiones de forma instantánea. Al hacerlo, pueden evitar los problemas causados cuando las formas se superponen durante más tiempo.
Experimentamos con diferentes métodos para resolver este difícil problema. La mayoría de las veces tratamos de predecir el problema y luego revertir a impulsos de colisión instantáneos. Sin embargo, los resultados nunca fueron perfectos, y el movimiento no fue convincente.
Este fue un problema muy difícil y que a veces parecía que nunca se resolvería. Pero al final, fuimos capaces de diseñar nuestro propio enfoque único que nos permite mantener las propiedades que nos gustaban del método de penalización mientras nos aseguramos de que las formas de colisión no pasen a través de las paredes.
Nuestro enfoque mantiene una esfera central separada para cada forma de colisión. Una esfera central es lo suficientemente pequeña como para ser encapsulada por la forma de colisión correspondiente. La mayoría de las veces, estas dos formas se mueven en paralelo. Sin embargo, nunca se permite que la esfera central pase a través del entorno de colisión.
En el caso de una colisión profunda, la esfera del centro y la forma de la colisión se separarán. La esfera del centro permanecerá en o cerca de la superficie mientras la forma de la colisión continúa más profunda. Por lo tanto, somos capaces de mantener una comprensión de la superficie para esa forma de colisión hasta que tenga tiempo de volver a salir. Este enfoque nos permite utilizar el método de penalización evitando las trampas más comunes.
Ajustar propiedades
Una vez construidas nuestras nuevas formas de colisión y posicionados y conectados nuestros soportes de daños, todavía necesitamos afinar todas las propiedades asociadas.
Las formas de colisión tienen propiedades que definen: masa, material, rigidez, amortiguación, fricción, etc. Los montajes de daños tienen propiedades que definen: material, límites de fluencia, límites de rotura. Y luego aún más propiedades para el comportamiento de los resortes de montaje.
Todas estas propiedades necesitan ser cuidadosamente investigadas y revisadas para cada coche. Este trabajo recayó en nuestros dedicados ingenieros de dinámica de vehículos, e iba a ser una tarea enorme.
Para mejorar el flujo de trabajo y acelerar el largo proceso hemos desarrollado una interfaz de edición en vivo que llamamos Tweaker. Usando la herramienta Tweaker, podemos ajustar todas estas propiedades en el coche durante la simulación, así como inspeccionar cosas como las formas de colisión y las posiciones de montaje.
El Tweaker está construido utilizando la popular biblioteca Dear ImGui que nos permite ajustar rápidamente la interfaz a nuestras necesidades a medida que los ingenieros descubren nuevas y más rápidas formas de trabajar.
A continuación se muestra un ejemplo que muestra el Tweaker en uso.
Eventos de colisión/daño
Hasta ahora hemos cubierto de lo que es capaz el nuevo sistema de colisión y daños. Pero también tenemos que comunicar los resultados a otros sistemas en iRacing.
En lugar de añadir estas características según sea necesario, tenemos un nuevo sistema para eventos de colisión y daños. Este sistema empaqueta toda la información necesaria para cada cambio de impacto o daño de modo que pueda ser parcelado a otras áreas para su procesamiento. Entonces podemos conectar cualquiera de nuestros otros sistemas para que puedan reaccionar apropiadamente.
Actualmente estamos utilizando los eventos de colisión y daño para mejorar nuestros efectos de partículas y sonido, por lo que se asemejan más al tipo de daño que está sufriendo el coche.
Próximos pasos
Cuando todo este nuevo trabajo esté finalizado, podremos empezar a construir sobre nuestra nueva base para añadir aún más mejoras.
Por ejemplo, estamos en mejores condiciones de mejorar nuestra tasa de pasos de simulación para obtener una física aún más precisa. Deberíamos ser capaces de mejorar la forma en que representamos los pianos específicos y las características de las pistas cuando sea necesario. Y, en última instancia, nos gustaría poder partir los coches a la mitad en espectaculares choques de Indy 500.
Por ahora, tenemos que concentrarnos en el trabajo que queda por hacer. Estaremos ocupados actualizando todos nuestros coches y todos nuestros objetos de pista. Tenemos que actualizar todo en el servicio iRacing antes de que podamos lanzarlo, ya que hay demasiados cambios para que los sistemas antiguos y los nuevos coexistan.
También estamos finalizando los nuevos efectos y sonidos. A partir de ahí tendremos que optimizar y depurar todos estos nuevos sistemas.
Dicho esto, es emocionante llegar a este punto y estoy feliz de poder compartir estos detalles.
Gracias
Richard
P.D. – Estamos trabajando en un vídeo que mostrará gran parte de lo que he comentado anteriormente – espero tenerlo en un par de semanas más o menos.