簡體   English   中英

使用 Box2D 模擬“牛頓萬有引力定律”

[英]Simulate "Newton's law of universal gravitation" using Box2D

我想使用 Box2D 模擬牛頓萬有引力定律

我瀏覽了手冊,但找不到這樣做的方法。

基本上我想要做的是在空間中放置幾個物體(零重力)並模擬運動。

有小費嗎?

這很容易實現:

for ( int i = 0; i < numBodies; i++ ) {

    b2Body* bi = bodies[i];
    b2Vec2 pi = bi->GetWorldCenter();
    float mi = bi->GetMass();

    for ( int k = i; k < numBodies; k++ ) {

        b2Body* bk = bodies[k];
        b2Vec2 pk = bk->GetWorldCenter();
        float mk = bk->GetMass();

        b2Vec2 delta = pk - pi;
        float r = delta.Length();
        float force = G * mi * mk / (r*r);

        delta.Normalize();
        bi->ApplyForce(  force * delta, pi );
        bk->ApplyForce( -force * delta, pk );
    }
}

正如其他人所說,Box2D 沒有內置支持。 但是您可以在 b2_islands.cpp 的庫中添加對它的支持。 只需更換

v += h * b->m_invMass * (b->m_gravityScale * b->m_mass * gravity + b->m_force);  

int planet_x = 0;
int planet_y = 0;
b2Vec2 gravityVector = (b2Vec2(planet_x, planet_y) - b->GetPosition());    
gravityVector.Normalize();    
gravityVector.x = gravityVector.x * 10.0f;    
gravityVector.y = gravityVector.y * 10.0f;    
v += h * b->m_invMass * (b->m_gravityScale * b->m_mass * gravityVector + b->m_force);    

如果你只有一個星球,那是一個簡單的解決方案。 如果您想要越遠的力量越小,您可以使用 1/gravityVector 而不是對其進行歸一化。 這也使得增加行星的引力成為可能。 您還可以遍歷行星列表並將重力向量相加。

此外,實現像 b2World::CreatePlanet 這樣的 function 可能會很有用。

10.0f 只是來自地球的 9.81f 的近似值,您可能需要對其進行調整。 如果行星的質量相關,您可能需要乘以一個常數,使其看起來更逼真,或者只是增加 object 的密度以使其與行星的實際重量相匹配。

當然,您也可以將重力設置為 0、0,然后在每個 object 的每一步之前計算它,但這可能沒有那么多性能。

不幸的是,Box2D 沒有對它的原生支持,但您可以自己實現它: Box2D 和徑向重力代碼

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM