Voici un article qui contient des liens vers des articles sur des types de simulations similaires (dans des contextes d'ingénierie / universitaires plutôt que pour des jeux): https://gamedev.stackexchange.com/a/10350/6398
J'ai essayé au moins deux approches différentes de détection de collision + réponse pour ce type de simulation "en fil" (comme dans le jeu Umihara Kawase); du moins, je pense que c'est ce que vous recherchez - il ne semble pas exister de terme spécifique pour ce type de simulation, j'ai plutôt tendance à l'appeler "fil" plutôt que "corde" car il semble que la plupart des gens Considérons que "corde" est synonyme de "chaîne de particules". Et, si vous voulez le comportement insaisissable de la corde ninja (c’est-à-dire qu’elle peut pousser ET tirer), il s’agit plus d’un fil rigide que d’une corde. En tous cas..
La réponse de Pekuja est bonne, vous pouvez implémenter la détection de collision continue en résolvant le moment où la zone signée des trois points est 0.
(Je ne peux pas me rappeler complètement OTOH mais vous pouvez l’approcher comme suit: trouvez le temps t où le point a est contenu dans la ligne passant par b, c, (je pense que j’ai fait cela en résolvant pour quand dot (ab, cb) = 0 pour trouver les valeurs de t), puis avec un temps valide 0 <= t <1, trouve la position paramétrique s de a sur le segment bc, c'est-à-dire a = (1-s) b + s c et si a est compris entre b et c (c'est-à-dire si 0 <= s <= 1) c'est une collision valide.
AFAICR, vous pouvez aussi l’approcher dans l’inverse (c’est-à-dire résoudre le problème et ensuite le brancher pour le trouver), mais c’est beaucoup moins intuitif. (Je suis désolé si cela n’a aucun sens, je n’ai pas le temps de fouiller dans mes notes et cela fait quelques années!)
Ainsi, vous pouvez maintenant calculer toutes les heures auxquelles des événements se produisent (par exemple, les nœuds de corde doivent être insérés ou supprimés); traiter l'événement le plus ancien (insérer ou supprimer un nœud), puis répéter / recurse jusqu'à ce qu'il n'y ait plus d'événements entre t = 0 et t = 1.
Un avertissement à propos de cette approche: si les objets que la corde peut enrouler sont dynamiques (surtout si vous les simulez ET leurs effets sur la corde, et inversement), il peut y avoir des problèmes si ces objets se coupent ou passent entre eux. autre - le fil peut devenir emmêlé. Et il sera certainement difficile d’empêcher ce type d’interaction / mouvement (les coins d’objets se glissant les uns dans les autres) dans une simulation physique de style box2d. Dans ce contexte, une faible pénétration entre les objets constitue un comportement normal.
(Du moins .. c'était un problème avec l'une de mes implémentations de "wire".)
Une solution différente, beaucoup plus stable mais qui omet certaines collisions dans certaines conditions, consiste simplement à utiliser des tests statiques (c’est-à-dire, ne vous préoccupez pas de la chronologie, divisez simplement chaque segment en collision au fur et à mesure que vous les trouvez), ce qui peut être beaucoup plus robuste - le fil ne s'emmêlera pas dans les coins et une petite pénétration suffira.
Je pense que l'approche de Pekuja fonctionne pour cela aussi, cependant il existe des approches alternatives. Une approche que j’ai utilisée consiste à ajouter des données de collision auxiliaires: à chaque sommet convexe v du monde (c.-à-d. Les coins des formes que la corde peut enrouler), ajoutez un point u formant le segment de droite dirigé uv, où u est un pointez "dans le coin" (c'est-à-dire dans le monde, "derrière" v; pour calculer u, vous pouvez projeter un rayon vers l'intérieur à partir de v le long de sa normale interpolée et vous arrêter quelque part après v ou avant que le rayon ne se croise avec une arête du monde et quitte la région solide ou vous pouvez simplement peindre manuellement les segments dans le monde à l’aide d’un éditeur / outil visuel).
Quoi qu'il en soit, vous avez maintenant un ensemble de "linesegs de coin" uv; pour chaque uv et chaque segment ab du fil, vérifiez si les intersections ab et uv (par exemple, une requête d'intersection linéaire, booléenne lineseg-lineseg); si c'est le cas, recurse (divise le lineseg ab en av et vb, c.-à-d. insère v), en enregistrant dans quelle direction la corde est courbée en v. est le même que lorsque b a été généré (tous ces tests de "direction de pliage" ne sont que des tests de zone signée); sinon, fusionnez les deux segments en un courant alternatif (c.-à-d. supprimez b).
Ou peut-être que j'ai fusionné et que je me suis séparé, j'oublie - mais cela fonctionne définitivement dans au moins un des deux ordres possibles! :)
Avec tous les segments de fil calculés pour le cadre actuel, vous pouvez alors simuler une contrainte de distance entre les deux extrémités du fil (et vous pouvez même impliquer les points intérieurs, c'est-à-dire les points de contact entre le fil et le monde, mais c'est un peu plus compliqué. )
Quoi qu'il en soit, j'espère que cela vous sera utile ... les articles de l'article que je vous ai lié devraient également vous donner quelques idées.