Box2d源码学习<八>形状(上):父形状的实现

来源:互联网 发布:中小企业进销存软件 编辑:程序博客网 时间:2024/04/27 09:18

本系列博客是由扭曲45原创,欢迎转载,转载时注明出处,http://blog.csdn.net/cg0206/article/details/8300800

Box2d中每种物体它都是要有形状的,关于形状的是如何定义和实现的,我们今天就来说说。要将一个形状描述出来,我们必须知道它的定义,不禁要问形状是什么呢?用来干什么的呢?形状是几何体,用来给物体(body)定型的。同时形状可以在物理模拟中独立使用,你就可以对形状进行各种操作。

父形状的实现只有一个b2Shape.h文件,我们就来看下它是怎么实现的。

[cpp] view plain copy
  1. // 这个拥有质量,用于形状的计算  
  2. struct b2MassData  
  3. {  
  4.     // 形状的质量,通常单位是kg  
  5.     float32 mass;  
  6.     //形状的质心到形状的原点  
  7.     b2Vec2 center;  
  8.     //形状的转动惯量  
  9.     float32 I;  
  10. };  
  11.   
  12. //一个形状用于碰撞检测。只要你喜欢,你可以创建一个形状。  
  13. // 在b2World世界中,形状用于模拟,当创建一个b2Fixture时将被自动创建。  
  14. //形状类将被封装成一个或多个子形状类  
  15. class b2Shape  
  16. {  
  17. public:  
  18.     //形状类型  
  19.     enum Type  
  20.     {  
  21.         e_circle = 0,       //圆形  
  22.         e_edge = 1,         //边缘形状  
  23.         e_polygon = 2,      //多边形  
  24.         e_chain = 3,        //链形状  
  25.         e_typeCount = 4     //形状总数  
  26.     };  
  27.   
  28.     virtual ~b2Shape() {}  
  29.     /************************************************************************** 
  30.     * 功能描述:用soa块分配器克隆一个具体的形状 
  31.     * 参数说明: allocator :soa分配器对象指针 
  32.     * 返 回 值: 形状指针 
  33.     ***************************************************************************/  
  34.     virtual b2Shape* Clone(b2BlockAllocator* allocator) const = 0;  
  35.     /************************************************************************** 
  36.     * 功能描述:获取孩子形状类型,你可以使用它去创建形状 
  37.     * 参数说明: (void) 
  38.     * 返 回 值: 孩子形状个数 
  39.     ***************************************************************************/  
  40.     Type GetType() const;  
  41.     /************************************************************************** 
  42.     * 功能描述:获取形状的孩子元素的数量, 
  43.                 主要用于chainShape中,到时我们再谈 
  44.     * 参数说明: (void) 
  45.     * 返 回 值: 孩子元素的数量 
  46.     ***************************************************************************/  
  47.     virtual int32 GetChildCount() const = 0;  
  48.     /************************************************************************** 
  49.     * 功能描述:在这个形状中测试这个点的密封性,只适合用于凸的形状 
  50.     * 参数说明: xf : 形状的变换 
  51.                  p  : world坐标中的一个点 
  52.     * 返 回 值: true : 密封 
  53.                  false:敞开 
  54.     ***************************************************************************/  
  55.     virtual bool TestPoint(const b2Transform& xf, const b2Vec2& p) const = 0;  
  56.     /************************************************************************** 
  57.     * 功能描述:投射一束光到一个孩子形状中 
  58.     * 参数说明: output      :输出光线投射的结果 
  59.                  input       :输入光线投射 
  60.                  transform   :变换应用到此形状中 
  61.                  childeIndex :孩子形状索引 
  62.     * 返 回 值: true : 成功 
  63.                  false:失败 
  64.     ***************************************************************************/  
  65.     virtual bool RayCast(b2RayCastOutput* output, const b2RayCastInput& input,  
  66.                         const b2Transform& transform, int32 childIndex) const = 0;  
  67.     /************************************************************************** 
  68.     * 功能描述:给出一个变换,计算一个孩子形状的轴对齐包围盒(aabb) 
  69.     * 参数说明: aabb       : 孩子形状的aabb指针 
  70.                  xf         : 一个变换的引用 
  71.                  childIndex : 孩子的索引值 
  72.     * 返 回 值: (void) 
  73.     ***************************************************************************/  
  74.     virtual void ComputeAABB(b2AABB* aabb, const b2Transform& xf, int32 childIndex) const = 0;  
  75.     /************************************************************************** 
  76.     * 功能描述:用它的大小和密度计算形状的质量 
  77.     * 参数说明: massData   : 计算形状的质量 
  78.                  density    : 密度 
  79.     * 返 回 值: (void) 
  80.     ***************************************************************************/  
  81.     virtual void ComputeMass(b2MassData* massData, float32 density) const = 0;  
  82.     //形状类型  
  83.     Type m_type;  
  84.     //半径  
  85.     float32 m_radius;  
  86. };  
  87. //获取形状类型  
  88. inline b2Shape::Type b2Shape::GetType() const  
  89. {  
  90.     return m_type;  
  91. }  
我们可以看到shape中基本上都是虚函数,是没有实现的。shape中定义了以下几个函数:

1、克隆一个形状

2、获取孩子形状类型

3、获取形状的孩子元素的数量

4、投射一束光到一个孩子形状中

5、计算一个孩子形状的轴对齐包围盒(aabb)

6、计算形状的质量

7、测试形状中点的密封性。

还有想问大家一点关于虚函数问题,为什么这里析构函数要定义为虚函数?如果不定义为虚函数又会怎样?有没有其它隐患?希望大家思考一下,有时间的话我们再说一下。

其它具体的定义请见注释,子形状的实现将于下篇文章与大家见面。各位,晚安。。。

ps:

以上文章仅是一家之言,若有不妥、错误之处,请大家多多指出。同时也希望能与大家多多交流,共同进步。

0 0