cocos2d-js Chipmunk剛體:cp.Body 筆記

1 遊離和靜態剛體

通常當咱們建立一個剛體並將它添加到空間上後,空間就開始對之進行模擬,包括了對剛體位置、速度、受力以及重力影響等的模擬。沒被添加到空間(沒有被模擬)的剛體咱們把它稱之爲遊離剛體。遊離剛體最重要的用途就是用來看成靜態剛體,可是你仍然可使用它們來實現直接控制物體,如移動平臺。git

靜態剛體是遊離剛體,但被設置了一個特殊的標誌以便讓Chipmunk知道它們從不移動除非你要求這麼作。靜態剛體有兩個目的。最初,它們被加入用 來實現休眠功能。由於靜態剛體不移動,Chipmunk知道讓那些與靜態剛體接觸或者鏈接的物體安全的進入休眠。接觸或鏈接常規遊離剛體的物體從不容許休 眠。靜態剛體的第二個目的就是讓Chipmunk知道,關聯到靜態剛體的碰撞形狀是不須要更新碰撞檢測數據的。Chipmunk也不須要操心靜態物體之間 的碰撞檢測。一般全部的關卡幾何圖形都會被關聯到一個靜態剛體上除了那些可以移動的東西,例如平臺或門等。github

每個空間都有一個專用的靜態剛體(staticBody),你可使用它來添加靜態形狀。Chipmunk也會自動將形狀做爲靜態形狀添加到靜態剛體上。安全

2.屬性

Chipmunk爲剛體的多個屬性提供了getter/setter函數。若是剛體在休眠狀態,設置大多數屬性會自動喚醒它們。若是你想,你也能夠直接在cp.Body結構體內設置字段。它們都在頭文件中有記錄。app

body.getMass()
body.setMass(Float m)

剛體的質量。函數

body.getMoment()
body.setMoment(Float i)

剛體的轉動慣量(MoI(譯者注:Moment Of Inertia即轉動慣量的縮寫)或有時只說慣量)。慣量就像剛體的旋轉質量。請查閱下面的函數來幫助計算慣量。spa

body.getPos()
body.setPos(cp.Vect pos)

剛體重心的位置。當改變位置的時候若是你要計劃對空間進行任何查詢,你可能還須要調用cpSpaceReindexShapesForBody()來更新關聯形狀的碰撞檢測信息。指針

body.getVel()
body.setVel(cp.Vect value)

剛體重心的線速度。code

body.f

施加到剛體重心的力。在湖聞樟注:沒有在源碼是找到對應的getter/setter函數對象

body.getAngle()
body.setAngle(Float a)

剛體的角度,弧度制。當改變角度的時候若是你要計劃對空間進行任何查詢,你可能還須要調用space.reindexShapesForBody()來更新關聯形狀的碰撞檢測信息。ip

body.etAngVel()
body.setAngVel(Float value)

剛體的角速度,弧度/秒,

body.getTorque()
body.setTorque(Float value)

施加到剛體的扭矩。

body.getRot()

剛體的旋轉向量。可經過cpvrotate()或者cpvunrotate()進行快速旋轉。

body.getVelLimit()
body.setVelLimit(Float value)

剛體的速度極限。、默認爲INFINITY(無限大),除非你專門設置它。能夠被用來限制下落速度等。

body.getAngVelLimit()
body.setAngVelLimit(Float value)

剛體以弧度/秒的角速度限制。默認爲INFINITY,除非你專門設置它。

body.getSpace()

獲取body所添加進去的cpSpace

在湖聞樟注:在c的版本中有 cpBodySetUserData()、cpBodySetUserData()這兩個用戶數據指針的函數,但cocos2d-js中沒有。估計是考慮到js的對象的特性,若是須要的話能夠聲明一個userData成員。

3.轉動慣量和麪積幫助函數

使用如下函數來近似計算出剛體的轉動慣量,若是想獲得多個,那就將結果相加在一塊兒。

  • cpFloat cp.momentForCircle(cpFloat m, cpFloat r1, cpFloat r2, cp.Vect offset) – 計算空心圓的轉動慣性,r1和r2是在任何特定順序下的內徑和外徑。 (實心圓圈的內徑爲0)

  • cpFloat cp.momentForSegment(cpFloat m, cpVect a, cp.Vect b) – 計算線段的轉動慣量。端點ab相對於剛體。

  • cpFloat cp.momentForPoly(cpFloat m, int numVerts, cp.Vect verts, cp.Vect offset) – 計算固定多邊形的轉動慣量,假設它的中心在質心上。offset偏移值被加到每一個頂點。

  • cpFloat cp.momentForBox(cpFloat m, cpFloat width, cpFloat height) – 計算居中於剛體的實心矩形的轉動慣量。

轉動慣量例子

// 質量爲2,半徑爲5的實心圓的轉動慣量
var circle1 = cp.momentForCircle(2, 0, 5, cp.vzero);

// 質量爲1,內徑爲1,外徑爲6的空心圓的轉動慣量
var circle2 = cp.momentForCircle(1, 2, 6, cp.vzero);

// 質量爲1,半徑爲3,x軸方向偏離重心量爲3的實心圓的轉動慣量
var circle3 = cp.momentForCircle(2, 0, 5, cp.v(3, 0));

// 複合對象。居中於重心的1x4的矩形和y軸偏移重心量爲3,半徑爲1的實心圓
// 只需將轉動慣量相加到一塊兒
var composite = cp.momentForBox(boxMass, 1, 4) + cpMomentForCircle(circleMass, 0, 1, cp.v(0, 3));

若是你想近似計算諸如質量或密度此類的東西,可使用下列函數來獲取Chipmunk形狀區域。

  • cpFloat cp.areaForCircle(cpFloat r1, cpFloat r2) – 空心圓形狀面積

  • cpFloat cp.areaForSegment(cpVect a, cp.Vect b, cpFloat r) – 斜線段面積。(若是半徑爲0的話永遠爲0)

  • cpFloat cp.areaForPoly(int numVerts, cp.Vect verts) – 多邊形形狀的面積。多邊形爲凹多邊形時返回一個負值。

4.座標系轉換函數

許多事情被定義在剛體的局部座標,也就意味着(0,0)是剛體的重心和軸線旋轉中心。

  • cp.Vect body.local2World(cp.Vect v) – 從剛體局部座標系轉換到世界座標系

  • cp.Vect body.world2Local(const cpVect v) – 從世界座標系轉換到剛體的局部座標系

5.施加力和力矩

人們有時候容易混淆力和衝量之間的區別。衝量基本上是一個在很是短的時間內施加的一個很是大的力,就像一個球擊中一堵牆或者大炮射擊同樣。Chipmunk的衝量會在一瞬間直接施加在物體的速度上。不管是力仍是衝量都受到物體質量的影響。物體質量翻倍,則效果減半。

  • body.resetForces() – 對剛體施加0值的力和扭矩

  • body.applyForce(cp.Vect f, cp.Vect r) – 在離重心相對偏移量爲r的位置施加f的力於body

  • body.applyImpulse(const cp.Vect j, cp.Vect r) – 在離重心相對偏移量爲r的位置施加j的衝量於body上。

注: applyForce()applyImpulse()二者都是在絕對座標系中施加力或者衝量,並在絕對座標系中產生相對的偏移。(偏移量相對於重心位置,但不隨剛體旋轉)

參考:https://github.com/ChipmunkCommunityCN/ChipmunkDocsCN/blob/master/Chipmunk2D.md

相關文章
相關標籤/搜索