本系列博客是由扭曲45原创,欢迎转载,转载时注明出处,http://blog.csdn.net/cg0206/article/details/8300800
Box2d中每种物体它都是要有形状的,关于形状的是如何定义和实现的,我们今天就来说说。要将一个形状描述出来,我们必须知道它的定义,不禁要问形状是什么呢?用来干什么的呢?形状是几何体,用来给物体(body)定型的。同时形状可以在物理模拟中独立使用,你就可以对形状进行各种操作。
父形状的实现只有一个b2Shape.h文件,我们就来看下它是怎么实现的。
- // 这个拥有质量,用于形状的计算
- struct b2MassData
- {
- // 形状的质量,通常单位是kg
- float32 mass;
- //形状的质心到形状的原点
- b2Vec2 center;
- //形状的转动惯量
- float32 I;
- };
- //一个形状用于碰撞检测。只要你喜欢,你可以创建一个形状。
- // 在b2World世界中,形状用于模拟,当创建一个b2Fixture时将被自动创建。
- //形状类将被封装成一个或多个子形状类
- class b2Shape
- {
- public:
- //形状类型
- enum Type
- {
- e_circle = 0, //圆形
- e_edge = 1, //边缘形状
- e_polygon = 2, //多边形
- e_chain = 3, //链形状
- e_typeCount = 4 //形状总数
- };
- virtual ~b2Shape() {}
- /**************************************************************************
- * 功能描述:用soa块分配器克隆一个具体的形状
- * 参数说明: allocator :soa分配器对象指针
- * 返 回 值: 形状指针
- ***************************************************************************/
- virtual b2Shape* Clone(b2BlockAllocator* allocator) const = 0;
- /**************************************************************************
- * 功能描述:获取孩子形状类型,你可以使用它去创建形状
- * 参数说明: (void)
- * 返 回 值: 孩子形状个数
- ***************************************************************************/
- Type GetType() const;
- /**************************************************************************
- * 功能描述:获取形状的孩子元素的数量,
- 主要用于chainShape中,到时我们再谈
- * 参数说明: (void)
- * 返 回 值: 孩子元素的数量
- ***************************************************************************/
- virtual int32 GetChildCount() const = 0;
- /**************************************************************************
- * 功能描述:在这个形状中测试这个点的密封性,只适合用于凸的形状
- * 参数说明: xf : 形状的变换
- p : world坐标中的一个点
- * 返 回 值: true : 密封
- false:敞开
- ***************************************************************************/
- virtual bool TestPoint(const b2Transform& xf, const b2Vec2& p) const = 0;
- /**************************************************************************
- * 功能描述:投射一束光到一个孩子形状中
- * 参数说明: output :输出光线投射的结果
- input :输入光线投射
- transform :变换应用到此形状中
- childeIndex :孩子形状索引
- * 返 回 值: true : 成功
- false:失败
- ***************************************************************************/
- virtual bool RayCast(b2RayCastOutput* output, const b2RayCastInput& input,
- const b2Transform& transform, int32 childIndex) const = 0;
- /**************************************************************************
- * 功能描述:给出一个变换,计算一个孩子形状的轴对齐包围盒(aabb)
- * 参数说明: aabb : 孩子形状的aabb指针
- xf : 一个变换的引用
- childIndex : 孩子的索引值
- * 返 回 值: (void)
- ***************************************************************************/
- virtual void ComputeAABB(b2AABB* aabb, const b2Transform& xf, int32 childIndex) const = 0;
- /**************************************************************************
- * 功能描述:用它的大小和密度计算形状的质量
- * 参数说明: massData : 计算形状的质量
- density : 密度
- * 返 回 值: (void)
- ***************************************************************************/
- virtual void ComputeMass(b2MassData* massData, float32 density) const = 0;
- //形状类型
- Type m_type;
- //半径
- float32 m_radius;
- };
- //获取形状类型
- inline b2Shape::Type b2Shape::GetType() const
- {
- return m_type;
- }
1、克隆一个形状
2、获取孩子形状类型
3、获取形状的孩子元素的数量
4、投射一束光到一个孩子形状中
5、计算一个孩子形状的轴对齐包围盒(aabb)
6、计算形状的质量
7、测试形状中点的密封性。
还有想问大家一点关于虚函数问题,为什么这里析构函数要定义为虚函数?如果不定义为虚函数又会怎样?有没有其它隐患?希望大家思考一下,有时间的话我们再说一下。
其它具体的定义请见注释,子形状的实现将于下篇文章与大家见面。各位,晚安。。。
ps:
以上文章仅是一家之言,若有不妥、错误之处,请大家多多指出。同时也希望能与大家多多交流,共同进步。