2014-05-18 70 views
1

我在Box2D的兩個圓弧形的動態物體,無論是通過調用這個程序:對象甚至穿透子彈模式

Disk *World::AddDisk(float32 x, float32 y, float32 radius, float32 density) { 
    b2BodyDef bodyDef; 
    bodyDef.type = b2_dynamicBody; 
    bodyDef.position.Set(x, y); 
    bodyDef.bullet = true; 
    b2Body *body = this->world.CreateBody(&bodyDef); 

    b2CircleShape shape; 
    shape.m_p.Set(0, 0); 
    shape.m_radius = radius; 

    b2FixtureDef fixtureDef; 
    fixtureDef.shape = &shape; 
    fixtureDef.density = density; 
    fixtureDef.restitution = 0.8; 
    b2Fixture *fixture = body->CreateFixture(&fixtureDef); 

    Disk *d = new Disk(this, body, fixture); 
    this->disks.push_back(d); 
    return d; 
} 

這些是創造我的兩個圓的呼叫:

world.AddDisk(0, 0, 10, 5.97219e+12); 
world.AddDisk(20, 20, 5, 1); 

我嘗試通過在重力爲零的同時對其中一個施加一定的力量而將其移動到較小的圓盤上。這些圓圈滲入了一個明顯的數量(雖然不是太小)。

我也嘗試使用正常重力,將較大的圓的重力縮放爲零。另一個正常移動,但是在一小段穿透之後它又被擊退了。

是不是子彈模式(即CCD)應該消除滲透?起初,我認爲這些圈子滲透的原因是我對一個人施加了一個持續的力量,而他們碰觸時沒有考慮到正常的力量。但後來我看到Box2D的引力也一樣。有什麼想法發生在這裏?

回答

2

CCD旨在消除隧穿,而不是相互滲透。當動態物體碰撞靜態物體時,它特別消除了隧道效應。它與兩個動態主體不一樣。

我見過的每一款遊戲物理引擎都有相互滲透的情況,特別是當身體與衆不同時。避免這種情況的一個很好的經驗法則是保持身體的質量比小於10:1(當然,如果Box2D手冊建議採用不同的比例,那麼就與此相適應)。降低你的時間步驟也有幫助。

+0

我改變了羣衆,使他們接近;沒有明顯的變化。也使更大的磁盤成爲一個靜態主體;還是一樣。無論如何,我認爲尺寸需要接近,而不是羣衆。我想模擬一些行星間物理。你是說我最好推出自己的? (我一開始就部分推出了自己的產品,然後我認爲我會使用Box2D。) – Elektito

+0

我想這可能是你最初懷疑的不變的力量。如果你推出自己的產品,你會遇到同樣的問題......當然這可能是一個有趣的解決方案。 – jhoffman0x

+0

我現在對這種混淆事實上持懷疑態度,因爲Box2D的正常引力必須是相同的 - 它對較小的磁盤施加一定的力(較大的磁盤被縮放爲零)。 – Elektito