2011-05-29 4 views
20

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

  1. Changer les vitesses linéaires.
  2. En utilisant mouseJoint. (La position de la cible est fixe La souris n'est PAS impliquée.)

J'utilise Box2DAS3 2.1a. L'aide dans n'importe quelle autre langue serait également appréciée.

+0

voulez-vous dire son ancrée à un seul endroit et vous voulez qu'il soit déplacé autour ou voulez-vous pour passer à un certain endroit et y rester? S'il vous plaît élaborer dans tous les cas. – Shannon

Répondre

41

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

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

De toute évidence, le saut instantané signifie que vous subverti la simulation de la physique, mais il est le plus simple moyen le plus direct pour régler la position d'un corps. Étant donné que vous ne voulez pas utiliser SetPosition (ce qui équivaut 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, et est plus correct du point de vue de la simulation, mais susceptible d'être plus problématique compte tenu des effets secondaires potentiels, etc.

Quoi qu'il en soit, iforce2d a couvert SetLinearVelocity ..., et j'ajouterais qu'un joint de souris est très utile même quand la "souris" n'est pas impliquée.

+1

Merci, corps-> setTransform (b2Vec2 (0,0), corps-> GetAngle()) a fait pour moi ... Ce –

+0

est parfait, merci. –

+0

Pourquoi je ne peux pas voir l'animation après avoir appliqué ceci? Il apparaît à la position déterminée comme 'setPosition' – TomSawyer

19

La façon la plus simple serait de régler la vitesse linéaire du corps de sorte qu'il couvre la distance nécessaire à un pas de temps. par exemple. Si le corps a besoin de déplacer (2,3) unités pour arriver à l'endroit désiré et que votre temps est de 60Hz, vous pouvez SetLinearVelocity (120,180) pour un pas de temps. Au prochain pas de temps, vous devrez bien sûr remettre la vélocité à 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 le chemin, il sera bloqué.

Si vous ne voulez pas le corps pour arriver à un pas de temps, limiter seulement la vitesse maximale qu'il peut avoir.

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

Questions connexes