書名:代碼本色:用編程模擬自然系統(tǒng)
作者:Daniel Shiffman
譯者:周晗彬
ISBN:978-7-115-36947-5
目錄
5.12 回到力的話題
1之景、Box2D力的作用
- Box2D中也存在力的作用,因為我們看到前面的各種矩形和圓會在屏幕中旋轉(zhuǎn)和移動馍佑。但到目前為止眷柔,我們只學(xué)會了如何操縱其中的一個全局作用力——重力谣旁。
box2d = new PBox2D(this);
box2d.createWorld();
box2d.setGravity(0, -20); 設(shè)置全局的重力
- 如果想在Box2D中使用第2章的技術(shù)抵怎,我們只需要研究其中的applyForce()函數(shù)
- Mover類實現(xiàn)了這個applyForce()函數(shù):它的參數(shù)是一個向量赃梧,函數(shù)內(nèi)部將這個向量除以質(zhì)量省核,再把得到的結(jié)果加到運動者對象的加速度上掂僵。
- Box2D也有同樣的函數(shù)航厚,而且不需要我們?nèi)崿F(xiàn)它。我們可以直接在Box2D的物體上調(diào)用applyForce()函數(shù)锰蓬!
class Box {
Body body;
void applyForce(Vec2 force) {
Vec2 pos = body.getWorldCenter();
body.applyForce(force, pos); 調(diào)用物體的applyForce()函數(shù)
}
}
以上程序得到一個力向量幔睬,并將它作用在Box2D物體上。和第2章中的示例程序相比芹扭,Box2D是一個更復(fù)雜的物理引擎麻顶。前面的示例程序假設(shè)力總是作用在物體的中心點,但在Box2D中舱卡,我們需要指定力在物體上的作用位置辅肾。盡管以上程序還是將力作用在物體的中心點上,但力的作用點是可設(shè)置的轮锥,它可以不在中心點上矫钓。
假設(shè)我們需要模擬引力,在第2章舍杜,我們在Attractor類中模擬了引力新娜,你還記得我們當時是怎么做的嗎?
PVector attract(Mover m) {
PVector force = PVector.sub(location,m.location);
float distance = force.mag();
distance = constrain(distance,5.0,25.0);
force.normalize();
float strength = (g mass m.mass) / (distance * distance);
force.mult(strength);
return force;
}
- 我們可以用Vec2重新實現(xiàn)同樣的函數(shù)既绩,并在Box2D中使用它概龄。力的計算過程完全基于Box2D坐標,不需要任何像素坐標饲握。
Vec2 attract(Mover m) {
Vec2 pos = body.getWorldCenter(); 首先我們要向Box2D詢問位置
Vec2 moverPos = m.body.getWorldCenter();
Vec2 force = pos.sub(moverPos);
float distance = force.length();
distance = constrain(distance,1,5);
force.normalize();
float strength = (G * 1 m.body.m_mass) / (distance distance);
force.mulLocal(strength); 記住旁钧,在Box2D中吸重,向量相乘的函數(shù)是mulLocal()
return force;
}
2互拾、示例
鼠標風(fēng)力