2009-07-03 10 views
3

Je modélise une simulation de physique basée sur la force où plusieurs particules interagissent entre elles. Les particules peuvent se déplacer de telle sorte qu'une fenêtre statique peut facilement en perdre la trace (imaginez que tout le groupe de particules quitte l'écran vers la droite et que la fenêtre affiche un fond vide).Déplacement d'objets dans la fenêtre du centre de masse

Ma solution actuelle consiste simplement à suivre le «centre» des particules en trouvant le min/max des x et des y et de faire suivre le milieu de la fenêtre. Cela fonctionne bien (pas besoin de trouver le vrai centre de masse). Voici un visuel:

Viewport

Mon problème est que je tente d'ajouter la possibilité de faire glisser manuellement des particules avec la souris. Je n'ai pas trouvé un moyen élégant de le faire. Le problème est la traduction entre les coordonnées de la fenêtre et les coordonnées de la simulation changent constamment car la fenêtre suit le centre des particules. Lorsque je souris sur une particule, je veux qu'elle ait un emplacement fixe dans la simulation (elle ignore toutes les forces sur elle). Lorsque je déplace la souris avec le bouton enfoncé, je veux que la particule se déplace dans la simulation. J'ai atteint ceci. Cependant, il produit des effets secondaires désagréables à cause de la fenêtre et des autres particules qui sont encore en mouvement. La particule ne se déplace pas dans la simulation lorsque la souris est enfoncée et immobile, mais elle se déplace sur l'écran parce que le centre de toutes les particules change et que la fenêtre s'ajuste en conséquence. Le curseur est stationnaire, de sorte que la particule "sort" de dessous. Lorsque la souris est légèrement déplacée, la particule se téléporte sous le curseur car la nouvelle position du curseur représente des coordonnées de simulation radicalement différentes.

Des suggestions pour une expérience utilisateur agréable et cohérente sans les effets secondaires ci-dessus?


Je l'ai déjà pensé:

  • Mise en pause de la simulation alors que la souris est en baisse
  • Suspendre change viewport alors que la souris est vers le bas
  • Déplacer le curseur de la souris que la fenêtre changements (vraiment mauvais)

Mais ils ont tous d'autres effets secondaires ou t éliminer la valeur de la simulation.

Aussi, je pense que cette question est agnostique de langage et de plate-forme donc ne pas attacher des significations littérales et spécifiques à l'implémentation à "viewport", "coordonnées de viewport", ou "coordonnées de simulation". Traitez-les comme des concepts graphiques génériques.

Répondre

1

Modifiez l'algorithme qui ajuste la fenêtre pour utiliser la position du curseur comme origine de la transformation. De cette façon, la fenêtre et les coordonnées de simulation sur le curseur resteront fixes. Vous pouvez simplement le faire lorsque la souris est pressée, mais il peut également avoir des résultats agréables si cela a été fait à tout moment.

Cela complique un peu les maths, mais il ne semble pas que vous ayez trop d'options.

+0

C'est très intrigant, je n'ai jamais pensé à ça. Il y aurait un saut rapide sur la souris, mais il serait agréable de faire glisser la particule. Je reviendrai vers toi :-) – colithium

1

Je ne pense pas qu'il soit nécessaire d'interrompre la simulation. Comme vous le décrivez, il semble que l'entrée de votre souris (voir l'entrée) modifie directement les données du modèle et que la vue soit mise à jour en conséquence lors de la prochaine mise à jour/flush/quoi que ce soit. Peut-être que vous pourriez insérer une nouvelle particule unique qui est seulement utilisée pendant "animation", et qui n'est couplée à aucune des autres particules. En introduisant cette particule, vous pourriez cacher la particule réelle (et ses bords). Ainsi, tout en déplaçant la souris, vous ne faites que mettre à jour les données de cette particule animée. Lorsque l'animation se termine (vous laissez la souris partir), l'objet animé est supprimé, la particule réelle est mise à jour avec ses données et affichée à nouveau.

D'une certaine façon, il s'agit d'une forme de pause, car vous trichez le système de mise à jour. Les données du système de particules ne sont pas mises à jour pendant l'animation, il semble que vous déplacez la particule du système réel, alors que vous êtes en train de tromper l'utilisateur graphiquement. J'espère que cela a du sens, 2 heures ici :)

+0

Ce serait une option, sauf que dans l'état actuel des choses, la particule sélectionnée affecte les AUTRES particules, elle n'en est pas affectée elle-même. J'ai besoin de garder la particule "dans" la simulation. Donc malheureusement, je ne peux pas jouer des tours graphiques – colithium

Questions connexes