Bullet 学习笔记之 CollisionShape 和 CollisionObject
先初步看一下碰撞相關的對象都有些什么。
(小疑惑,為什么對在 btDiscreteDynamicsWorld 外面單獨有一個 CollisionShape,好像是說,CollisionShape 是包含在 CollisionObject 里面的。難道是為了節省內存,對于不同的 CollisionObject,如果他們的碰撞外形相同,那么就可以只建立一個 CollisionShape ,在不同的 CollisionObject 之間共享。如果是這樣的話,那也太細了吧)
(TM 果真是這樣的。作者在代碼中解釋道 Re-using the same collision is better for memory usage and performance)
碰撞外形類 CollisionShape
基類定義在 bullet3/src/BulletCollision/CollisionShapes/btCollisionShape.h 中,為 btCollisionShape ,作者這樣描述該類:///The btCollisionShape class provides an interface for collision shapes that can be shared among btCollisionObjects.
在 btCollisionShape 類中,成員變量也很簡單:
int m_shapeType;
void* m_userPointer;
int m_userIndex;
從成員/接口函數分析它的主要功能,有
///getAabb returns the axis aligned bounding box in the coordinate frame of the given transform t.
virtual void getAabb(const btTransform& t, btVector3& aabbMin, btVector3& aabbMax) const = 0;
virtual void getBoundingSphere(btVector3 & center, btScalar & radius) const;
///getAngularMotionDisc returns the maximum radius needed for Conservative Advancement to handle time-of-impact with rotations.
virtual btScalar getAngularMotionDisc() const;
virtual btScalar getContactBreakingThreshold(btScalar defaultContactThresholdFactor) const;
///calculateTemporalAabb calculates the enclosing aabb for the moving object over interval [0..timeStep)
///result is conservative
void calculateTemporalAabb(const btTransform& curTrans, const btVector3& linvel, const btVector3& angvel, btScalar timeStep, btVector3& temporalAabbMin, btVector3& temporalAabbMax) const;
感覺,大概就 AABB,碰撞檢測相關的一些東西吧。
從 btCollisionShape 的成員變量可知,對于碰撞形狀,也分為不同的類型。具體有:(還挺多的 >_<)
/// btDispatcher uses these types
/// IMPORTANT NOTE:The types are ordered polyhedral, implicit convex and concave
/// to facilitate type checking
/// CUSTOM_POLYHEDRAL_SHAPE_TYPE,CUSTOM_CONVEX_SHAPE_TYPE and CUSTOM_CONCAVE_SHAPE_TYPE can be used to extend Bullet without modifying source code
enum BroadphaseNativeTypes
{
// polyhedral convex shapes
BOX_SHAPE_PROXYTYPE,
TRIANGLE_SHAPE_PROXYTYPE,
TETRAHEDRAL_SHAPE_PROXYTYPE,
CONVEX_TRIANGLEMESH_SHAPE_PROXYTYPE,
CONVEX_HULL_SHAPE_PROXYTYPE,
CONVEX_POINT_CLOUD_SHAPE_PROXYTYPE,
CUSTOM_POLYHEDRAL_SHAPE_TYPE,
//implicit convex shapes
IMPLICIT_CONVEX_SHAPES_START_HERE,
SPHERE_SHAPE_PROXYTYPE,
MULTI_SPHERE_SHAPE_PROXYTYPE,
CAPSULE_SHAPE_PROXYTYPE,
CONE_SHAPE_PROXYTYPE,
CONVEX_SHAPE_PROXYTYPE,
CYLINDER_SHAPE_PROXYTYPE,
UNIFORM_SCALING_SHAPE_PROXYTYPE,
MINKOWSKI_SUM_SHAPE_PROXYTYPE,
MINKOWSKI_DIFFERENCE_SHAPE_PROXYTYPE,
BOX_2D_SHAPE_PROXYTYPE,
CONVEX_2D_SHAPE_PROXYTYPE,
CUSTOM_CONVEX_SHAPE_TYPE,
//concave shapes
CONCAVE_SHAPES_START_HERE,
//keep all the convex shapetype below here, for the check IsConvexShape in broadphase proxy!
TRIANGLE_MESH_SHAPE_PROXYTYPE,
SCALED_TRIANGLE_MESH_SHAPE_PROXYTYPE,
///used for demo integration FAST/Swift collision library and Bullet
FAST_CONCAVE_MESH_PROXYTYPE,
//terrain
TERRAIN_SHAPE_PROXYTYPE,
///Used for GIMPACT Trimesh integration
GIMPACT_SHAPE_PROXYTYPE,
///Multimaterial mesh
MULTIMATERIAL_TRIANGLE_MESH_PROXYTYPE,
EMPTY_SHAPE_PROXYTYPE,
STATIC_PLANE_PROXYTYPE,
CUSTOM_CONCAVE_SHAPE_TYPE,
SDF_SHAPE_PROXYTYPE = CUSTOM_CONCAVE_SHAPE_TYPE,
CONCAVE_SHAPES_END_HERE,
COMPOUND_SHAPE_PROXYTYPE,
SOFTBODY_SHAPE_PROXYTYPE,
HFFLUID_SHAPE_PROXYTYPE,
HFFLUID_BUOYANT_CONVEX_SHAPE_PROXYTYPE,
INVALID_SHAPE_PROXYTYPE,
MAX_BROADPHASE_COLLISION_TYPES
};
感覺其他派生出的形狀也都差不多,無非就是 AABB,碰撞間隙,形狀信息等等。
碰撞對象 CollisionObject
該基類定義在 bullet3/src/BulletCollision/CollisionDispatch/btCollisionObject.h
作者對該類的描述為
/// btCollisionObject can be used to manage collision detection objects.
/// btCollisionObject maintains all information that is needed for a collision detection: Shape, Transform and AABB proxy.
/// They can be added to the btCollisionWorld.
CollisionObject 類就復雜多了,針對場景中的每一個對象的信息,包含了形狀、位姿、摩擦等多種信息。可以說,每一個 CollisionObject 實例,都代表了仿真場景中的一個實體。
總結
以上是生活随笔為你收集整理的Bullet 学习笔记之 CollisionShape 和 CollisionObject的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: div跟随鼠标事件(onmousemov
- 下一篇: 路由器中带宽设置(Bandwidth)