web-dev-qa-db-fra.com

Déplacer le corps vers une position spécifique - Box2D

J'ai un b2Body que je voudrais déplacer à une certaine position cible. Je ne veux pas utiliser la fonction SetPosition. Comment puis-je y parvenir en utilisant:

  1. Modification des vitesses linéaires.
  2. Utilisation de mouseJoint. (La position cible est fixe. La souris n'est PAS impliquée.)

J'utilise Box2DAS3 2.1a. De l'aide dans toute autre langue serait également appréciée.

23
Anubhav Sharma

La manière la plus simple est en fait d'utiliser SetPosition/SetTransform(position,angle). Par exemple:

body->SetTransform(b2Vec2(0,0),body->GetAngle())

Évidemment, le saut instantané signifie que vous subvertissez la simulation physique, mais c'est le moyen le plus simple et le plus direct de définir la position d'un corps.

Étant donné que vous ne voulez pas utiliser SetPosition (qui est équivalent au code affiché ci-dessus), alors ApplyLinearImpulse avec la force appropriée (basée sur la masse et la vitesse actuelle du corps) fera l'affaire l'astuce, et est plus correct du point de vue de la simulation, mais risque d'être plus problématique compte tenu des effets secondaires potentiels, etc.

Quoi qu'il en soit, iforce2d couvrait SetLinearVelocity..., et j'ajouterais qu'une articulation de souris est très utile même lorsque la "souris" n'est pas impliquée.

48
Tom Guinther

Le moyen le plus simple serait de régler la vitesse linéaire du corps afin qu'il couvre la distance nécessaire en un seul pas de temps. par exemple. si le corps a besoin de déplacer (2,3) unités pour se rendre à l'emplacement souhaité et que votre pas de temps est de 60 Hz, vous pouvez définir la vitesse linéaire (120,180) pour un pas de temps. À l'étape de temps suivante, vous devrez bien sûr remettre la vitesse à zéro pour l'empêcher de voler au loin. Le résultat de ceci n'est pas très différent de si vous aviez utilisé SetTransform, sauf que CCD fonctionnera et si quelque chose est dans la façon dont il sera détraqué.

Si vous ne voulez pas que le corps arrive en une seule étape, limitez simplement la vitesse maximale qu'il peut avoir.

Si vous préférez utiliser ApplyForce/ApplyLinearImpulse, vous pouvez faire quelque chose de similaire, mais vous devez également prendre en compte la vitesse actuelle du corps. Vous pourriez trouver cette page utile, elle explique la version de rotation de celle-ci mais le principe est le même: http://www.iforce2d.net/b2dtut/rotate-to-angle

20
iforce2d