Moteur physique
Le moteur physique est la partie du jeu qui se charge de gérer le mouvement des objets et de détecter les collisions. Tout ce qui concerne le moteur physique est dans l'espace de noms bear::universe dans le module du même nom.
Sommaire |
Description d'un objet
L'objet de base de la physique est un rectangle avec une masse, une position, une vitesse, une accélération, ainsi que des paramètres de friction : la friction appliquée par l'environnement et la friction interne à l'objet. Le comportement individuel d'un objet peut être redéfini en surchargeant la méthode progress(time_type). Par défaut, les objets ne font rien.
On distingue deux catégories d'objets : les objets fixés (les murs, les sols, etc.) et les objets vivants. Les premiers ont une durée de vie égale à celle du monde et ne bougent jamais, tandis que les seconds peuvent disparaître à tout moment et changer de position.
Lorsque deux objets sont en collision, leurs méthodes collision(collision_info) sont appelées. Celle-ci peut être redéfinie pour affiner la réaction des objets. Par défaut, les objets en collision ne font rien.
Plusieurs paramètres peuvent modifier la façon dont le monde considère les objets. Les fantômes sont des objets qui ne peuvent pas être déplacés par un autre objet lors du traitement des collisions. Inversement, un drapeau nommé can_move_items permet d'indiquer si un objet peut en déplacer un autre lors d'une collision. Les objets globaux sont pris en compte à chaque étape de l'évolution du monde, contrairement aux autres qui ne sont considérés que s'ils sont dans une région donnée.
Voir aussi
Description d'un monde
Le monde est constitué d'un ensemble d'objets et d'une physique. L'évolution du monde se fait itérativement en lui passant la durée de l'évolution et une liste de régions dans lesquelles récupérer les objets. Cette évolution se fait en deux grandes étapes. À la fin de ces étapes, les objets sont informées de leur arrivée ou de leur sortie de la zone d'activité.
Évolution et mouvements
Dans l'étape de l'évolution et du mouvement, les objets situés dans ces régions sont récupérés. Les objets globaux sont eux aussi récupérés, même s'ils sont en dehors des régions. Chaque objet est mis à jour individuellement via un appel à sa méthode progress(time_type), en lui passant la durée de l'évolution.
Ensuite, la cinétique des objets non fixes est mise à jour. Les forces des liens sont ajoutés aux forces appliquées aux objets, puis leurs positions sont calculées par un appel à leur méthode move(time_type). Par défaut, cette méthode calcule la nouvelle position et la nouvelle vitesse de l'objet soit par l'application d'un mouvement forcé, soit par l'application d'une accélération déterminée à partir des forces qui lui sont appliquées. Si le mouvement de l'objet dépend d'un autre, la cinétique de cet autre objet est mise à jour prioritairement.
Détection des collisions
Les collisions entre objets sont calculées après que ceux-ci aient été déplacés. Pour chaque objet sélectionné, un voisinage est créé avec tous les objets en collisions avec lui. La plus grande masse parmi ces voisins et l'aire de la collision correspondante sont associés à l'objet. Puis, celui qui fait intervenir la plus grande masse puis la plus grande aire parmi tous les objets est sélectionné. Son voisin qui a la plus grande masse puis la plus grande aire est ensuite récupéré, puis la collision entre ces deux objets est corrigée par un appel à collision(collision_info) sur chacun des deux objets.
Comme cette correction peut modifier la position des objets, le voisinage, la masse et l'aire de la collision sont mis à jour. Puis la procédure de sélection recommence, et ce jusqu'à ce que toutes les collisions soient traitées. De nouveaux objets peuvent apparaître du fait des ces déplacements. Ceux-ci seront ajoutés dans la correction des collisions, mais leurs méthodes move(time_type) et progress(time_type) ne seront pas appelées.
Éléments avancés
Mouvements forcés
Les mouvements forcés sont des mouvements appliquables à des objets, en remplacement des équations la physique. Ils permettent d'avoir un contrôle précis sur les objets. D'un autre coté, si un objet en mouvement forcé est aligné par un mur, aucun résultat n'est garanti.
Liens entre objets
Les liens permettent d'appliquer une force entre deux objets. Typiquement, un ressort ou un élastique sera représenté sous cette forme.