F铆sica en un proyecto de unidad utilizando la lucha m贸vil como ejemplo


La f铆sica se ha convertido en una parte integral de cualquier juego moderno. Ya sea una simple simulaci贸n de tejido o una f铆sica del tr谩fico completa. Los juegos m贸viles no son la excepci贸n. Sin embargo, al configurar la f铆sica para ellos, debe mirar hacia atr谩s a las limitaciones asociadas con el rendimiento relativamente pobre de los dispositivos compatibles de generaciones anteriores. El artista t茅cnico l铆der en 3D Banzai.Games Roman Tersky cont贸 c贸mo su equipo integr贸 la f铆sica en el juego del juego de lucha m贸vil Shadow Fight 3, qu茅 t茅cnicas se usaron para la optimizaci贸n y c贸mo reescribi贸 la f铆sica desde cero para que los personajes lograran su determinismo completo en PVP s铆ncrono.

F铆sica de estado s贸lido




El equipo de personajes en Shadow Fight 3 tiene muchos elementos sujetos a simulaci贸n f铆sica, lo que agrega din谩mica a lo que est谩 sucediendo en la pantalla. Una de las principales dificultades que encontramos al configurar la f铆sica para estos elementos es el hecho de que los huesos a los que est谩n unidos se encuentran dentro de la jerarqu铆a del esqueleto del personaje mismo. Al moverse, repiten la transformaci贸n de los huesos parentales y no reciben un impulso f铆sicamente realista.

Detector de huesos


La soluci贸n m谩s f谩cil fue un desprendimiento de huesos. Despu茅s de inicializar todos los elementos del equipo utilizando un script, eliminamos los huesos de los elementos f铆sicamente activos de la jerarqu铆a del esqueleto del personaje y, utilizando el componente Conjunto de caracteres , creamos una conexi贸n con el hueso padre.



Sin embargo, nos encontramos con un peque帽o error derivado de la reducci贸n de fps: en este caso, un hueso sujeto a simulaci贸n f铆sica, con un ligero retraso, "atrapa" el hueso con el que est谩 conectada la articulaci贸n. Como regla, este error es tan insignificante que puede ser descuidado. Para otros casos, se aplic贸 una soluci贸n alternativa.

Impulso falso


Considere esta soluci贸n usando el ejemplo de un casco de merodeador, cuya cresta espartana est谩 sujeta a simulaci贸n f铆sica. Dividimos el peine en 5 partes, cada una de las cuales fue desollada en diferentes huesos. En la configuraci贸n conjunta de estos huesos, establecen l铆mites de rotaci贸n a lo largo del eje deseado y establecen el par谩metro Resorte de l铆mite de giro , que es responsable del efecto de resorte.



Para una simulaci贸n f铆sicamente realista, los huesos de la cresta se sacaron de la jerarqu铆a de caracteres, sin embargo, en caso de reducci贸n de fps, por ejemplo, en un dispositivo d茅bil, la malla se estir贸 fea debido a los huesos "atrapados".



Por lo tanto, decidimos dejar los huesos de la cresta dentro de la jerarqu铆a de personajes, y aumentar su dinamismo les dar铆a un impulso falso. Para hacer esto, necesit谩bamos en cada animaci贸n (a excepci贸n de la posici贸n de combate) determinar el momento en que aplicar el impulso, as铆 como su direcci贸n.

Se podr铆a leer el n煤mero de cuadros en la animaci贸n actual, luego restar 15-20 cuadros de este valor y aplicar un impulso despu茅s de la diferencia recibida. Sin embargo, logramos evitar la aritm茅tica innecesaria al vincular el momento del pulso al final del intervalo de animaci贸n ininterrumpido .

Cada animaci贸n (de nuevo, excepto la posici贸n de combate) tiene un per铆odo preconfigurado durante el cual el jugador no puede interrumpirlo. Despu茅s de este per铆odo o al momento de recibir el impacto, el intervalo ininterrumpido finaliza su acci贸n, y en este momento se activa nuestro impulso. Todo lo que se necesitaba era configurar excepciones para varias animaciones.



Por lo tanto, el impulso se desencadena varios fotogramas antes del final de cada animaci贸n, seg煤n sea necesario. En el momento de la inicializaci贸n del pulso, leemos las coordenadas en las que el hueso estaba en el marco anterior y actual, recibiendo su vector de movimiento. En este eje se aplica nuestro impulso.

