Box2d源碼學習形狀(上):父形狀的實現

本系列博客是由扭曲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;
}
我們可以看到shape中基本上都是虛函數,是沒有實現的。shape中定義了以下幾個函數:

1、克隆一個形狀

2、獲取孩子形狀類型

3、獲取形狀的孩子元素的數量

4、投射一束光到一個孩子形狀中

5、計算一個孩子形狀的軸對齊包圍盒(aabb)

6、計算形狀的質量

7、測試形狀中點的密封性。

還有想問大家一點關於虛函數問題,爲什麼這裏析構函數要定義爲虛函數?如果不定義爲虛函數又會怎樣?有沒有其它隱患?希望大家思考一下,有時間的話我們再說一下。

其它具體的定義請見註釋,子形狀的實現將於下篇文章與大家見面。各位,晚安。。。

ps:

以上文章僅是一家之言,若有不妥、錯誤之處,請大家多多指出。同時也希望能與大家多多交流,共同進步。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章