Detección de colisión de cuerdas 2D

13

Quiero crear una cuerda que pueda chocar con objetos como en el siguiente video de YouTube:

Cuerda de física de juego 2D

Estoy pensando que implementas la integración verlet que usa puntos y conecta estos puntos con líneas. Estoy tratando de averiguar qué tipo de detección de colisión aplicarías a la cuerda para obtener el efecto en el video.

Estoy pensando que tendrías que hacer un CD para cada punto. Me gustaría usar box2D, así que me pregunto si hacer que cada punto funcione como un cuerpo rígido. Cualquier consejo sería apreciado.

Joey Green
fuente
1
Si observa cuidadosamente el video en su enlace, está claro que la "cuerda" que se simula es en realidad una cadena, es decir, una gran cantidad de segmentos inflexibles conectados en una línea, en lugar de una primitiva continuamente flexible. Esto es más obvio cuando la cuerda se envuelve alrededor del pequeño obstáculo redondo; puedes ver las esquinas girando a su alrededor. Una cadena es mucho, mucho más fácil de simular que una cuerda continua; cada enlace es solo una primitiva de colisión y están unidos permanentemente entre sí. Para un comportamiento más convincente, haga que cada enlace sea un resorte muy rígido en lugar de totalmente inflexible.
Paul Z

Respuestas:

6

Como está utilizando Box2D, puede crear una serie de rectángulos y usar las uniones de Box2D para unirlos. Ahí tienes tu soga.

Para evitar que las esquinas sobresalgan de una cuerda doblada, puedo imaginar dos opciones:

  1. Dé a sus segmentos de cuerda extremos redondeados (para que ya no sean rectángulos)
  2. Haz que esta cuerda sea invisible y úsala solo para física. Tomar las posiciones de las articulaciones en cada cuadro y usarlo para dibujar una cuerda sobre la marcha que el jugador va a ver.

Advertencia: nunca he intentado esto yo mismo, pero no puedo ver cómo una serie de rectángulos unidos puede fallar cuando el video que publicó muestra prácticamente lo mismo disfrazado.

Editar: acabo de ver a PaulZ y me di cuenta de lo mismo. Ve a leer su comentario sobre la pregunta también.

doppelgreener
fuente
2

Un rápido Google arrojó esto aquí . Una demostración, descripción y código (en Flash) usando Box2D para implementar una soga simple. La cuerda choca consigo misma y el bloque en la parte superior de la escena.

Roger Perkins
fuente
0

Esto es lo que haría, hacer que cada punto de la línea sea un círculo, hacer suficientes puntos para que los círculos se superpongan. Ate cada punto a su vecino, en lugar de una colisión estándar, esta atadura debería hacer que los puntos se mantengan a una distancia fija entre sí.

No conozco Box2D, pero supongo que la funcionalidad requerida está ahí.

aaaaaaaaaaaa
fuente
0

Originalmente, Box2D tenía una demostración de puente de cuerda hecha de cajas delgadas unidas con restricciones punto a punto; ese sería un buen lugar para comenzar (no sé si todavía se incluye con esa demostración, pero sería sencillo recrearlo).

Es bastante fácil implementar la cuerda como partículas con restricciones de distancia independientemente de un simulador de cuerpo rígido (como usted menciona, utilizando un esquema de integración de Verlet y resolución de restricciones como el que se describe en este artículo: http://www.gamasutra.com/resource_guide/ 20030121 / jacobson_pfv.htm ), pero si desea que los cuerpos rígidos reaccionen a su cuerda (como en el video, con la caja colgante), entonces se vuelve mucho más complicado. Comenzaría con un conjunto completo de herramientas como Box2D y trabajaría hacia atrás en lugar de intentar construir a partir de partículas.

barco365
fuente
0

Recuerdo este juego de Allegro: Cupido , de SpeedHack 2002. Contiene una implementación para cuerdas que chocan con el paisaje. Vea las clases PhysParticles y HeartTrails en el archivo heart_tails.cpp en su código fuente .

dacap
fuente