¿Cómo construyo un motor de física 2D? [cerrado]


20

Los juegos más avanzados que he creado son un juego de billar de 8 bolas hecho con el motor de física Box2dFlashAS3 y un juego de plataformas con niveles.

Cuando hacía juegos de plataformas, siempre quise saber cómo hacer un motor, para poder reutilizarlo. Cuando veo juegos que tienen pendientes, pendientes curvas, gravedad perfecta y física de la vida real, siempre he deseado saber cómo codificar el motor.

Sugiera técnicas y artículos para cualquier base de conocimiento relevante que sea necesaria.


Respuestas:


16

Si bien recomiendo no poner en marcha su propio motor de física por otra cosa que no sea la experiencia de hacerlo (solo tenga en cuenta que probablemente debería tirarlo cuando haya terminado; es realmente difícil resolver todos los problemas de límites de borde y estabilidad numéricos) , y su tiempo puede utilizarse mucho mejor contribuyendo a un motor existente), aquí hay algunos recursos:

Lecciones de la sala de billar: la detección rápida y precisa de colisiones entre círculos o esferas discute círculo / círculo y colisión esfera / esfera.

Los N Tutoriales son maravillosos para una comprensión básica de la detección y respuesta basadas en el Teorema del eje de separación.


9

Erin Catto tiene todas las conferencias de GDC sobre la implementación de Box2D en línea. Box2D también tiene un código sencillo para leer, en mi experiencia.


los pdf son materiales realmente duros. Pero, cuando leí los archivos cpp y h, como dijiste, son "comprensibles". Gracias.
Vishnu

+1. Box2D también tiene mucho cuidado con la estabilidad, una de las cosas que es muy difícil cuando estás rodando la tuya.
leander

5

Así es como puedes hacerlo:

Movimiento aproximado

Todo objeto de física necesita estos vectores:

  • Posición : donde está el objeto.
  • Velocidad : cómo está cambiando su posición.
  • Aceleración : cómo está cambiando su velocidad.

Entonces, intuitivamente, debes hacer este tipo de cosas en cada cuadro a cada objeto de física a:

a.speed    += a.acceleration
a.position += a.speed

Errores : esto se conoce como el método de integración de Euler . Esta aproximación es mejor para pequeñas velocidades y aceleraciones y con pequeños pasos de tiempo. En un juego, esto es normalmente cierto. Pero si un objeto se mueve muy rápido hacia una pared delgada o directamente hacia otro objeto en movimiento, puede saltarse la colisión con ese objeto cuando su posición se incrementa en una cantidad lo suficientemente grande como para cruzarlo por completo. Si tiene objetos que se mueven rápidamente, es posible que necesite Detección de colisión continua para salirse con la suya.

Colisión

La colisión se puede aproximar con este tipo de secuencia:

  1. Detección : se detecta que dos cuerpos se cruzan.
  2. Resolución : la posición de cada cuerpo cambia para que ya no se crucen.
  3. Física : la velocidad de cada cuerpo se cambia para tener en cuenta el impulso, la fricción y la restitución (rebote).

Esto se conoce como Detección de colisión discreta, ya que ocurre en puntos discretos en el tiempo. Cada paso merece atención:

Paso 1: detección de colisión (¿Están colisionando las cosas?)

Para dos círculos : solo verifique si sus centros están separados más que la suma de sus radios.

Para dos rectángulos : Verifique si alguna de sus coordenadas de esquina está dentro del otro rectángulo.

Para cualquier cosa que involucre polígonos más complejos , necesitará el Teorema del eje de separación , que es un tema para otra pregunta.

Errores : realmente hay muchos otros tipos de colisión que puede considerar. Algunos son realmente complejos: ¡los polígonos convexos pueden cruzarse varias veces !

Paso 2: resolución de colisión (separándolos)

Un método simple para resolver una colisión es la traducción por mínima penetración , utilizando valores obtenidos de la detección de colisión. Esto implica esencialmente separar los objetos con la mínima distancia de movimiento posible.

Como ejemplo, considere la colisión círculo-círculo donde uno de los círculos está fijo en su lugar. El vector de desplazamiento mínimo tiene la misma dirección que la diferencia entre sus vectores de punto medio. Su longitud es la diferencia entre la suma de sus radios y la distancia entre los centros.

Esta idea se generaliza fácilmente a otras formas.

Errores : si ambos objetos en colisión son móviles, es posible que tenga que moverlos una fracción de la distancia total para obtener una aproximación creíble de su movimiento. Obviamente tendrán que moverse en diferentes direcciones.

Paso 3: física de colisión (otros cambios)

Lo más obvio que suele suceder es que uno o dos de los objetos cambian de dirección, es decir, gira su vector de velocidad. Esto es bastante fácil de implementar.

Errores : los objetos pueden ser elásticos , pero pueden no serlo , en cuyo caso se reduce la energía total en el sistema. Es posible que necesite resistencia debido a la resistencia del aire. La fricción (particularmente la fricción estática ) es notoriamente compleja de implementar .

Algunas conclusiones

La simulación de la realidad es exponencialmente más difícil cuanto más quieras simular. Estás entrando en un campo minado de innumerables casos extremos, fórmulas increíblemente difíciles y montones cada vez mayores de trabajos de investigación.

Si sus necesidades son simples o está ansioso por aprender, pruébelo.

Si sus necesidades son complejas o no le gustan las matemáticas, obtenga un motor de física para pasar por alto los detalles por usted. Box2D y Bullet son bastante populares en los juegos.




Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.