Box2D v2.1.0用戶手冊翻譯 - 目錄,第01章 導言(Introduction)

原文地址:http://blog.csdn.net/complex_ok/article/details/6706982

網上已經有個Box2D用戶手冊的翻譯,但是基於v2.0.1,跟最新手冊有很多不對應。

在這裏決定將文檔的全文再翻譯出來,更準確的說是根據網上流傳的v2.0.1版本,將最新文檔重新整理一遍。

很多內容是直接複製自


Aman JIANG(江超宇)翻譯的Box2D v2.0.1 用戶手冊



Box2D v2.1.0 用戶手冊

版權 © 2007-2010 Erin Catto

第01章 導言(Introduction)

第02章 Hello Box2D

第03章 公共模塊(Common)

第04章 碰撞模塊(Collision Module)

第05章 動態模塊(Dynamics Module)

第06章 夾具(Fixtures)

第07章 物體(Bodies)

第08章 關節(Joints)

第09章 接觸(Contacts)

第10章 世界(World Class)

第11章 雜項(Loose Ends)

第12章 調試繪圖(Debug Drawing)

第13章 限制(Limitations)

第14章 參考(References)

 

第01章 導言(Introduction)

1.1 關於

Box2D是個二維剛體仿真庫, 用於編寫遊戲。程序員可以使用它, 讓遊戲中的物體運動起來更真實, 讓遊戲世界更具交互性。以遊戲的角度來看,物理引擎只是個程序性動畫系統。(procedural animation)

(譯註: 做動畫常有兩種方法, 一種是預先準備好動畫所需的數據,比如圖片,再一幀一幀地播放。另一種是以一定方法,動態計算出動畫所需的數據,根據數據再進行繪圖。 
從這種角度看,預先準備的,可稱爲數據性動畫,動態計算的可稱爲程序性動畫。
這個區別,就類似以前我們做歷史題和數學題,做歷史題,記憶很重要,也就是答案需要預先準備好的。做數學題,方法就很重要,答案是需要用方法推導出來的。 
Box2D就是用物理學的方法,推導出那遊戲世界物體的位置,角度等數據。而Box2D也僅僅推導出數據,至於得到數據之後怎麼處理就是程序員自己的事情了。)

Box2D用可移植的C++來寫成,它定義的大部分類型都有b2前綴, 希望這能有效消除Box2D和你自己的遊戲引擎之間的名字衝突。

1.2 先備條件(Prerequisites)

在此手冊中,我假定你已經熟悉了基本的物理概念,比如質量(mass),力(force),扭矩(torque)和衝量(impulses)。如果沒有, 建議讀一下Chris Hecker和David Baraff (google 這些名字)的教程, 你不需要理解得非常細緻, 只需很好地瞭解一些基本概念, 幫助你使用Box2D。

Wikipedia也是個很好的地方,去獲取物理和數學知識。Wikipedia的內容經過了精心的整理,在某些方面可能比google更有用。

在Game Developer Conference上, Box2D是作爲物理教程的一部分而創建的。你可以從box2d.org的下載區得到這些教程。

Box2D是使用C++寫成的, 因此也假定你具備C++編程經驗。Box2D不應該是你的第一個C++程序項目。你應該能熟練地編譯,鏈接和調試。

注意

Box2D不應該是你的第一個C++項目。在使用Box2D之前, 請先學習C++程序設計, 還要學習怎麼去編譯, 連接和調試。網上有很多這方面的資料。

1.3 關於本手冊

本手冊涵蓋了大多數Box2D的API,但並非每個方面都涉及到。Box2D自帶了testbed例子, 鼓勵你去看看, 以便了解更多。另外, Box2D的代碼註釋已被整理過, 符合Doxygen程序的格式要求, 所以很容易就可以創建一個有超鏈接的API文檔。

1.4 反饋及錯誤報告

如果你想反饋Box2D的任何內容,請在論壇裏留下意見。這也是個交流討論的好去處。

Box2D使用了Google code project進行問題跟蹤。這是個跟蹤問題的好方法, 保證你的反饋不會被淹沒在論壇深處而無人理會。

你的問題描述得越詳細, 就越有可能得到修復。假如有個測試例子將問題重現, 就更好了。

1.5 核心概念(Core Concepts)

Box2D中有一些基本對象, 這裏我們先做一個簡要的定義, 隨後的文檔會有更詳細的描述。

形狀(shape)

2D幾何對象, 比如圓形(circle)或多邊形(polygon)。

剛體(rigid body)

十分堅硬的物質, 堅硬得像鑽石,它上面任意兩點之間的距離都保持不變。在後面的討論中,我們用物體(body)來代替剛體。

夾具(fixture)

fixture將形狀綁定到物體之上, 並有一定的材質屬性, 比如密度(density), 摩擦(friction)和恢復(restitution)。

(譯註:一個物體和另一物體碰撞, 碰撞後速度和碰撞前速度的比值會保持不變,這比值就叫恢復係數。)

約束(constraint)

約束是個物理連接, 用於消除物體的自由度。在2D中, 物體有3個自由度(水平,垂直,旋轉)。如果我們把一個物體釘在牆上(像鐘擺那樣), 那就把它約束到了牆上。這個時候,此物體就只能繞着釘子旋轉, 所以這個約束消除了它2個自由度。

(譯註:簡單的說, 需要用幾個參數來確定物體的空間狀態, 這個物體就有幾個自由度。在二維中,完全沒有約束的條件下, 我們要確定物體的狀態, 要有x座標, y座標, 旋轉角這三個參數, 所以自由度爲3。如果物體被釘在牆上, 只要有旋轉角,就可以完全確定物體的狀態,有了釘子這個約束,物體自由度就變成了1。)

接觸約束(contact constraint)

