本文述说物理引擎bullet3-2.83.5的环境搭建及Hello World程序说明。
Bullet简介
Bullet 物理引擎是一个专业的开放源码的碰撞检测,刚体和柔体动力学库。Bullet 物理引擎目标是实时和交互使用在游戏,电影和机器人的视觉效果。自由zlib授权的商业使用库。
主要特点:
- 开源C ++代码下的zlib许可证,并自由使用在所有的平台,包括PLAYSTATION3,,XBOX 360,Wii,PC,Linux,Mac OSX,Android和iPhone。
-
离散和连续碰撞检测包括射线和凸扫描测试。碰撞的形状包括凹凸面网格和所有基本图元。
-
快速稳定的刚体动力学约束求解器,车辆动力学,角色控制滑块,铰链,通用的六自由度和扭转约束锥的布娃娃。
-
布柔体动力学,绳和变形量与刚体双向互动,包括相互约束支持。
-
本地二进制文件格式的例子。.bullet文件格式 和典型格式例如:URDF,Wavefront OBJ和Quake BSP。
搭建Bullet SDK和demos
源码下载:https://github.com/bulletphysics/bullet3/releases
使用Premake
windows系统:双击build3/vs2010.bat脚本自动生成vs2010 sln文件。
使用cmake
cmake下载安装地址http://www.cmake.org。打开cmake,source code:bullet3-2.83.5牧,binaries:bullet3-2.83.5/build。点击configure,你可以选择vs2010 ~vs2013。build目录下就会产生对应的vs版本BULLET_PHYSICS.sln文件。
Hello World
讨论基本Bullet物理模拟,通过控制台输出模拟结果。源码在examples/HelloWorld/HelloWorld.cpp。
HelloWorld.cpp包含头文件
#include "btBulletDynamicsCommon.h"
#include <stdio.h>
/// 最基本的Bullet物理模拟Hello Word 程序
int main(int argc, char** argv)
{
HelloWorld.cpp 初始化世界
///-----初始化开始-----
//配置碰撞默认内存设置,碰撞,高级用户可创建自己的配置。
btDefaultCollisionConfiguration* collisionConfiguration = new btDefaultCollisionConfiguration();
///使用默认调度.为并行处理使用不同的调度做 (参考Extras / BulletMultiThreaded)
btCollisionDispatcher* dispatcher = new btCollisionDispatcher(collisionConfiguration);
///btDbvtBroadphase 是个很好通用粗测阶段. 你也可以尝试btAxis3Sweep.
btBroadphaseInterface* overlappingPairCache = new btDbvtBroadphase();
///默认约束求解器. 为并行处理可以使用不同求解器 (参考Extras/BulletMultiThreaded)
btSequentialImpulseConstraintSolver* solver = new btSequentialImpulseConstraintSolver;
btDiscreteDynamicsWorld* dynamicsWorld = new btDiscreteDynamicsWorld(dispatcher,overlappingPairCache,solver,collisionConfiguration);
步进模拟
for (i=0;i<100;i++)
{
dynamicsWorld->stepSimulation(1.f/60.f,10);
//打印对象的坐标
for (int j=dynamicsWorld->getNumCollisionObjects()-1; j>=0 ;j--)
{
btCollisionObject* obj = dynamicsWorld->getCollisionObjectArray()[j];
btRigidBody* body = btRigidBody::upcast(obj);
btTransform trans;
if (body && body->getMotionState())
{
body->getMotionState()->getWorldTransform(trans);
} else
{
trans = obj->getWorldTransform();
}
printf("world pos object %d = %f,%f,%fn",j,float(trans.getOrigin().getX()),float(trans.getOrigin().getY()),float(trans.getOrigin().getZ()));
}
}
HelloWorld.cpp 清理
//清理动态世界里的刚体
for (i=dynamicsWorld->getNumCollisionObjects()-1; i>=0 ;i--)
{
btCollisionObject* obj = dynamicsWorld->getCollisionObjectArray()[i];
btRigidBody* body = btRigidBody::upcast(obj);
if (body && body->getMotionState())
{
delete body->getMotionState();
}
dynamicsWorld->removeCollisionObject( obj );
delete obj;
}
//清理碰撞形状
for (int j=0;j<collisionShapes.size();j++)
{
btCollisionShape* shape = collisionShapes[j];
collisionShapes[j] = 0;
delete shape;
}
//清理动态世界
delete dynamicsWorld;
//清理求解器
delete solver;
//清理粗测阶段
delete overlappingPairCache;
//清理调度
delete dispatcher;
delete collisionConfiguration ;
// 它将会被清理通过析构函数
collisionShapes . clear ();
