Sé muy bien cómo verificar las colisiones, pero no sé cómo manejar la colisión de una buena manera.
Simplificado, si dos objetos chocan, uso algunos cálculos para cambiar la dirección de la velocidad. Si no muevo los dos objetos, todavía se superpondrán y si la velocidad no es lo suficientemente grande, aún colisionarán después de la próxima actualización. Esto puede hacer que los objetos se atasquen entre sí.
Pero, ¿qué pasa si trato de mover los dos objetos para que no se superpongan? Esto suena como una buena idea, pero me di cuenta de que si hay más de dos objetos, esto se vuelve muy complicado. ¿Qué pasa si muevo los dos objetos y uno de ellos choca con otros objetos, así que también tengo que moverlos y pueden chocar con las paredes, etc.
Tengo en mente un juego 2D de arriba hacia abajo, pero no creo que tenga mucho que ver con eso. ¿Cómo se manejan generalmente las colisiones?
Esta pregunta se hace en nombre de Wooh
fuente
Respuestas:
Daniel Kodicek cubre este tema con gran detalle en su libro, Matemáticas y física para programadores .
Kodicek hace dos cosas para lograr una resolución de colisión de aspecto natural:
Subí una demostración basada en la detección y resolución de colisiones de Kodicek .
actualización: Aquí hay un algoritmo de detección y resolución de colisión que es muy similar al método de Kodicek. Con código fuente . Todavía recomiendo el libro de Kodicek, ya que su algoritmo se implementa de manera ligeramente diferente y se explica mucho más a fondo.
fuente
¿Qué pasa si comprueba la colisión antes de que los objetos se muevan, en lugar de después? O, en otras palabras, ¿rechaza la nueva posición si los objetos chocan, reutilizando la anterior en ese caso?
Pseudocódigo:
De esta manera, los objetos chocarán entre sí cuando estén a punto de colisionar , si su paso de actualización es lo suficientemente pequeño, el jugador no debería notar nada extraño en la representación.
fuente
Siempre que dos objetos se superpongan, verifique si se están acercando o alejando uno del otro. Haz la colisión solo si se mueven uno hacia el otro.
Es bastante fácil con las matemáticas vectoriales, simplemente calcula:
dot_product (B.posición - A.posición, A.velocidad - B.velocidad)
Si el resultado es positivo, los objetos se mueven uno hacia el otro.
fuente
Podría estar malinterpretando, pero parece que estás haciendo dos preguntas: 1. ¿Cuáles son algunas formas generales de lidiar con la resolución de colisiones? El término que estás buscando es 'simulación basada en impulsos', y hay un montón de documentos que puedo hacerlo mejor justicia que yo.
En resumen, desea acelerar su simulación física en el espacio de impulso, que es la masa por la velocidad (no haga las cosas basadas en la fuerza, su integrador no lo está haciendo bien de todos modos).
Para una respuesta angular, afortunadamente, los momentos de inercia mayores y menores siempre se pueden reducir a dos ejes ortogonales (en 2D), lo que significa que una matriz múltiple funcionará en general, y si los alinea con los ejes X e Y, se convierte en un vector 2D
Cuando tiene una colisión, calcula una respuesta basada en los momentos lineales y angulares en el punto de colisión, y un buen factor de fraude es, si tiene interpenetración, aplicar alguna fuerza de penalización (como se mencionó anteriormente) para separar los dos cuerpos.
Desde el punto en que terminará agregando más y más reglas para controlar el comportamiento aberrante, como limitar el momento angular máximo para que las cosas no giren como tops, etc., pero este es un buen comienzo.
Mantenlo simple si puedes.
La única forma real de hacerlo es con un sistema de ecuaciones lineales y mucha resolución. La forma práctica de hacerlo es tener un sistema como el anterior y hacer que la física se resuelva naturalmente con el tiempo.
La mayoría de los juegos que hacen cosas como rodar, o pararse sobre superficies en movimiento, tienen un modelo híbrido donde sus pies están unidos a una superficie (o ruedas a la carretera) para acomodar el paso del tiempo físico (lo que resultaría en ciclos de respuesta de interpenetración y no funcionaría)
Espero que esto ayude. Si necesita ejemplos matemáticos, hágamelo saber.
fuente
La forma en que esto generalmente se resuelve en los motores de física es aplicando una fuerza de penalización. Mover el cuerpo rígido después de la interpenetración no se verá bien si sus cuerpos rígidos se mueven a velocidades más altas (verá movimientos de sacudida momentáneos), aunque como primer paso, debe intentarlo y ver si se ajusta a sus necesidades.
A
penalty force
se aplica como un amortiguador de resorte, donde la fuerza de penalización aumenta cuanto más se ha penetrado el cuerpo rígido y se reduce en los cuadros posteriores. Piense en ello como resortes. Cuando dos cuerpos rígidos se entrecruzan, cada uno se encuentra con un resorte invisible que amortigua su progresión (es decir, evita una mayor penetración) y aplica lo mencionado anteriormentepenalty force
hasta que los cuerpos ya no penetran.Es un tema amplio, pero espero que la información anterior lo ayude a comenzar.
fuente