Bullet User Manual
Bullet User Manual
Bullet User Manual
Table of Contents
-2-
http://bulletphysics.org
-3-
http://bulletphysics.org
Online resources........................................................................................................................................................................... 43
Authoring Tools ............................................................................................................................................................................ 43
Books ............................................................................................................................................................................................ 43
Contributions and people ............................................................................................................................................................. 44
Create Bullet Visual Studio projectfiles using CMake .................................................................................................... 45
-4-
http://bulletphysics.org
1 Introduction
Decription of the library
Bullet Physics is a professional open source collision detection, rigid body and soft body dynamics
library. The library is free for commercial use under the ZLib license.
Main Features
Open source C++ code under Zlib license and free for any commercial use on all platforms
including PLAYSTATION 3, XBox 360, Wii, PC, Linux, Mac OSX and iPhone
Discrete and continuous collision detection including ray and convex sweep test. Collision
shapes include concave and convex meshes and all basic primitives
Fast and stable rigid body dynamics constraint solver, vehicle dynamica, character
controller and slider, hinge, generic 6DOF and cone twist constraint for ragdolls
Soft Body dynamics for cloth, rope and deformable volumes with two-way interaction with
rigid bodies, including constraint support
PLAYSTATION 3 licensed developers can download an optimized version for Cell SPU
through Sony PS3 Devnet from https://ps3.scedev.net/projects/spubullet
-5-
http://bulletphysics.org
2 What’s New
New in Bullet 2.78
Fracture and glueing demo that can break or glue child shapes of a btCompoundShape
when certain impulse thresholds are exceeded.
See Bullet/Demos/FractureDemo
Improved binary .bullet file format with soft body serialization and
See Bullet/Demos/SerializeDemo
Polyhedral contact clipping and optional separating axis test (SAT) as alternative to
GJK/EPA and incremental contact manifold, for btPolyhedralConvexShape derived shapes
such as btConvexHullShape
See Demos/InternalEdgeDemo
OpenCL and DirectCompute cloth simulation improvements: GPU kernels for capsule
collision detection and OpenCL-OpenGL interop
See Demos/OpenCLClothDemo and Demos/DX11ClothDemo
New binary .bullet file format support, with 32/64bit little/big endian compatibility.
See Bullet/Demos/SerializeDemo
-6-
http://bulletphysics.org
Improved CMake build system support, making Jam and other build systems obsolete.
Many enhancements and bug fixes, see the issue tracked at bullet.googlecode.com
-7-
http://bulletphysics.org
3 Quickstart
Download
Windows developers can download the zipped sources of Bullet from http://bullet.googlecode.com.
Mac OS X, Linux and other developers should download the gzipped tar archive.
Bullet/msvc/*/BULLET_PHYSICS.sln
You can also use cmake command-line. Run cmake without arguments to see the list of build system
generators for your platform.
cmake . –G Xcode
-8-
http://bulletphysics.org
Testing demos
Try to run and experiment with the Bullet demos in the Bullet/Demos folder.
-9-
http://bulletphysics.org
The actual name and of the library might be different. For example the Visual Studio compiler adds
the .lib extension, Unix systems usually add a lib prefix and .a extension. When using CMake the
library is usually location in the lib folder of the build directory.
See the Appendix with details how to setup a Visual Studio and Mac OSX Xcode project.
- 10 -
http://bulletphysics.org
4 Library Overview
Introduction
The main task of a physics engine is to perform collision detection, resolve collisions and other
constraints, and provide the updated world transform1 for all the objects. This chapter will give a
general overview of the rigid body dynamics pipeline as well as the basic data types and math library
shared by all components.
Software Design
Bullet has been designed to be customizable and modular. The developer can
use the rigid body dynamics component without soft body dynamics component
use only small parts of a the library and extend the library in many ways
use a custom memory allocator, hook up own performance profiler or debug drawer
Collision
Detection
Linear Math
Memory, Containers
1
World transform of the center of mass for rigid bodies, transformed vertices for soft bodies
- 11 -
http://bulletphysics.org
The entire physics pipeline computation and its data structures are represented in Bullet by a
dynamics world. When performing ‘stepSimulation’ on the dynamics world, all the above stages
are executed. The default dynamics world implementation is the btDiscreteDynamicsWorld.
Bullet lets the developer choose several parts of the dynamics world explicitly, such as broadphase
collision detection, narrowphase collision detection (dispatcher) and constraint solver.
Integration overview
If you want to use Bullet in your own 3D application, it is best to follow the steps in the HelloWorld
demo, located in Bullet/Demos/HelloWorld. In a nutshell:
These classes, derived from btDynamicsWorld , provide a high level interface that manages your
physics objects and constraints. It also implements the update of all objects each frame.
- 12 -
http://bulletphysics.org
Mass, positive for dynamics moving objects and 0 for static objects
stepSimulation
The next chapters will provide more information about collision detection and rigid body dynamics. A
lot of the details are demonstrated in the Bullet/Demos. If you can’t find certain functionality,
please visit the physics forum on the Bullet website at http://bulletphysics.org
- 13 -
http://bulletphysics.org
btScalar
A btScalar is a posh word for a floating point number. In order to allow to compile the library in
single floating point precision and double precision, we use the btScalar data type throughout the
library. By default, btScalar is a typedef to float. It can be double by defining
BT_USE_DOUBLE_PRECISION either in your build system, or at the top of the file
Bullet/src/LinearMath/btScalar.h.
btVector3
3D positions and vectors can be represented using btVector3. btVector3 has 3 scalar x,y,z components.
It has, however, a 4th unused w component for alignment and SIMD compatibility reasons. Many
operations can be performed on a btVector3, such as add subtract and taking the length of a vector.
btTransform
(0,0,0)
X
Z
- 14 -
http://bulletphysics.org
To assure that a structure or class will be automatically aligned, you can use this macro:
Often it is necessary to maintain an array of objects. Originally the Bullet library used a STL std::vector
data structure for arrays, but for portability and compatibility reasons we switched to our own array
class.
- 15 -
http://bulletphysics.org
CProfileIterator is a class that lets you iterate through the profiling tree.
Debug Drawing
Visual debugging the simulation data structures can be helpful. For example, this allows you to verify
that the physics simulation data matches the graphics data. Also scaling problems, bad constraint
frames and limits show up.
btIDebugDraw is the interface class used for debug drawing. Derive your own class and implement
the virtual ‘drawLine’ and other methods.
Assign your custom debug drawer to the dynamics world using the setDebugDrawer method.
Then you can choose to draw specific debugging features by setting the mode of the debug drawer:
dynamicsWorld->getDebugDrawer()->setDebugMode(debugMode);
Every frame you can call the debug drawing by calling the
world-> debugDrawWorld();2
btIDebugDraw::DBG_DrawWireframe
btIDebugDraw::DBG_DrawAabb
btIDebugDraw::DBG_DrawConstraints
btIDebugDraw::DBG_DrawConstraintLimits
By default all objects are visualized for a given debug mode, and when using many objects this can
clutter the display. You can disable debug drawing for specific objects by using
int f = objects->getCollisionFlags();
ob->setCollisionFlags(f|btCollisionObject::CF_DISABLE_VISUALIZE_OBJECT);
2
This feature is supported for both btCollisionWorld and btDiscreteDynamicsWorld
- 16 -
http://bulletphysics.org
btCollisionObject is the object that has a world transform and a collision shape.
btCollisionShape describes the collision shape of a collision object, such as box, sphere,
convex hull or triangle mesh. A single collision shape can be shared among multiple
collision objects.
The broadphase collision detection provides acceleration structure to quickly reject pairs of objects
based on axis aligned bounding box (AABB) overlap. Several different broadphase acceleration
structures are available:
btDbvtBroadphase uses a fast dynamic bounding volume hierarchy based on AABB tree
The broadphase adds and removes overlapping pairs from a pair cache. The developer can choose the
type of pair cache.
A collision dispatcher iterates over each pair, searches for a matching collision algorithm based on the
types of objects involved and executes the collision algorithm computing contact points.
btPersistentManifold is a contact point cache to store contact points for a given pair of
objects.
- 17 -
http://bulletphysics.org
Collision Shapes
Bullet supports a large variety of different collision shapes, and it is possible to add your own. For best
performance and quality it is important to choose the collision shape that suits your purpose. The
following diagram can help making a decision:
Is is a moving object?
YES NO
btCompoundShape btGimpactTriangleMeshShape
Convex Primitives
Most primitive shapes are centered around the origin of their local coordinate frame:
btBoxShape : Box defined by the half extents (half length) of its sides
- 18 -
http://bulletphysics.org
btMultiSphereShape : Convex hull of multiple spheres, that can be used to create a Capsule (by
passing 2 spheres) or other convex shapes.
Compound Shapes
Multiple convex shapes can be combined into a composite or compound shape, using the
btCompoundShape. This is a concave shape made out of convex sub parts, called child shapes. Each
child shape has its own local offset transform, relative to the btCompoundShape.
Convex Decomposition
Ideally, concave meshes should only be used for static artwork. Otherwise its convex hull should be
used by passing the mesh to btConvexHullShape. If a single convex shape is not detailed enough,
multiple convex parts can be combined into a composite object called btCompoundShape. Convex
decomposition can be used to decompose the concave mesh into several convex parts. See the
Demos/ConvexDecompositionDemo for an automatic way of doing convex decomposition.
Height field
Bullet provides support for the special case of a flat 2D concave terrain through the
btHeightfieldTerrainShape. See Demos/TerrainDemo for its usage.
- 19 -
http://bulletphysics.org
btStaticPlaneShape
As the name suggests, the btStaticPlaneShape can represent an infinite plane or half space. This
shape can only be used for static, non-moving objects. This shape has been introduced mainly for
demo purposes.
Collision Margin
Bullet uses a small collision margin for collision shapes, to improve performance and reliability of the
collision detection. It is best not to modify the default collision margin, and if you do use a positive
value: zero margin might introduce problems. By default this collision margin is set to 0.04, which is 4
centimeter if your units are in meters (recommended).
Dependent on which collision shapes, the margin has different meaning. Generally the collision
margin will expand the object. This will create a small gap. To compensate for this, some shapes will
subtract the margin from the actual size. For example, the btBoxShape subtracts the collision margin
from the half extents. For a btSphereShape, the entire radius is collision margin so no gap will
occur. Don’t override the collision margin for spheres. For convex hulls, cylinders and cones, the
margin is added to the extents of the object, so a gap will occur, unless you adjust the graphics mesh
or collision size. For convex hull objects, there is a method to remove the gap introduced by the
margin, by shrinking the object. See the Demos/BspDemo for this advanced use.
- 20 -
http://bulletphysics.org
Collision Matrix
For each pair of shape types, Bullet will dispatch a certain collision algorithm, by using the dispatcher.
By default, the entire matrix is filled with the following algorithms. Note that Convex represents
convex polyhedron, cylinder, cone and capsule and other GJK compatible primitives. GJK stands for
Gilbert, Johnson and Keerthi, the people behind this convex distance calculation algorithm. It is
combined with EPA for penetration depth calculation. EPA stands for Expanding Polythope
Algorithm by Gino van den Bergen. Bullet has its own free implementation of GJK and EPA.
cone,capsule
cone,
capsule
- 21 -
http://bulletphysics.org
Of course, don't try to shoehorn something into a mask-based selection system that clearly doesn't fit
there just because performance may be a little better.
int collideMask = 4;
world->addCollisionObject(object,myGroup,collideMask);
During broadphase collision detection overlapping pairs are added to a pair cache, only when the
mask matches the group of the other objects (in needsBroadphaseCollision)
bool collides = (proxy0->m_collisionFilterGroup & proxy1->m_collisionFilterMask) != 0;
If you have more types of objects than the 32 bits available to you in the masks, or some collisions are
enabled or disabled based on other factors, then there are several ways to register callbacks to that
implements custom logic and only passes on collisions that are the ones you want:
- 22 -
http://bulletphysics.org
mDispatcher->setNearCallback(MyNearCallback);
- 23 -
http://bulletphysics.org
btRigidBody is the main rigid body object, moving objects have non-zero mass and
inertia. btRigidBody is derived from btCollisionObject, so it inherits its world transform,
friction and restitution and adds linear and angular velocity.
positive mass
every simulation frame the dynamics will update its world transform
Static rigidbodies
zero mass
Kinematic rigidbodies
zero mass
can be animated by the user, but there will be only one-way interaction: dynamic
objects will be pushed away but there is no influence from dynamics objects
All of them need to be added to the dynamics world. The rigid body can be assigned a collision shape.
This shape can be used to calculate the distribution of mass, also called inertia tensor.
- 24 -
http://bulletphysics.org
The world transform of a rigid body is in Bullet always equal to its center of mass, and its basis also
defines its local frame for inertia. The local inertia tensor depends on the shape, and the
btCollisionShape class provides a method to calculate the local inertia, given a mass.
This world transform has to be a rigid body transform, which means it should contain no scaling,
shear etc. If you want an object to be scaled, you can scale the collision shape. Other transformation,
such as shear, can be applied (baked) into the vertices of a triangle mesh if necessary.
In case the collision shape is not aligned with the center of mass transform, it can be shifted to match.
For this, you can use a btCompoundShape, and use the child transform to shift the child collision
shape.
What's a MotionState?
MotionStates are a way for Bullet to do all the hard work for you getting the world transform of
objects being simulated into the rendering part of your program.
In most situations, your game loop would iterate through all the objects you're simulating before each
frame rander. For each object, you would update the position of the render object from the physics
body. Bullet uses something called MotionStates to save you this effort.
Computation involved in moving bodies around is only done for bodies that have moved;
no point updating the position of a render object every frame if it isn't moving.
You don't just have to do render stuff in them. They could be effective for notifying
network code that a body has moved and needs to be updated across the network.
You can keep track of a shift between graphics object and center of mass transform.
They're easy
Interpolation
Bullet knows how to interpolate body movement for you. As mentioned, implemention of
interpolation is handled through MotionStates.
- 25 -
http://bulletphysics.org
physics tick. That's useful for many things, but for rendering you will want some interpolation. Bullet
interpolates the transform of the body before passing the value to setWorldTransform.
If you want the non-interpolated position of a body [which will be the position as it was calculated at
the end of the last physics tick], use btRigidBody::getWorldTransform() and query the body directly.
The first is when the body is first created. Bullet grabs the initial position of the body from the
motionstate when the body enters the simulation
Bullet calls getWorldTransform with a reference to the variable it wants you to fill with transform
information
Bullet also calls getWorldTransform on kinematic bodies. Please see the section below
After the first update, during simulation Bullet will call the motion state for a body to move that body
around
Bullet calls setWorldTransform with the transform of the body, for you to update your object
appropriately
DefaultMotionState
Although recommended, it is not necessary to derive your own motionstate from btMotionState
interface. Bullet provides a default motionstate that you can use for this. Simply construct it with the
default transform of your body:
Kinematic Bodies
If you plan to animate or move static objects, you should flag them as kinematic. Also disable the
sleeping/deactivation for them during the animation. This means Bullet dynamics world will get the
new worldtransform from the btMotionState every simulation frame.
body->setCollisionFlags( body->getCollisionFlags() |
btCollisionObject::CF_KINEMATIC_OBJECT);
body->setActivationState(DISABLE_DEACTIVATION);
- 26 -
http://bulletphysics.org
If you are using kinematic bodies, then getWorldTransform is called every simulation step. This
means that your kinematic body's motionstate should have a mechanism to push the current position
of the kinematic body into the motionstate.
By default, Bullet physics simulation runs at an internal fixed framerate of 60 Hertz (0.01666). The
game or application might have a different or even variable framerate. To decouple the application
framerate from the simulation framerate, an automatic interpolation method is built into
stepSimulation: when the application delta time, is smaller then the internal fixed timestep, Bullet will
interpolate the world transform, and send the interpolated worldtransform to the btMotionState,
without performing physics simulation. If the application timestep is larger then 60 hertz, more then 1
simulation step can be performed during each ‘stepSimulation’ call. The user can limit the maximum
number of simulation steps by passing a maximum value as second argument.
When rigidbodies are created, they will retrieve the initial worldtransform from the btMotionState,
using btMotionState::getWorldTransform. When the simulation is running, using
stepSimulation, the new worldtransform is updated for active rigidbodies using the
btMotionState::setWorldTransform.
Dynamic rigidbodies have a positive mass, and their motion is determined by the simulation. Static
and kinematic rigidbodies have zero mass. Static objects should never be moved by the user.
- 27 -
http://bulletphysics.org
8 Constraints
There are several constraints implemented in Bullet. See Demos/ConstraintDemo for an example of
each of them. All constraints including the btRaycastVehicle are derived from btTypedConstraint.
Constraint act between two rigidbodies, where at least one of them needs to be dynamic.
Hinge Constraint
Hinge constraint, or revolute joint restricts two additional angular degrees of freedom, so the body
can only rotate around one axis, the hinge axis. This can be useful to represent doors or wheels
rotating around one axis. The user can specify limits and motor for the hinge.
- 28 -
http://bulletphysics.org
Slider Constraint
The slider constraint allows the body to rotate around one axis and translate along this axis.
btSliderConstraint(btRigidBody& rbA, btRigidBody& rbB, const btTransform& frameInA, const btTransform& frameInB ,bool
useLinearReferenceFrameA);
To create ragdolls, the conve twist constraint is very useful for limbs like the upper arm. It is a special
point to point constraint that adds cone and twist axis limits. The x-axis serves as twist axis.
This generic constraint can emulate a variety of standard constraints, by configuring each of the 6
degrees of freedom (dof). The first 3 dof axis are linear axis, which represent translation of rigidbodies,
and the latter 3 dof axis represent the angular motion. Each axis can be either locked, free or limited.
On construction of a new btGeneric6DofConstraint, all axis are locked. Afterwards the axis can
be reconfigured. Note that several combinations that include free and/or limited angular degrees of
freedom are undefined.
btGeneric6DofConstraint(btRigidBody& rbA, btRigidBody& rbB, const btTransform& frameInA, const btTransform& frameInB
,bool useLinearReferenceFrameA);
Following is convention:
btVector3 lowerSliderLimit = btVector3(-10,0,0);
btVector3 hiSliderLimit = btVector3(10,0,0);
- 29 -
http://bulletphysics.org
- 30 -
http://bulletphysics.org
Raycast Vehicle
For arcade style vehicle simulations, it is recommended to use the simplified Bullet vehicle model as
provided in btRaycastVehicle. Instead of simulation each wheel and chassis as separate rigid bodies,
connected by constraints, it uses a simplified model. This simplified model has many benefits, and is
widely used in commercial driving games.
The entire vehicle is represented as a single rigidbody, the chassis. The collision detection of the
wheels is approximated by ray casts, and the tire friction is a basic anisotropic friction model.
Kester Maddock shared an interesting document about Bullet vehicle simulation here:
http://tinyurl.com/ydfb7lm
Character Controller
A player or NPC character can be constructed using a capsule shape, sphere or other shape. To avoid
rotation, you can set the ‘angular factor’ to zero, which disables the angular rotation effect during
collisions and other constraints. See btRigidBody::setAngularFactor. Other options (that are
less recommended) include setting the inverse inertia tensor to zero for the up axis, or using a
angular-only hinge constraint.
3
btKinematicCharacterController has several outstanding issues.
- 31 -
http://bulletphysics.org
Introduction
The soft body dynamics provides rope, cloth simulation and volumetric soft bodies, on top of the
existing rigid body dynamics. There is two-way interaction between soft bodies, rigid bodies and
collision objects.
btSoftBody is the main soft body object. It is derived from btCollisionObject. Unlike
rigid bodies, soft bodies don’t have a single world transform: each node/vertex is specified
in world coordinate.
btSoftRigidDynamicsWorld is the container for soft bodies, rigid bodies and collision
objects.
Collision clusters
By default, soft bodies perform collision detection using between vertices (nodes) and triangles (faces).
This requires a dense tessellation, otherwise collisions might be missed. An improved method uses
automatic decomposition into convex deformable clusters. To enable collision clusters, use:
psb->generateClusters(numSubdivisions);
psb->m_cfg.collisions += btSoftBody::fCollision::CL_RS;
psb->m_cfg.collisions += btSoftBody::fCollision::CL_SS;
The Softbody and AllBulletDemos has a debug option to visualize the convex collision clusters.
- 32 -
http://bulletphysics.org
There are methods to apply a force to each vertex (node) or at an individual node:
softbody->setMass(node,0.f);
It is also possible to attach two soft bodies using constraints, see Bullet/Demos/SoftBody.
- 33 -
http://bulletphysics.org
AllBulletDemos
This is a combination of several demos. It includes demonstrations of a fork lift, ragdolls, cloth and
soft bodies and several performance benchmarks.
BSP Demo
Import a Quake .bsp files and convert the brushes into convex objects. This performs better then using
triangles.
Vehicle Demo
This demo shows the use of the build-in vehicle. The wheels are approximated by ray casts. This
approximation works very well for fast moving vehicles.
- 34 -
http://bulletphysics.org
Collision Demo
This demo is more low level then previous Collision Interfacing Demo. It directly uses the
btGJKPairDetector to query the closest points between two objects.
Raytracer Demo
This shows the use of CCD ray casting on collision shapes. It implements a ray tracer that can
accurately visualize the implicit representation of collision shapes. This includes the collision margin,
convex hulls of implicit objects, minkowski sums and other shapes that are hard to visualize
otherwise.
- 35 -
http://bulletphysics.org
Simplex Demo
This is a very low level demo testing the inner workings of the GJK sub distance algorithm. This
calculates the distance between a simplex and the origin, which is drawn with a red line. A simplex
contains 1 up to 4 points, the demo shows the 4 point case, a tetrahedron. The Voronoi simplex solver
is used, as described by Christer Ericson in his collision detection book.
- 36 -
http://bulletphysics.org
Walt Disney Animation Studios contributed their in-house Maya plugin to author Bullet collision
shapes and rigid bodies as open source. Dynamica can simulation rigid body dynamica within Maya,
and it can export to Bullet .bullet physics files and COLLADA Physics.
There is more information in the Bullet wiki page. You can download a precompiled version of the
Dynamica plugin for Windows or Mac OSX from http://bullet.googlecode.com.
The source code repository of Dynamica is under http://dynamica.googlecode.com
Blender
The open source 3D production suite Blender uses Bullet physics for animations and its internal game
engine. See http://blender.org
Blender has an option to export COLLADA Physics files. There is also a project that can directly read
any information from a Blender .blend file, including collision shape, rigid body and constraint
information. See http://gamekit.googlecode.com
Blender 2.57 and later has an option to export to .bullet files directly from the game engine. This can
be done using the exportBulletFile(“name.bullet”) Python command in the
PhysicsConstraints module.
Cinema 4D 11.5 uses Bullet for the rigid body simulation, and there is a report that Lightwave CORE
also plans to use Bullet.
- 37 -
http://bulletphysics.org
dynamicsWorld->serialize(serializer);
fwrite(serializer->getBufferPointer(),serializer->getCurrentBufferSize(),1, file);
fclose(file);
You can press the ‘=’ key in most of the Bullet demos to save a ‘testFile.bullet’. You can read .bullet
files using the btBulletWorldImporter as implemented in the Bullet/Demos/SerializationDemo.
- 38 -
http://bulletphysics.org
14 General Tips
Avoid very small and very large collision shapes
The minimum object size for moving objects is about 0.1 units. When using default gravity of 9.8,
those units are in meters so don’t create objects smaller then 10 centimeter. It is recommended to keep
the maximum size of moving objects smaller then about 5 units/meters.
For safety and stability, Bullet will automatically subdivide the variable timestep into fixed internal
simulation substeps, up to a maximum number of substeps specified as second argument to
stepSimulation. When the timestep is smaller then the internal substep, Bullet will interpolate the
motion.
This safety mechanism can be disabled by passing 0 as maximum number of substeps (second
argument to stepSimulation): the internal timestep and substeps are disabled, and the actual
timestep is simulated. It is not recommended to disable this safety mechanism.
- 39 -
http://bulletphysics.org
- 40 -
http://bulletphysics.org
Advanced Topics
By default, there is only one friction value for one rigidbody. You can achieve per shape or per
triangle friction for more detail. See the Demos/ConcaveDemo how to set the friction per triangle.
Basically, add CF_CUSTOM_MATERIAL_CALLBACK to the collision flags or the rigidbody, and
register a global material callback function. To identify the triangle in the mesh, both triangleID and
partId of the mesh is passed to the material callback. This matches the triangleId/partId of the striding
mesh interface.
- 41 -
http://bulletphysics.org
Bullet collision detection and physics have been optimized for Cell SPU. This means collision code has
been refactored to run on multiple parallel SPU processors. The collision detection code and data have
been refactored to make it suitable for 256kb local store SPU memory. The user can activate the
parallel optimizations by using a special collision dispatcher
(SpuGatheringCollisionDispatcher) that dispatches the work to SPU. The shared public
implementation is located in Bullet/src/BulletMultiThreaded.
Please contact Sony developer support on PS3 Devnet for a Playstation 3 optimized version of Bullet.
- 42 -
http://bulletphysics.org
Online resources
Visit the Bullet Physics website at http://bulletphysics.org for a discussion forum, a wiki with
frequently asked questions and tips and download of the most recent version. The Wikipedia page
lists some games and films using Bullet at
http://en.wikipedia.org/wiki/Bullet_(software)
Authoring Tools
Books
- 43 -
http://bulletphysics.org
Main author and project lead is Erwin Coumans, former Havok employee and now working on this
project at Sony Computer Entertainment America US R&D.
Nathanael Presson, Havok: initial author of Bullet soft body dynamics and EPA
Gino van den Bergen, Dtecta: LinearMath classes, various collision detection ideas
Simon Hobbs, SCEE: 3d axis sweep and prune and parts of btPolyhedralContactClipping
Pierre Terdiman, NVIDIA: various work related to separating axis test, sweep and prune
Eric Sunshine: jam + msvcgen buildsystem (replaced by cmake since Bullet 2.76)
Marten Svanfeldt, Starbreeze: parallel constraint solver and other improvements and optimizations
Arthur Shek, Nicola Candussi, Lawrence Chai, Disney Animation: Dynamica Maya Plugin
Many more people have contributed to Bullet, thanks to everyone on the Bullet forums.
- 44 -
http://bulletphysics.org
1. Run CMake-gui
2. Choose the location where you unzipped the Bullet source code, and where you build the
binaries for your own project and press Configure
- 45 -
http://bulletphysics.org
- 46 -
http://bulletphysics.org
5. Make sure the Run-time library is the same as your project (by default it is set to Run-time
library DLL) and press Generate
6. Optionally, you could open the generated project solution (in our case
C:\develop\tutorial\BulletBuild\BULLET_PHYSICS.sln) and build the library and
demos, but this is not necessary
See also the Bullet Wiki on how to create your own project using Visual Studio
http://bulletphysics.org/mediawiki-1.5.8/index.php/Creating_a_project_from_scratch
- 47 -