Skip to content

Compiler et Installer Bullet Physics (moteur physique) sous Debian-Ubuntu

18 mars 2010

Bullet est un moteur 3D très en vogue depuis qu’il est utilisé par le projet Blender. Celui-ci permet d’animer de façon réaliste des scènes 3D.

D’un point de vue mécanique, il peut faire bouger des solides (ouf!), gérer les collisions, lier des solides avec des liaisons mécaniques simples et même déformer des solides… Bullet a aussi des modèles de frictions.

Du point de vue des solides gérés, il y a les entités géométriques simples : sphère, cube, cône, etc. Mais aussi des solides plus complexes qui sont réalisés sous forme de maillage surfacique en triangles (coque extérieure). Ceci laisse une grande liberté pour générer des solides.

Le site web du projet est : http://bulletphysics.org.

Pour compiler et installer la dernière version de Bullet :

#! /bin/bash

wget http://bullet.googlecode.com/files/bullet-2.76.tgz
tar xvzf bullet-2.76.tgz
cd bullet-2.76/
ccmake . -G « Unix Makefiles »
# Dans ccmake configurer comme suit :
# USE_MULTITHREADED_BENCHMARK = OFF
# INSTALL_LIBS = ON
# INSTALL_EXTRA_LIBS = ON
make
sudo make install

Normalement tout se passe bien.

Ensuite, il faut renseigner pkg-config pour qu’il connaisse le chemin vers Bullet.

Pour cela dans son terminal préféré :

sudo gedit /usr/local/lib/pkgconfig/bullet.pc

Et on entre le contenu suivant :

prefix=/usr/local
exec_prefix=${prefix}
libdir=${prefix}/lib
includedir=${prefix}/include

Name: bullet
Description: Bullet Continuous Collision Detection and Physics Library
Requires:
Version: @PACKAGE_VERSION@
Libs: -L${libdir} -lBulletSoftBody -lBulletDynamics -lBulletCollision -lLinearMath
Cflags: -I${includedir}/bullet


Pensez à remplacer @PACKAGE_VERSION@ par le numéro de version de bullet, ici : Version: 2.76

Il doit y avoir plus élégant, mais je n’ai pas trouvé. Ceci permet que lorsqu’on entre la commande suivante dans un terminal :

pkg-config – -libs – -cflags bullet

Celui-ci nous répond :

-I/usr/local/include/bullet  -L/usr/local/lib -lBulletDynamics -lBulletCollision -lBulletSoftBody -lLinearMath

Ceci va nous servir pour compiler. Maintenant allons chercher un exemple pour bullet : hello_world.cpp, bien sûr.

#include 

#include
/* http://bulletphysics.org/mediawiki-1.5.8/index.php/Hello_World */

int main (void)
{

        btBroadphaseInterface* broadphase = new btDbvtBroadphase();

        btDefaultCollisionConfiguration* collisionConfiguration = new btDefaultCollisionConfiguration();
        btCollisionDispatcher* dispatcher = new btCollisionDispatcher(collisionConfiguration);

        btSequentialImpulseConstraintSolver* solver = new btSequentialImpulseConstraintSolver;

        btDiscreteDynamicsWorld* dynamicsWorld = new btDiscreteDynamicsWorld(dispatcher,broadphase,solver,collisionConfiguration);

        dynamicsWorld->setGravity(btVector3(0,-10,0));

        btCollisionShape* groundShape = new btStaticPlaneShape(btVector3(0,1,0),1);

        btCollisionShape* fallShape = new btSphereShape(1);

        btDefaultMotionState* groundMotionState = new btDefaultMotionState(btTransform(btQuaternion(0,0,0,1),btVector3(0,-1,0)));
        btRigidBody::btRigidBodyConstructionInfo
                groundRigidBodyCI(0,groundMotionState,groundShape,btVector3(0,0,0));
        btRigidBody* groundRigidBody = new btRigidBody(groundRigidBodyCI);
        dynamicsWorld->addRigidBody(groundRigidBody);

        btDefaultMotionState* fallMotionState =
                new btDefaultMotionState(btTransform(btQuaternion(0,0,0,1),btVector3(0,50,0)));
        btScalar mass = 1;
        btVector3 fallInertia(0,0,0);
        fallShape->calculateLocalInertia(mass,fallInertia);
        btRigidBody::btRigidBodyConstructionInfo fallRigidBodyCI(mass,fallMotionState,fallShape,fallInertia);
        btRigidBody* fallRigidBody = new btRigidBody(fallRigidBodyCI);
        dynamicsWorld->addRigidBody(fallRigidBody);

        for (int i=0 ; istepSimulation(1/60.f,10);

                btTransform trans;
                fallRigidBody->getMotionState()->getWorldTransform(trans);

                std::cout << "sphere height: " << trans.getOrigin().getY() <removeRigidBody(fallRigidBody);
        delete fallRigidBody->getMotionState();
        delete fallRigidBody;

        dynamicsWorld->removeRigidBody(groundRigidBody);
        delete groundRigidBody->getMotionState();
        delete groundRigidBody;

        delete fallShape;

        delete groundShape;

        delete dynamicsWorld;
        delete solver;
        delete collisionConfiguration;
        delete dispatcher;
        delete broadphase;

        return 0;
}

Cette source provient de : http://bulletphysics.org/mediawiki-1.5.8/index.php/Hello_World.

Pour compiler le tout :
g++ hello_world.cpp `pkg-config – -libs – -cflags bullet` -o hello_world

Et voilà, le tour est joué.

2 commentaires leave one →
  1. revo permalink
    3 avril 2010 15 h 06 mi

    Merci bien pour cette astuce

  2. 9 juin 2010 21 h 13 mi

    Merci pour l’astuce aussi !
    Par contre Bullet n’est pas du tout un moteur 3D =) Il ne gere aucun affichage, c’est un moteur PHYSIQUE !

Laisser un commentaire

Entrez vos coordonnées ci-dessous ou cliquez sur une icône pour vous connecter:

Logo WordPress.com

Vous commentez à l'aide de votre compte WordPress.com. Déconnexion / Changer )

Image Twitter

Vous commentez à l'aide de votre compte Twitter. Déconnexion / Changer )

Photo Facebook

Vous commentez à l'aide de votre compte Facebook. Déconnexion / Changer )

Photo Google+

Vous commentez à l'aide de votre compte Google+. Déconnexion / Changer )

Connexion à %s

%d blogueurs aiment cette page :