Art铆culos de equipo


Para optimizar, tratamos de usar colisionadores lo menos posible al simular f铆sica para varios elementos del equipo de personajes. En la mayor铆a de los casos, logramos manipular solo las restricciones a lo largo de los ejes en la configuraci贸n conjunta de los huesos para los que se realiza la simulaci贸n.



En algunos casos (por ejemplo, con placas de metal) el uso de colisionadores es inevitable. Sin embargo, la carga principal no es la presencia de colisionadores, sino el c谩lculo de sus colisiones. Ajustar la matriz de colisi贸n de capas en la configuraci贸n del proyecto ayuda a minimizar esta carga. Para tales elementos, utilizamos dos capas separadas que chocan solo entre s铆, evitando as铆 el error de c谩lculo de colisiones con colisionadores de otras capas (armas, pisos, paredes, etc.)



Clon fisico


Shadow Fight 3 tiene varios tipos de armas para las cuales se usa simulaci贸n f铆sica fuera de las animaciones de ataque. Por el momento, este es un cuchillo con cadena, kusarigama, nunchaku y mayal. Por las razones descritas anteriormente, decidimos eliminar los huesos del arma de la jerarqu铆a de personajes fuera de las animaciones de ataque y devolverla cuando no se requiere simulaci贸n f铆sica. Al manipular el par谩metro Is Kinematic en el componente Rigidbody de los huesos, seg煤n la situaci贸n, activamos y desactivamos la f铆sica para ellos.

Sin embargo, cuando usamos Kusarigama y un cuchillo en la cadena, encontramos una mayor carga en dispositivos d茅biles y obtuvimos una reducci贸n de fps. El problema surgi贸 precisamente cuando los huesos volvieron a la jerarqu铆a del personaje y la simulaci贸n f铆sica se apag贸 para ellos. Esto se debe al hecho de que el cambio de las transformaciones del hueso principal en la jerarqu铆a del esqueleto ejerce una presi贸n sobre el motor de f铆sica para cada hueso secundario en el que hay un componente del cuerpo r铆gido , incluso si el par谩metro Is cinem谩tica est谩 activo. Y cuanto m谩s larga sea la jerarqu铆a, mayor ser谩 la carga.



La soluci贸n fue crear un clon f铆sico. Considere esto con un ejemplo de un cuchillo en una cadena.

Durante la carga de la batalla, se inicializan 2 esqueletos para 茅l: el principal, que se encuentra dentro de la jerarqu铆a del personaje, y su clon f铆sico. No hay un componente Rigidbody en los huesos del esqueleto principal; solo las pistas de animaci贸n afectan su transformaci贸n. Los huesos del segundo tienen conexiones sintonizadas (articulaciones) y un componente de cuerpo r铆gido con el par谩metro activo Es cinem谩tico.

Si bien la transformaci贸n de los huesos del esqueleto principal se ve afectada por la pista de animaci贸n, por ejemplo, durante un golpe, el par谩metro Is Kinematic en el componente Cuerpo r铆gido de los huesos del clon f铆sico permanece activo. Los huesos no se transforman y no est谩n sujetos a simulaci贸n f铆sica. Durante el 煤ltimo fotograma de la animaci贸n, las transformaciones 贸seas de los dos esqueletos se sincronizan. Un clon f铆sico lee la posici贸n y la rotaci贸n de los huesos del esqueleto principal y establece exactamente los mismos par谩metros. Luego se desactiva Cinem谩tica y se simulan los huesos del clon f铆sico. Adem谩s, hasta el comienzo de la siguiente animaci贸n de ataque, que ya es el esqueleto principal, cada cuadro lee las transformaciones de los huesos del clon f铆sico, que en ese momento se mueven en f铆sica, y establece estos par谩metros en sus huesos. Este enfoque ha reducido significativamente la carga en el motor de f铆sica y ha mejorado el rendimiento en dispositivos d茅biles.



Simulaci贸n de tejidos


