2011-09-21 5 views
0

J'ai une balle que vous soufflez avec de l'air. Je veux que la balle soit plus soufflée si elle est proche de la soufflante et qu'elle soit moins soufflée si elle est plus éloignée de la soufflante. J'utilise box2d et j'utilise la fonction impulse. "Body-> ApplyLinearImpulse (force, body-> GetPosition())". Je n'arrive pas à trouver une formule ou un moyen d'y parvenir. Si je veux que la balle atteigne une distance totale de 300 pixels, comment pourrais-je accomplir cela? S'il vous plaît aider.Combien de pixels est une impulsion dans box2d?

+1

voir ma modification s'il vous plaît – Andrew

Répondre

0

Je ne suis pas un expert en boîte 2d mais ce que je ferais est de créer une petite boîte qui est réellement invisible et laisser la balle frapper la boîte ... si le souffleur souffle plus je donnerais plus de vitesse à la boîte direction opposée. En ce qui concerne la longueur de 300 pixels est concerné, vous devez ajuster les forces et la vitesse de telle sorte que la balle va

300/<your_rendering_window_to_physics_world_ratio> 

dans le monde physique.

1

Si vous souhaitez calculer la distance avant la simulation, vous devez regarder les sources box2d. Lors de la simulation de la vitesse du corps est modifié en fonction de la gravité, les forces supplémentaires appliquées, l'amortissement linéaire, l'amortissement angulaire et éventuellement quelque chose de plus. La vitesse dépend également des itérations de vitesse.

Mais je pense que si vous voulez un mouvement vraiment lisse (comme d'un coup), vous feriez mieux d'utiliser la fonction applyForce au lieu de l'impulsion. Mais assurez-vous que vous appliquez la force à chaque étape de la simulation.

EDIT:

Vous pouvez également simuler la résistance à l'air: Fa = -k * V * V. J'ai simulé des mouvements dans le tuyau de cette façon. J'ai bien travaillé.

Ainsi, chaque étape, vous pouvez faire quelque chose comme ceci:

BlowForce = k1/distance; // k1 - coefficient 
Resistance = -k2 * V * V; //k2 - another coefficient 
TotalForce = BlowForce + Resistance; 
body->ApplyForce(TotalForce); 
-1

Force = masse * accélération, prenez donc la masse que vous définissez votre corps, calculer l'accélération que vous voulez (souvenez-vous de diviser 300px par PTM_RATIO) puis multipliez les deux ensemble.

+0

incorrect. Si votre corps a une accélération constante, il ne s'arrêtera pas. La vitesse sera changée comme v = a * t. L'exemple de ce que sera la gravité: accélération = 9.8. – Andrew

Questions connexes