Comment créer une corde?


8

J'aimerais recréer ce jeu , mais je ne sais pas comment créer la corde ou ses influences sur le ballon.

entrez la description de l'image ici

Fondamentalement, il y a une corde, "attachée", à une extrémité, au pointeur de la souris, et à l'autre extrémité attachée à une boule massive. Lorsque l'utilisateur déplace sa souris, la corde et la balle suivent, comme si elles balançaient un fléau ou autre dans la vraie vie.

Comment pourrais-je créer une corde comme dans le jeu ci-dessus?

J'ai besoin de connaître les concepts de base et la physique derrière la création d'une telle corde, pas comment utiliser une bibliothèque préexistante pour en créer une. J'aimerais pouvoir implémenter une corde à partir de zéro, alors j'ai besoin de savoir comment cela peut être fait.

Merci!

Réponses:


3

La corde dans votre exemple n'est probablement qu'une simple articulation physique qui limite la distance de la balle au curseur de la souris. Ces joints sont généralement appelés "joint de corde" ou "joint de ressort".

Il semble que les ondulations de la chaîne ne soient pas basées sur une simulation physique réelle. Il s'agit très probablement d'une courbe de Bézier où les points de contrôle s'éloignent davantage de l'axe central lorsque la balle est plus proche de la position de la souris.

Bien que la réponse acceptée explique comment créer une corde réaliste dans le moteur physique, il est parfois préférable d'avoir une solution beaucoup plus simple (comme indiqué ci-dessus). La solution plus simple (avec un seul joint) améliore considérablement la stabilité de la simulation. Les articulations connectées multiples qui ont de grandes forces appliquées ont tendance à trembler et peuvent entraîner des chaînes d'articulations cassées et en mouvement irrégulier.

Bien sûr, vous pouvez également combiner les deux méthodes, en créant votre corde en tant que telle:

  1. Une chaîne de nœuds, reliés par des articulations
  2. Un joint corde / ressort du premier au dernier nœud de la chaîne qui garantit que vous ne pouvez pas tirer la chaîne plus loin qu'une distance maximale donnée (l'une des principales raisons pour lesquelles ces chaînes deviennent instables).

Cela se traduira par une chaîne plus réaliste (qui peut même réagir à d'autres objets dans le moteur physique), mais nécessitera plus de puissance de traitement qu'un simple joint à ressort avec un comportement de chaîne "faux".


Merci d'avoir fait remarquer cela! Comment les points de contrôle du bezier seraient-ils manipulés, car l'exemple semble très réaliste, pas simplement comme un bezier où il est redressé et "écrasé".
theonlygusti

Je ne pense pas que cela semble très réaliste du tout. Il ajoute juste quelques ondulations à la corde, il ne se plie pas ou quoi que ce soit ... pour moi, il semble qu'il soit juste redressé et écrasé.
bummzack

Mais j'ai remarqué que les courbes peuvent être à des angles différents les unes des autres; comment cela est-il réalisé?
theonlygusti

Ajouter des décalages aléatoires pour le rendre différent à chaque fois?
bummzack

D'accord, oui; il semble que c'est ainsi que cela a été fait dans le jeu, mais en fait (et cela semblera bizarre à tout le monde) le langage de programmation que j'utilise facilite la création d'un moteur physique comme la réponse de Kyranstar l'a souligné que de dessiner des courbes de Bézier.
theonlygusti

10

Fondamentalement, vous devrez créer un moteur physique. Une corde est conceptuellement un tas de «nœuds» reliés entre eux par des ressorts.

Fondamentalement, à chaque tick, chaque nœud exercera une force sur les nœuds au-dessus et en dessous proportionnelle à leur distance (ou à quelle distance de leur longueur d'étirement confortable ils sont). Si vous voulez attacher une balle, connectez-la simplement avec un joint à ressort au nœud inférieur de la corde.

C'est un excellent tutoriel pour créer un moteur physique, mais il n'entre pas vraiment dans les contraintes ou les articulations.

Voici un tutoriel couvrant les ressorts de base, ce qui devrait être tout ce dont vous avez besoin pour une corde comme ça.

Ceci est une corde créée dans mon moteur physique (très basique) . Il a évidemment quelques bizarreries (la vibration bizarre) mais c'est généralement ce que vous recherchez. Lorsque vous dessinez la corde, ne dessinez pas les nœuds.

Éditer:

Pour faire une belle corde, un "joint de corde" est en fait beaucoup plus joli et plus proche de votre exemple. Un joint de corde est essentiellement un ressort, mais il ne corrige les objets que lorsqu'ils sont trop éloignés (pas lorsqu'ils sont trop proches).

C'est ma corde avec un joint de corde à la place: entrez la description de l'image ici


"Lorsque vous tirez la corde, ne dessinez pas les nœuds." - m'a fait rire :) Merci d'avoir pris mon extrême noob-ishness en considération. La balle ne serait-elle alors qu'un autre nœud? D'une plus grande masse? (Chaque nœud a-t-il une masse?)
theonlygusti

Oui, ils le font! Généralement, la meilleure façon de calculer intuitivement les masses est de donner à chaque balle une densité et de simplement la multiplier par sa surface. Vous pouvez toujours modifier cela pour obtenir de meilleurs résultats dans votre jeu actuel.
Kyranstar

Normalement, j'implémenterais cela dans un langage orienté objet, avec une classe pour un nœud, avec une densité de propriétés, une masse, etc., mais je suis obligé d'utiliser un langage où la POO est presque impossible; comment mettriez-vous en place des nœuds, etc. sous ces contraintes?
theonlygusti

Pour être honnête, j'ai très peu d'expérience avec les langues non -OOP. Vous pouvez regarder Chipmunk2D , qui est un moteur physique écrit en C. Évidemment, vous aurez besoin d'un moyen de stocker ces données dans une unité cohérente.
Kyranstar

D'accord, merci; dernière question, le nœud gris est-il un nœud au sens des autres? Qu'y a-t-il de spécial pour qu'il reste immobile?
theonlygusti
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.