Al configurar la simulaci贸n de tejidos como parte del rendimiento de los dispositivos m贸viles, la principal limitaci贸n es el uso de colisiones de tejidos con colisionadores. Una alternativa m谩s barata es ajustar la penetraci贸n de la superficie para las restricciones de la tela. Como en nuestro juego hay muchas animaciones y varias poses de personajes, se compil贸 una lista de las m谩s "peligrosas", en la que se verific贸 la penetraci贸n de todos los tejidos en otras partes del cuerpo.



Tambi茅n usamos una simulaci贸n de tejido para crear el efecto de llama FX en las armas y en la cabeza del jefe Shadow Mind. En la configuraci贸n de Tela para estos elementos, desactivamos la influencia de la gravedad y establecemos los valores de Aceleraci贸n a lo largo del eje Y: constante, para que la llama se mueva hacia arriba, y al azar, para el efecto de aleteo. Para que cuando se mueva no haya una distorsi贸n aguda de la geometr铆a, establecemos el valor aumentado de resistencia ( Amortiguaci贸n ). Por lo tanto, obtuvimos un efecto de llama bastante realista y barato en t茅rminos de rendimiento.





F铆sica determinista para PvP sincr贸nico


En el momento de la muerte y en ciertas situaciones, al ser golpeado por personajes en Shadow Fight 3, se activa una simulaci贸n de f铆sica. Durante mucho tiempo, se utiliz贸 la f铆sica de estado s贸lido de Unity para esto. Sin embargo, al introducir PVP s铆ncrono en el proyecto, tuvo que ser abandonado a favor de su propio desarrollo.

PVP s铆ncrono implica la misma simulaci贸n de un juego en dos clientes. No hay problemas con la animaci贸n, ya que todo se calcul贸 por adelantado, mientras que surgen ciertos problemas con la f铆sica.

El hecho es que los c谩lculos de coma flotante, que se usan dentro de la f铆sica en Unity, funcionan de manera diferente en procesadores de diferentes fabricantes. En este sentido, durante el juego, se acumulan errores en la posici贸n de los personajes: en un cliente, el personaje se ubica de manera diferente al otro. Y si fuera de la f铆sica, esta discrepancia puede corregirse f谩cilmente sincronizando peri贸dicamente la situaci贸n en funci贸n de los indicadores de uno de los clientes, entonces, en el momento de la inicializaci贸n de la f铆sica, debido al error inicial de la posici贸n, la simulaci贸n f铆sica se desarrolla de manera diferente en dos clientes.

Como resultado, el personaje est谩 significativamente en diferentes lugares y diferentes posiciones. Despu茅s de tal discrepancia, tarde o temprano surgir谩 una situaci贸n en la que los ataques se registrar谩n en un cliente y no en el otro.

La soluci贸n m谩s simple, a primera vista, es tomar la posici贸n del personaje en un cliente y transferirlo a otro mientras los sincroniza durante una simulaci贸n f铆sica. Pero el regdoll del personaje es una larga jerarqu铆a de huesos con una gran cantidad de s贸lidos independientes (extremidades, cabeza), para la sincronizaci贸n correcta de la posici贸n de la que necesita transferir una gran cantidad de datos en un corto per铆odo de tiempo. Esta opci贸n result贸 ser demasiado "costosa", por lo que decidimos escribir nuestra propia f铆sica, que ser铆a determinista. Para que podamos estar seguros de que en cualquier cliente los estados f铆sicos de los caracteres coinciden, independientemente del procesador en el que se realicen los c谩lculos.



Entonces, 驴cu谩l es nuestro regdoll? El cuerpo consta de nodos, que son puntos materiales, no tienen orientaci贸n, pero hay una posici贸n y una masa, y entre ellos se realizan enlaces de rigidez ajustable. Un grupo de tales nodos est谩 unido a cada hueso dentro del esqueleto del personaje. Esta arquitectura implica la ausencia de colisiones internas y limitaciones en las articulaciones, y las colisiones externas y la fricci贸n se implementan a nivel de nodo. Cuando los nodos se mueven en el espacio, se tienen en cuenta la gravedad, las fuerzas externas y la inercia.

Entre los nodos hay dos tipos de conexiones: costillas r铆gidas (azul) y m煤sculos el谩sticos (rojo). Las costillas desempe帽an el papel de huesos, obligando a los nodos a estar a cierta distancia entre s铆 y evitando que se dispersen en diferentes direcciones. Los m煤sculos de cualquier posici贸n inicial forman una pose determinada de los nodos, junt谩ndolos si la distancia entre ellos es mayor que el valor objetivo, y separ谩ndolos si es menor.



