官方文档:http://bulletphysics.org
开源代码:https://github.com/bulletphysics/bullet3/releases
API文档:http://bulletphysics.org/Bullet/BulletFull/annotated.html
1. 初始化物体
- 物体的形状由
btCollisionShape
对象维护; - 物体的位置,旋转状态由
btTransform
对象维护; - 最终需要将物体封装成
btRigidBody
或btSoftBody
或其它对象; - 然后将步骤3的对象加入到场景中。
例如
1 | btCollisionShape* shape = new btBoxShape(btVector3(btScalar(1000.),btScalar(10.),btScalar(1000.))); |
2. 常见物体对象
- btCollisionObject 基类
- btRigidBody 刚体
- btSoftBody 流体
2.1. 物体对象常用函数
btCollisionShape* btCollisionObject::getCollisionShape()
- btCollisionObject对象中获取形状维护对象
void btCollisionObject::setFriction(btScalar frict)
- 设置摩擦力
- 默认值:0
void btCollisionObject::setRestitution(btScalar rest)
- 设置碰撞反弹系数
- 默认值:0
void btRigidBody::applyImpulse(const btVector3 & impulse, const btVector3 & rel_pos)
- 设置冲量/动量(通过这个设置初始速度)
void btRigidBody::applyCentralImpulse(const btVector3 & impulse)
- 设置冲量/动量(通过这个设置初始速度)
- 默认值:0
3. 初始化常见物体形状
http://bulletphysics.org/Bullet/BulletFull/classbtCollisionShape.html
常见的物体有长方体、球体、胶囊体、三角网格集合。
- btCollisionShap
- 基类
- btBoxShape
- 长方体
- BOX_SHAPE_PROXYTYPE
- btSphereShape
- 球体
- SPHERE_SHAPE_PROXYTYPE
- btCapsuleShape
- 胶囊体
- CAPSULE_SHAPE_PROXYTYPE
- btBvhTriangleMeshShap
- 三角网格
- TRIANGLE_MESH_SHAPE_PROXYTYPE
- btMultiSphereShape
- 凸球体集合
- MULTI_SPHERE_SHAPE_PROXYTYPE
3.1. 物体对象常用函数
int btCollisionShape::getShapeType() const
- 获取物品类型,类型参考以下枚举
#include "BulletCollision/BroadphaseCollision/btBroadphaseProxy.h" //for the shape types
3.2. 三角网格btBvhTriangleMeshShape
- 构造函数
btBvhTriangleMeshShape::btBvhTriangleMeshShape(btStridingMeshInterface* meshInterface,bool useQuantizedAabbCompression)
- 构造函数
btBvhTriangleMeshShape::btBvhTriangleMeshShape(btStridingMeshInterface* meshInterface,bool useQuantizedAabbCompression, bool buildBvh = true)
btTriangleIndexVertexArray
类集成于btStridingMeshInterface
接口。btIndexedMesh
三角网格顶点列表和索引列表维护类
3.2.1. 三角网格数据假设格式如下
- 顶点表 Vertex Buff
- 三角形表 Index Buff
1 |
|
3.2.3. btStridingMeshInterface
接口
通用高性能三角网格访问接口。
1 | btStridingMeshInterface* meshInterface = new btTriangleIndexVertexArray(); |
3.3. 长方体btBoxShape
- 构造函数
btBoxShape::btBoxShape(const btVector3 & boxHalfExtents)
- 长宽高,封装成
btVector3
对象
3.4. 球btSphereShape
- 构造函数
btSphereShape::btSphereShape(btScalar radius)
- radius xyz轴的半径,可以设置为椭圆球
3.5. 胶囊体btCapsuleShape
- 构造函数
btCapsuleShape::btCapsuleShape()
- 构造函数
btCapsuleShape::btCapsuleShape(btScalar radius, btScalar height)
- radius 胶囊体半径,可以设置为椭圆球
- height 胶囊体长度,height为圆心之间的距离
- 胶囊体的aabb的边的长度为 {radius2, radius2, radius*2+height}
3.6. 凸球体集合btMultiSphereShape
- 构造函数
btMultiSphereShape (const btVector3* positions,const btScalar* radi,int numSpheres)
- positions 球心位置集合(第一个数组地址)
- radi 球半径集合(第一个数组地址)
- numSpheres 球体数量
举例和效果
1 | btVector3 vectors[4]; |
4. 射线Raycast
btCollisionWorld::rayTest(const btVector3 &from, const btVector3 &to, RayResultCallback &callback)
- 射线检测
btCollisionWorld::ClosestRayResultCallback
- 射线回调
- 回调的
m_flags
- 用于设置对物体的正反面是否生效
btVector3 btVector3::lerp(btVector3& v, btScalar& t)
- 从当前坐标往v坐标方向距离t处的坐标
1 | // 获取第一个击中坐标 |
1 | // 获取所有击中目标 |