初识 Box2D世界
? ? ? ?本文你可以初步認(rèn)識(shí)下這個(gè)強(qiáng)大的物理引擎,你將會(huì)學(xué)到創(chuàng)建一個(gè)簡(jiǎn)單的Box2D應(yīng)用基本流程,了解b2World物理世界,這個(gè)世界力的基本作用 --- 重力,以及如何開(kāi)啟Box2D調(diào)試試圖。
1.1 什么是Box2D引擎
? ? ? ?Box2D集成了大量的物理力學(xué)和運(yùn)動(dòng)學(xué)的計(jì)算,并將物理模擬過(guò)程封裝到類(lèi)對(duì)象中,將對(duì)物體的操作,以簡(jiǎn)單友好的接口提供給開(kāi)發(fā)者。我們只需要調(diào)用引擎中相應(yīng)的對(duì)象或函數(shù),就可以模擬現(xiàn)實(shí)生活中的加速、減速、拋物線運(yùn)動(dòng)、萬(wàn)有引力、碰撞反彈等等各種真實(shí)的物理運(yùn)動(dòng)。簡(jiǎn)單的說(shuō),Box2D就是一個(gè)物理剛體仿真庫(kù)
1.2?創(chuàng)建Box2D世界
? ? ??Box2D中用 b2World 類(lèi)來(lái)表示世界,他是Box2D 的核心類(lèi)之一,集成了Box2D對(duì)所有對(duì)象的創(chuàng)建,刪除,碰撞模擬的相關(guān)?接口。
12.1 重力
? ? 重力,簡(jiǎn)單的將就是使用物體自然下落的力,Box2D 中 b2Vec2 向量類(lèi)來(lái)模擬作用力,分別為 x,y 兩個(gè)參數(shù)。? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 創(chuàng)建一個(gè)重力的代碼如下:
let gravity:Box2D.Common.Math.b2Vec2 = new Box2D.Common.Math.b2Vec2(0,9.8);應(yīng)為重力是向下的所以水平方向?yàn)?#xff1a; 0 。
1.2.2 創(chuàng)建世界
? ? “世界” 在 Box2D 中用 b2World 類(lèi)來(lái)表示。 b2World類(lèi)的構(gòu)造函數(shù)中有兩個(gè)參數(shù)每一個(gè)就是前面所說(shuō)的重力 gravity 。
? ? 另外一個(gè)是 doSleep的 布爾值參數(shù) ,表示box2d 引擎是否將靜止不動(dòng)的剛體設(shè)置為睡眠狀態(tài)。
? ?// 為 true 時(shí) 將靜止的剛體標(biāo)記為隨眠狀態(tài),在遍歷的時(shí)候直接跳過(guò)去,不進(jìn)行運(yùn)動(dòng)模擬計(jì)算,提高了Box2D的計(jì)算效率,節(jié)省CPU
接下來(lái)用代碼來(lái)實(shí)現(xiàn)一個(gè)世界
private _world:b2World;// 創(chuàng)建物理世界private create2bWorld():void{let gravity:Box2D.Common.Math.b2Vec2 = new Box2D.Common.Math.b2Vec2(0,10); // 重力 let doSleep:boolean = true; // 為 true 時(shí) 將靜止的剛體標(biāo)記為隨眠狀態(tài),在遍歷的時(shí)候直接跳過(guò)去,不進(jìn)行運(yùn)動(dòng)模擬計(jì)算,提高了Box2D的計(jì)算效率,節(jié)省CPU this._world = new b2World(gravity,doSleep);}1.3 開(kāi)啟 Box2D 模擬
? ? 每一幀基于大量的物理運(yùn)動(dòng)公式,計(jì)算出剛體的坐標(biāo),角度,速度等等,形成動(dòng)態(tài)的物理模擬效果。 box2D已經(jīng)把這個(gè)復(fù)雜的計(jì)算過(guò)程封裝成 step()的函數(shù)中。 我們只需每一幀調(diào)用這個(gè)函數(shù)既可以了。
? ? a.? ?delat: 每次更新計(jì)算之間經(jīng)過(guò)的時(shí)間。 2bworld.step() 時(shí)也要經(jīng)過(guò)一定的時(shí)間,假設(shè)這個(gè)時(shí)間時(shí) interval 秒(或者你可以理解成每一幀持續(xù)的時(shí)間 1/fps秒),當(dāng) delta小于 interval時(shí),呈現(xiàn)出來(lái)就是慢放效果,反之則 快進(jìn)效果,所以保證 delta == interval 跟重要。
? ? 大部分游戲都是基于幀頻進(jìn)行的,而且在30以上才能保證流暢,所以 interval = 1/30秒.
? ? b. positionDelta: 取值越大,單次step()物理模擬碰撞重疊的矯正精度越高,但消耗就越大。通常為10
? ? c. velocityDelta:? 兩個(gè)不同速度運(yùn)動(dòng)體發(fā)生碰撞時(shí),根據(jù)物體的質(zhì)量,速度大小和方向,會(huì)重新分配,取值越大矯正越精確,消耗就越大 通常為10即可。
private update():void{this._world.Step(1/30,10,10);}? ? 好了我們已經(jīng)完美的創(chuàng)建了一個(gè)box2d世界.接下來(lái)就是給世界添加剛體(b2Box2d)
? ??
總結(jié)
以上是生活随笔為你收集整理的初识 Box2D世界的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 启动jar 日志输出
- 下一篇: 程序员如何明确职业与人生的目标