一種特殊的約束, 設計的目的是爲了防止剛體被穿透, 也用於模擬摩擦和恢復。接觸約束不用你來創建, 它們會自動被Box2D生成。

關節(joint)

關節就是種約束, 用於將兩個或多個body固定到一起。Box2D支持不同的關節類型:轉動(revolute),棱柱(prismatic),距離(distance)等。一些關節可以有限制(limits)和馬達(motors)。

關節限制(joint limit)

關節限制限定了一個關節的運動範圍。例如人類的胳膊肘只能在某一角度範圍內運動。

關節馬達(joint motor)

根據關節的自由度, 關節馬達可以驅動關節所連接的物體。例如, 你可以使用一個馬達來驅動一個肘的旋轉。

世界(world)

一個物理世界就是各種, 剛體(bodies), 夾具(fixtures), 約束(constraints)相互作用的集合。 Box2D支持創建多個世界, 但這通常沒有必要。

1.6 模塊(Modules)

Box2D由三個模塊組成:公共(Common)、碰撞(Collision)、和動態(Dynamics)。Common模塊包括了內存分配、數學計算和配置。Collision模塊定義了形狀(shapes)、broad-phase檢測和碰撞功能/查詢(collision functions/queries)。最後,Dynamics模塊提供對世界(world)、剛體(bodies)、夾具(fixtures)和關節(joint)的模擬。

(譯註: Broad Phase是碰撞檢測的一個子階段, 將空間分割, 每個空間對應一個子樹, 物體就放到樹中, 不同子樹內的物體不可能相交不用去計算, 在同一個子樹由對應的算法再計算出接觸點等信息。因爲這是遠距碰撞檢測,就叫Broad Phase, 接下來還有Narrow Phase。)


1.7 單位

Box2D使用浮點數, 所以必須使用一些公差來保證它正常工作。這些公差已經被調諧得適合米-千克-秒(MKS)單位。尤其是, Box2D被調諧得能良好地處理0.1到10米之間的移動物體。這意味着從罐頭盒到公共汽車大小的對象都能良好地工作。靜態的物體就算到50米都沒有大問題。

作爲一個2D物理引擎,如果能使用像素作爲單位是很誘人的。很不幸,那將導致不良模擬,也可能會造成古怪的行爲。一個200像素長的物體在Box2D看來就有45層建築那麼大。想象下使用一個已調諧好用於模擬玩偶和木桶的引擎去模擬高樓大廈的運動。那並不有趣。

注意

Box2D 已被調諧至 MKS 單位。移動物體的尺寸應該保持在大約 0.1 到 10 米之間。當你渲染場景和角色時, 可能要用到一些比例縮放系統。Box2D自帶的testbed例子使用了OpenGL的視口變換。

最好把Box2D中的物體看作移動的廣告板, 其上帶着你的藝術創作。廣告板在一個以米爲單位的系統裏運動,但你可以利用簡單的比例因子把它轉換爲像素座標。之後就可以使用這些像素座標去確定你的精靈(sprites)的位置,等等。

Box2D裏的角使用弧度制。物體的旋轉角度以弧度方式存儲,並可以無限增大。如角度變得太大,可考慮將角度進行規範化。(使用b2Body:SetAngle)。

1.8 工廠和定義

內存管理在 Box2D API 的設計中擔當了一箇中心角色。所以當你創建一個 b2Body 或一個 b2Joint時, 你需要調用 b2World 的工廠函數(factory functions)。你不應以別的方式爲這些類型分配內存。

這些是創建函數:

b2Body* b2World::CreateBody(constb2BodyDef* def)

b2Joint* b2World::CreateJoint(constb2JointDef* def)

這些是對應的摧毀函數:

void b2World::DestroyBody(b2Body*body)

void b2World::DestroyJoint(b2Joint*joint)

當你創建物體或關節時, 需要提供定義(definition)。這些定義包含了創建物體或關節時需要的所有信息。使用這樣的方法,我們能夠預防構造錯誤,使函數參數的數量較少,提供有意義的默認值,並減少訪問子(accessor)的個數。

fixture必須有父body, 要使用b2Body的工廠方法來創建及摧毀。

b2Fixture* b2Body::CreateFixture(constb2FixtureDef* def)

voidb2Body::DestroyFixture(b2Fixture* fixture)

也有個簡便方法直接用形狀和密度來創建fixture

b2Fixture* b2Body::CreateFixture(constb2Shape* shape, float32 density)

工廠並不保留定義的引用, 你可以在棧上臨時創建定義。

1.9 用戶數據

b2Fixture, b2Body 和 b2Joint 類都允許你通過一個 void 指針來附加用戶數據。當你測試Box2D, 以及使得Box2D的數據結構跟自己的遊戲引擎結合起來, 用void指針是較爲方便的。

舉個典型的例子, 角色上有剛體, 並在剛體中附加角色的指針, 就構成了一個循環引用。如果你有角色(actor), 你就能得到剛體。如果你有剛體,你就能得到角色。

GameActor* actor =GameCreateActor();

b2BodyDef bodyDef;

bodyDef.userData = actor;

actor->body =box2Dworld->CreateBody(&bodyDef);

一些需要用戶數據的例子:

•                    使用碰撞結果給角色施加傷害。

•                    當玩家進入一個包圍盒(axis-aligned box)時觸發腳本事件

•                    當Box2D通知關節就要摧毀時, 去訪問某個遊戲結構。

記住,用戶數據是可選的,並且能放入任何東西。然而,你需要確保一致性。例如,如果你想在某個body中保存actor的指針,那你就應該在所有的body中都保存actor指針。不要在一個body中保存actor指針,卻在另一個body中保存foo指針。將一個actor指針強制轉成foo指針,可能會導致程序崩潰

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