Détection de collision de corde 2D


13

Je veux créer une corde qui peut entrer en collision avec des objets comme dans la vidéo YouTube suivante:

Corde de physique de jeu 2D

Je pense que vous implémentez l'intégration de verlet qui utilise des points et connecte ces points avec des lignes. J'essaie de comprendre quel type de détection de collision vous appliqueriez à la corde pour obtenir l'effet dans la vidéo.

Je pense que tu devrais faire un cd sur chaque point. Je voudrais utiliser box2D, donc je me demande si chaque point serait un corps rigide? Tout avis sera le bienvenu.


1
Si vous regardez attentivement la vidéo dans votre lien, il est clair que la "corde" simulée est en fait une chaîne, c'est-à-dire un grand nombre de segments inflexibles connectés en ligne, plutôt qu'une primitive flexible en continu. Ceci est plus évident lorsque la corde s'enroule autour du petit obstacle rond; vous pouvez voir les coins tourner autour de lui. Une chaîne est beaucoup, beaucoup plus facile à simuler qu'une corde continue; chaque lien n'est qu'une primitive de collision et ils sont attachés les uns aux autres de façon permanente. Pour un comportement plus convaincant, faites de chaque maillon un ressort très rigide plutôt que totalement inflexible.
Paul Z

Réponses:


6

Puisque vous utilisez Box2D, vous pouvez créer une série de rectangles et utiliser les joints de Box2D pour les joindre. Voilà votre corde.

Afin d'éviter que les coins ne sortent d'une corde pliée, je peux imaginer deux options:

  1. Donnez à vos segments de corde des extrémités arrondies (afin qu'ils ne soient plus des rectangles)
  2. Rendez cette corde elle-même invisible et utilisez-la uniquement pour la physique. Prenez les positions des articulations dans chaque trame et l' utiliser pour dessiner une corde à la volée que le joueur va voir.

Avertissement: je n'ai jamais essayé cela moi-même, mais je ne vois pas comment une série de rectangles joints peut échouer lorsque la vidéo que vous avez publiée affiche pratiquement la même chose déguisée.

Edit: Je viens de voir PaulZ et j'ai réalisé la même chose. Allez lire également son commentaire sur la question.


2

Un rapide Google l'a lancé ici . Une démo, une description et un code (en Flash) utilisant Box2D pour implémenter une simple corde. La corde entre en collision avec elle-même et le bloc en haut de la scène.


0

Voici ce que je ferais, faire de chaque point de la ligne un cercle, faire suffisamment de points pour que les cercles se chevauchent. Attachez chaque point à son voisin, plutôt que de collision standard, cette attache devrait faire en sorte que les points restent à une distance fixe les uns des autres.

Je ne connais pas Box2D, mais je suppose que la fonctionnalité requise est là.


0

À l'origine, Box2D avait une démonstration de pont de corde faite de boîtes minces jointes à des contraintes point à point; ce serait un bon endroit pour commencer (je ne sais pas s'il est toujours livré avec cette démo, mais il serait simple de recréer).

Il est assez facile d'implémenter une corde sous forme de particules avec des contraintes de distance indépendamment d'un simulateur de corps rigide (comme vous le mentionnez, en utilisant un schéma d'intégration et de résolution de contraintes Verlet comme celui décrit dans cet article: http://www.gamasutra.com/resource_guide/ 20030121 / jacobson_pfv.htm ), mais si vous voulez que les corps rigides réagissent à votre corde (comme dans la vidéo, avec la boîte pendante), cela devient beaucoup plus compliqué. Je commencerais par une suite complète d'outils comme Box2D et travaillerais en arrière plutôt que d'essayer de construire à partir de particules.


0

Je me souviens de ce jeu Allegro: Cupidon , de SpeedHack 2002. Il contient une implémentation pour des cordes qui entrent en collision avec le paysage. Voir les classes PhysParticles et HeartTrails dans le fichier heart_tails.cpp dans son code source .

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.