VS2010下配置Bullet开发环境

来源:互联网 发布:淘宝二手威图手机 编辑:程序博客网 时间:2024/06/02 19:10

        Bullet是一个开源的物理引擎,介绍什么的就不写在这了,自行百度或者看维基百科去。这篇文章讲了怎么配置Bullet,大部分内容是从Bullet官网上来的。


       首先下载Bullet,可以用SVN来获得最新版源码(svn checkout http://bullet.googlecode.com/svn/trunk/ bullet-read-only,已失效),也可以下载编译好的SDK。


        然后解压下载的文件,使用CMake编译。具体的这里不写了,这里有图文教程,虽说是英文的,但是有图比较直观。


        编译完成后就不用看那个教程了,写的太麻烦。可以看到在编译后的Bullet目录下,我的是C:\work\bullet-2.80-rev2531,lib文件夹中有东西了,有了这几个重要的库,Bullet开发工作才能进行。


        可以打开Bullet目录下的msvc文件夹,找到对应于自己的VS版本的sln文件,打开,然后编译生成运行即可看到一些Demo。


       下面讲在VS2010下配置Bullet,进行开发。


        1、新建一个C++的Win32工程。

        2、在解决方案上右键-->属性,展开配置属性:

        3、C/C++-->常规,“附加包含目录”中添加Bullet的路径,即C:\work\bullet-2.80-rev2531\src。该操作配置包含文件;

        4、链接器-->常规,“附加库目录”中添加Bullet库文件路径,即C:\work\bullet-2.80-rev2531\lib。

              链接器-->输入,“附加依赖项”中添加Bullet库文件,目前先添加三个,BulletCollision_debug.lib,BulletDynamics_debug.lib,

LinearMath_debug.lib,这三个库文件比较重要,是每个Bullet程序都会用到的库。该操作配置库文件;

   (在最新的Bullet版本2.8.1中,lib文件名已修改,包含了编译器版本,所以应添加为BulletCollision_vs2010_debug.lib,BulletDynamics_vs2010_debug.lib,LinearMath_vs2010_debug.lib)

        5、应用以上配置。


        如上步骤配置完成后,就可开始编写Bullet程序了。给一个HelloWorld,来自官网。

#include <iostream> #include <btBulletDynamicsCommon.h> int main (void){#pragma region Common build to any Bullet App// Build the BroadPhasebtBroadphaseInterface* broadphase = new btDbvtBroadphase(); // Set up the collision configuration and dispatcherbtDefaultCollisionConfiguration* collisionConfiguration = new btDefaultCollisionConfiguration();btCollisionDispatcher* dispatcher = new btCollisionDispatcher(collisionConfiguration);// The actual physics solver. A solver is what causes the objects to interact properlybtSequentialImpulseConstraintSolver* solver = new btSequentialImpulseConstraintSolver; // instantiate the dynamics worldbtDiscreteDynamicsWorld* dynamicsWorld = new btDiscreteDynamicsWorld(dispatcher,broadphase,solver,collisionConfiguration);dynamicsWorld->setGravity(btVector3(0,-10,0));// set gravity, Y axis to be up#pragma endregion// create a ground planebtCollisionShape* groundShape = new btStaticPlaneShape(btVector3(0,1,0),1);    // create a sphere falling from the sky with a radius of 1 metrebtCollisionShape* fallShape = new btSphereShape(1);// instantiate the ground 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);// add the ground to the world 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);// add the sphere to the world for (int i=0 ; i<300 ; i++)// step the simulation 300 times{dynamicsWorld->stepSimulation(1/60.f,10);// step interval 60hz btTransform trans;fallRigidBody->getMotionState()->getWorldTransform(trans);std::cout << "sphere height: " << trans.getOrigin().getY() << std::endl;} dynamicsWorld->removeRigidBody(fallRigidBody);delete fallRigidBody->getMotionState();delete fallRigidBody;dynamicsWorld->removeRigidBody(groundRigidBody);delete groundRigidBody->getMotionState();delete groundRigidBody; delete fallShape; delete groundShape;  #pragma region Common delete to any Bullet Appdelete dynamicsWorld;delete solver;delete dispatcher;delete collisionConfiguration;delete broadphase;#pragma endregionreturn 0;}

           上述代码在控制台输出sphere height,没有图形界面。


——The End——