Por lo que entiendo, un sistema de armadura interactiva típico necesitaría cálculos sustanciales ya que cada componente afecta a todo el sistema. Creo que podría detenerse arbitrariamente en un número determinado de iteraciones a costa de la precisión en la simulación, pero no sé si ese es el enfoque que utilizan estos juegos (los juegos de construcción de puentes son un ejemplo de sistemas de armadura). Por otro lado, los juegos como Dig or Die tienen un sistema estructural bastante complejo que también tiene en cuenta el par (creo) y la compresión, y es muy rápido y funciona en sistemas muy extensos. Supongo que los cálculos básicos podrían ser similares, pero si no, estoy interesado en ambos enfoques.
¿Saben cómo se hacen? ¿Tienen una limitación arbitraria o utilizan un algoritmo completamente diferente? Además, supongo que todo lo que se les ocurra se puede aplicar a los sistemas 3D, pero si no es así o si no es obvio, al menos den una pista sobre cómo podrían usarlo para 3D, ya que estoy interesado en esto para 2D y 3D juegos.
Sé que se supone que no debo agradecer aquí, pero me parece injusto no agradecerle al menos su tiempo de antemano, espero que este párrafo no se elimine.
EDITAR: si tuviera que adivinar, diría que Dig or Die almacena vectores para cada bloque y luego ejecuta un algoritmo iterativo hasta el punto de que la precisión adicional en la simulación no tiene sentido para los límites del sistema (por ejemplo, el sistema sería demasiado grande para no colapsar de todos modos), por lo que está limitado por un número de iteraciones semi-arbitrarias (porque se basa en la aplicación). Pero podría estar equivocado.
Respuestas:
Soy el desarrollador de Dig or Die, así que puedo dar un poco más de detalles sobre la física del juego.
De hecho, el punto más crucial fue el rendimiento, ya que en el juego puedes construir miles de bloques físicos, y lo más importante es que tengo otras cosas más complejas para simular (lluvia / agua) para poder ahorrar muy poco tiempo de CPU para la física del edificio. .
Así que en realidad hice una especie de ... No sé, un algoritmo personal personalizado no muy preciso, pero funciona lo suficientemente bien para el juego. Tengo 1 vector para cada intersección de bloque (por lo que cada bloque está vinculado por hasta 4 vectores, uno a cada lado). Cada bloque tiene un "peso" y "empuja" los vectores a su alrededor (por igual) para que el total de la magnitud de los vectores sea igual a su altura. Cuando un bloque está anclado al suelo, todas las fuerzas / peso que se empujan hacia él nunca se "empujan" hacia atrás, por lo que, naturalmente, con suficientes iteraciones, todo el sistema encuentra un equilibrio. El peso / fuerza "fluirá" hacia los puntos de anclaje y gestionará muy bien los cambios en la estructura. Puede ver el resultado aquí (con el elemento "Gafas Eiffel" del juego):
Sobre los pares, lo simulo multiplicando las fuerzas que se transmiten horizontalmente. No es perfecto, pero es suficiente para sentir la gran diferencia entre construir horizontal y verticalmente
Pero, sinceramente, no me gusta mucho mi sistema, en algunos casos no es muy preciso; principalmente porque no manejo la compresión y extensión. Probablemente haya una manera de hacer una simulación más precisa que la mía sin más CPU, pero mis habilidades (y tiempo) al respecto fueron muy limitadas, así que hice lo que pude :-)
(PD: supones que fueron muy buenos :-))
fuente
Personalmente he tenido buen éxito con la relajación iterativa . Creo que sigue las leyes de la física bastante bien cuando se trata de objetos hechos de agregados de bloques. Creo que la serie BridgeBuilder se basa en dicho método, aunque no tengo una fuente para confirmarlo.
La relajación iterativa se usa ampliamente para trusses , pero he simulado con éxito grandes objetos sólidos (concreto) con ella: es simplemente un truss, cuyas articulaciones llevan carga en lugar de girar libremente.
Lo interesante es que la relajación es una técnica para resolver trusses estáticos, por lo que es precisa. En ese sentido, se usa para calcular iterativamente un desplazamiento que lleva una estructura al equilibrio.
Pero el valor agregado para un juego (donde estamos interesados en entornos dinámicos, porque las estructuras estáticas en equilibrio son aburridas) es que tenemos la oportunidad de desplazar las uniones de la estructura entre cada iteración, según las restricciones calculadas hasta ahora . Obtienes dos beneficios principales:
general , el análisis estático formula la hipótesis de una pequeña deformación , donde la estructura no se aleja mucho de su estado inicial. Dentro de estos límites, el análisis estático es correcto porque las articulaciones en realidad no están muy desplazadas . Pero a medida que la estructura se deforma bajo un peso desmoronado, obtendrá resultados precisos hasta el final con una simulación no lineal, mientras que simplemente obtendrá un estado no válido de un solucionador lineal
La relajación iterativa es bastante simple de implementar, la estabilidad numérica . He usado RK4 esquema tsuccessfully para lograr la estabilidad de las estructuras conrete grandes. El inconveniente es que generalmente tiene una rigidez bastante pequeña por razones de rendimiento, por lo que a veces puede parecer una gelatina blanda.
fuente