Qt et Box2D c'est facile

| Andreas | Qt Labs |

Traducteur

Jonathan Courtois

Vous trouvez votre vue graphique trop statique ? Vous avez envie de l'animer, mais vous ne voulez pas gérer le moteur physique vous-même ? Cette chronique vous présente Box2D qui s'occupe de toute la partie physique et qui peut facilement être lié avec Qt.

N'hésitez pas à ajouter vos commentaires !
Commentez

- Titre : Qt et Box2D c'est facile

- Auteurs : Andreas, Qt Labs

- Traducteur : Jonathan Courtois

- Parution : 26 février 2010

- Mise à jour : 5 janvier 2019

- Licence : Copyright ® 2010 Andreas. Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc. sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts.

Sommaire

- I. L'article original

- II. Introduction

- III. Installation

- IV. Fonctionnement

- V. Conclusion

- VI. Divers

I - L'article original

Les Qt Labs Blogs sont des blogs tenus par les développeurs de Qt, concernant les nouveautés ou les utilisations un peu extrêmes du framework.

Nokia, Qt et leurs logos sont des marques déposées de Nokia Corporation en Finlande et/ou dans les autres pays. Les autres marques déposées sont détenues par leurs propriétaires respectifs.

Cet article est la traduction du billet Qt + Box2D is easy!, par Andreas.

II - Introduction

Box2D est un moteur physique 2D de corps rigide (rigid body) open source pour le langage C++. Il est actuellement (2.0.1) disponible sous la licence MIT, qui est plutôt tolérante. Box2D est utilisé, entre autres, par Gluon (http://gluon.tuxfamily.org/), qui est une bibliothèque de jeux pour KDE.

III - Installation

L'intégration de Box2D dans votre application Qt est plutôt facile et cet article vous montre par où commencer. Tout d'abord :

- étape 1 : télécharger Box2D sur Google Code : http://code.google.com/p/box2d/ ;

- étape 2 : le compiler (j'ai du insérer quelques #include <cstring> pour réussir à le compiler) ;

- étape 3 : compiler et essayer l'application test bed : Box2D/Examples/TestBed/ ;

- étape 4 : lire le manuel : http://www.box2d.org/manual.html ;

- étape 5 : continuer de lire cet article pour lier ces deux frameworks...

La bibliothèque ne semblait pas s'installer, alors j'ai juste compilé le code source et je l'ai utilisé directement.

IV - Fonctionnement

Ce que j'ai découvert pendant mes deux heures d'études aujourd'hui, c'est que Box2D gère un monde avec des corps semblables à la gestion des objets de QGraphicsScene. En bref, vous créez un objet monde (world object) et vous le remplissez avec des éléments. Certains corps sont statiques, par exemple le sol, les autres sont dynamiques, comme une balle rebondissante. Vous pouvez définir des articulations, des masses, des frottements et d'autres paramètres, définir un vecteur de gravité, puis démarrer la simulation. Box2D ne nécessite pas de système graphique, tout graphe de scène avec des éléments que vous pouvez déplacer et faire pivoter devrait fonctionner. La vue graphique (QGraphicsView) fonctionne très bien. J'ai basé ce code sur l'exemple « Hello World » qui est fourni avec Box2D.

L'objet monde définit les limites du système de coordonnées et le vecteur de gravité. Il paraît très proche de QGraphicsScene. Selon la documentation, les limites ne sont pas appliquées, mais j'ai eu de nombreux échecs d'exécution lorsque les éléments sont en dehors de ces limites. Vous devriez donc définir le monde suffisamment large pour englober l'ensemble de vos éléments.

// Define world, gravity
b2AABB worldAABB;
worldAABB.lowerBound.Set(-200, -100);
worldAABB.upperBound.Set(200, 500);
b2World world = new b2World(worldAABB,
/* gravity = */ b2Vec2(0.0f, -10.0f),
/* doSleep = */ true);

Les corps dans Box2D ont une position et un angle ; vous pouvez leur assigner une forme (polygone convexe ou circulaire). Cela semble similaire à QGraphicsItem, qui possède également une position et une transformation. En fait, avec la version 4.6 de Qt, la propriété de rotation correspond parfaitement à celle de l'angle dans Box2D (à l'exception du fait que Box2D utilise des radians et effectue les rotations dans le sens opposé à celui de QGraphicsItem). Cet exemple montre comment créer un corps, puis lui attribuer une forme rectangulaire :

b2BodyDef bodyDef;
bodyDef.position.Set(0.0f, -10);
b2Body *body = world->CreateBody(&bodyDef);

b2PolygonDef shapeDef;
shapeDef.SetAsBox(100.0f, 10.0f);
body->CreateShape(&shapeDef);

Les corps peuvent être statiques ou dynamiques. Les corps statiques ne se déplacent pas, tout simplement. Par défaut, les corps sont statiques. Pour rendre un corps dynamique, vous lui affectez une masse positive. Le moyen le plus simple de faire cela est de demander à Box2D de calculer la masse et l'inertie de rotation en regardant la forme du corps. Ainsi, on peut légèrement modifier le code ci-dessus :

shapeDef.density = 1.0f;
shapeDef.friction = 0.5f;
body->CreateShape(&shapeDef);
body->SetMassFromShapes();

C'est vraiment tout ce qu'il y a à faire. Lorsque vous êtes prêt, avancez dans la simulation étape par étape en appelant b2World::Step comme ceci :

world->Step(B2_TIMESTEP, B2_ITERATIONS);

Après avoir appelé cette fonction, Box2D aura les positions et les angles ajustés pour tous les corps. Donc, si vous avez des items correspondants dans la vue graphique, vous pouvez simplement mettre à jour leur position et rotation comme ceci :

void adjust()
{
// Update QGraphicsItem's position and rotation from body.
b2Vec2 position = _body->GetPosition();
float32 angle = _body->GetAngle();
setPos(position.x, -position.y);
setRotation(-(angle * 360.0) / (2 * PI));
}

Notez la valeur négative de Y (comme la vue graphique et le reste de Qt, Box2D a une composante Y orientée vers le bas) et la rotation négative qui est convertie en degrés.

V - Conclusion

C'est vraiment tout ce qu'il y a à faire. Créer le monde, ajouter des corps, leur attribuer une masse et lancer la simulation. Utilisez l'angle et la position pour ajuster vos QGraphicsItems et amusez-vous avec.

Animation en format "youtube" non supportée.
Contenu uniquement consultable en ligne à cette adresse :
https://www.youtube.com/v/U5xyrKy0sj8?version=3&feature=player_detailpage

La vidéo ci-dessus montre ma première application Box2D et Graphics View en action. Vous pouvez trouver les sources complètes ici : qgv-box2dtar.gz. J'ai essayé d'expérimenter un peu comment un binding de Box2D pour Qt pourrait être fait sans en tirer de conclusion pour l'instant.

VI - Divers

Merci à gbdivers, dourouc05, jacques_jean et Bruno Barthel pour leur relecture !