2017-10-20 13 views
1

Je suis nouveau avec pymunk et je voudrais mettre en œuvre une simulation n-corps (en 2D) comme celui-ci: https://www.youtube.com/watch?v=otIGNTFJwpU&feature=youtu.beComment implémenter la simulation n-body avec pymunk?

Je sais déjà comment créer l'espace, les formes et le rendu avec pygame. Ma question: est-il un moyen d'ajouter des forces de gravitation entre les formes dans pymunk?

Merci pour votre aide.

+0

Peut-être que vous pourriez montrer ce que vous avez essayé, ou décrire la recherche que vous avez faite? Comment avez-vous établi que cela ne peut pas être fait par pymunk? – barny

+0

Ok donc ce que j'ai déjà fait est de créer l'espace avec les corps. Maintenant, j'ai besoin de mettre en œuvre des forces de gravitation entre chaque paire de corps. Ma première supposition était d'utiliser 'pymunk.constraint' qui * décrit comment deux corps interagissent les uns avec les autres *. Cependant, cette classe contient seulement ["PinJoint", "SlideJoint", "PivotJoint", "GrooveJoint", "DampedSpring", "DampedRotarySpring", "RotaryLimitJoint", "RatchetJoint", "GearJoint", "SimpleMotor"] 'et il ne semble pas évident de modifier ces derniers pour reproduire la force de gravitation. – rronan

+0

S'il vous plaît pourriez-vous modifier votre question pour inclure le code que vous avez déjà (utilisez 4 espaces pour mettre en forme comme code). La méthode que vous voudrez probablement utiliser est une double boucle pour les corps de votre système. Ensuite, utilisez [l'inverse loi du carré] (https://en.wikipedia.org/wiki/Gravity#Newton.27s_theory_of_gravitation) pour calculer l'ampleur et l'utilisation [apply_force_at_local_point] (http://www.pymunk.org/en/ latest/pymunk.html # pymunk.Body.apply_force_at_local_point) au centre de l'objet. – cdo256

Répondre

1

Il n'y a pas de manière intégrée de le faire directement dans pymunk. Le plus simple est probablement de le calculer vous-même. Bouclez les corps et, pour chaque corps, faites une requête d'espace pour trouver les corps proches. Calculez la gravité résultante et utilisez l'impulsion d'application.

(Peut-être il est possible de emualte avec l'une des contraintes, par exemple l'articulation broche ou ressort amorti .. mais cela nécessitera une réflexion et d'expérimentation pour savoir si son possible et semble bon)

+0

Salut Viblo, merci pour votre réponse. Finalement, je suis entré dans le code source de Chipmunk et j'ai fait une copie de 'cpDampedSpring' si j'avais modifié' apply_impulse() '(voir ma fourchette [ici] (https://github.com/rronan/pymunk/blob/master/chipmunk_src/ src/cpGravitation.c)). Comme j'ai mis à jour le wrapper python aussi, je peux maintenant ajouter des contraintes de "gravitation" entre les objets et je n'ai pas besoin de faire la boucle moi-même. Cela semble fonctionner, mais si vous avez des idées pour le rendre meilleur, faites-le moi savoir. Et merci pour pymunk. – rronan

+0

Intéressant! Peut-être que vous pourriez faire un PR contre le principal repo de Chipmunk (https://github.com/slembcke/Chipmunk2D) au cas où cette contrainte serait utile pour plus de gens. – viblo