2016-10-29 5 views
0

Je travaille actuellement sur une couche d'abstraction 2D en physique qui peut utiliser Box2D ou Chipmunk2D comme moteur physique. J'ai d'abord utilisé Chipmunk2D et je suis en train de mettre en place Box2D. L'un des problèmes que j'ai rencontrés était la vitesse maximale de Box2D (telle que définie par b2_maxTranslation). Pour résoudre ce problème, j'ai décidé de redimensionner le monde afin qu'il corresponde mieux aux unités Box2D.Scaling Physics World

Actuellement, je suis mise à l'échelle vers le bas avec un facteur constant:

  • positions (y compris les définitions de fixation du polygone et le rayon du cercle)
  • forces (avant d'appeler b2Body :: ApplyForce)
  • impulsions (avant d'appeler b2Body :: ApplyLinearImpulse)

Comme j'utilise des densités pour définir les appareils, cela réduirait également les masses corporelles.

Ce que j'ai remarqué est, cela ne fonctionne pas. Chaque fois que j'applique une force, le corps bouge beaucoup plus vite que lorsque la balance est haute.

Y at-il autre chose que je dois à l'échelle pour que les organismes sont mis à jour correctement ou devrais-je échelle les impulsions et les forces d'une autre manière?

Répondre

0

Étant donné une échelle X qui adapte la géométrie, je fini par faire ce qui suit (je ne l'ai pas pris la peine de mise à l'échelle l'effet d'amortissement):

Velocity (SetLinearVelocity) - linéaire

force (ApplyForce) - cubique

Position (tout appareil def CreateFixture) - linéaire

de masse (GetMass) - place

Gravity (sETG ravity) - Linear

Impulse résoudre (PostSolve WorldManifold.normal) - inverse cubique

  • linéaire = X * facteur conçu
  • carré = X * X * facteur conçu
  • cubique = X * X * X * facteur conçu

J'ai fait plusieurs tests avec ces facteurs et ils semblaient bien fonctionner en préservant les vitesses angulaires ainsi que le mouvement linéaire (j'en ai essayé plusieurs autres qui ont échoué juste cela). Voir https://bitbucket.org/Kipt88/polymorph/src/b4d29e2434a2ed1eda2183f9e16f4782c40ee026/modules/physics2d/files/source/box2d/?at=master pour référence (le code source n'est plus maintenu).

0

je ne voudrais pas l'échelle du monde pour éviter de heurter le réglage b2_maxTranslation. Je garderais toutes les unités de physique normalisées aux unités de MKS et augmenterez le paramètre b2_maxTranslation ou augmenterez la fréquence de la fonction d'étape.

Par exemple, si je voulais doubler la vitesse max, je soit deux fois plus compilé en valeur b2_maxTranslation (2.0f-4.0f), ou je courrais deux fois plus de méthodes d'étape et ont chacun simulent la moitié des période de temps je l'aurais sinon simuler. Avec toutes les unités normalisées à MKS, Box2D prendra ces unités directement et j'imagine que Chipmunk le ferait aussi.

Pour un moteur qui n'a pas utilisé les valeurs mises à l'échelle des unités MKS cependant, j'ÉCHELLE les valeurs aux unités de ce moteur de MKS.

Espérons que cela aide.

+0

Bien qu'une bonne suggestion, pas une réponse car elle ne dit pas comment mettre à l'échelle les valeurs. Je posterai une réponse séparée pour montrer comment j'ai fini par le faire. –