Eche un vistazo "debajo del cap贸" y vea c贸mo funciona. Primero, permitimos que los nodos se muevan libremente, luego ajustamos iterativamente los enlaces para que se recuperen a sus caracter铆sticas objetivo. Para una iteraci贸n de ajuste muscular, son necesarias dos iteraciones de ajuste de costillas. Al hacer que las costillas sean m谩s r铆gidas, podemos estar seguros de que las conexiones de las costillas no se romper谩n despu茅s de que los m煤sculos est茅n expuestos a los ganglios.



Como resultado, cuanto m谩s fuertes se desplacen los nodos en la etapa de libre movimiento, m谩s costos computacionales deben invertirse para restaurar las costillas y los m煤sculos. Para minimizar estos costos y el riesgo de interrupci贸n estructural, decidimos dividir el proceso iterativo en varios pasos. Es decir, en un cuadro varias veces se produce el libre movimiento de los nodos y su correcci贸n. En un paso, los nodos logran moverse mucho menos, y ajustarlos se vuelve mucho m谩s f谩cil. Por lo tanto, ahorramos seriamente la cantidad de iteraciones necesarias para ajustar las costillas y los m煤sculos.



El conjunto de longitudes musculares determina la pose objetivo, que el personaje busca desde cualquier posici贸n despu茅s de la transici贸n a una simulaci贸n f铆sica. Para evitar transiciones demasiado bruscas e interrupciones estructurales, hemos agregado la posici贸n de interpolaci贸n. En el momento de ingresar a la f铆sica, tomamos la pose actual del personaje y lo convertimos en el objetivo, y luego durante cincuenta fotogramas lo interpolamos a la pose objetivo preestablecida, obteniendo una transici贸n suave.



El principal problema que encontramos al usar nuestra f铆sica es la torsi贸n peri贸dica de las extremidades, principalmente los brazos. Esto se debe al hecho de que en el momento de la transici贸n a la f铆sica, el personaje puede estar en una posici贸n alejada del objetivo, a lo que sus m煤sculos se tensan. Para minimizar, y en el futuro, evitar por completo tales situaciones, se aplicaron varias medidas. En primer lugar, configuramos varias posturas objetivo para que los m煤sculos puedan apretar los nodos. En el momento en que ingresamos a la f铆sica, tomamos la postura actual, observamos cu谩l de las posturas objetivo preestablecidas est谩 m谩s cerca y apretamos los nodos a ella.



Inicialmente, al pasar a la f铆sica, los m煤sculos empujaron r铆gidamente los nodos, llev谩ndolos a la posici贸n deseada. A menudo, la agudeza de esta repulsi贸n tambi茅n condujo al hecho de que las extremidades se torcieron fuertemente. Agregamos un aumento suave en la fuerza muscular, lo que mejor贸 enormemente la situaci贸n. Durante los primeros dos fotogramas despu茅s del inicio de la simulaci贸n f铆sica, la fuerza muscular permanece en su m谩ximo para estabilizar los nodos despu茅s de aplicarles un impulso. Luego, los m煤sculos se relajan, su fuerza se convierte en un 55% y luego, en m谩s de 120 cuadros, la fuerza aumenta gradualmente hasta un 100%.



El 煤ltimo paso fue la adici贸n de dos nodos estabilizadores: el frente al nivel del pecho y la parte posterior al nivel de las piernas. Estos nodos tienen conexiones de costillas con nodos fijos del pecho y la pelvis, respectivamente, y los nodos inestables se tensan con los m煤sculos. Los nodos estabilizadores tienen un valor de masa bajo y no tienen una colisi贸n con el piso, a diferencia de otros nodos.



En el siguiente gif, ver谩 el resultado: obtuvimos una f铆sica completamente determinista, basada en c谩lculos enteros, trabajando de manera estable a 60 fps incluso en los dispositivos m谩s d茅biles que admitimos.



Sigue a Banzai Games en las redes sociales: Facebook , Vkontakte , Instagram , LinkedIn

El equipo de Banzai Games requiere un especialista en efectos visuales experimentado. Lea m谩s sobre la vacante aqu铆 .

Source: https://habr.com/ru/post/480108/


All Articles