2016-04-24 75 views
1

當我將很多物體(矩形)堆疊在一起時,它們不能保持穩定。即使恢復原狀爲0,他們也很有彈性並且彼此脫落。我嘗試將密度設置爲非常低的值,但沒有改變。box2d(libgdx)堆疊物體不穩定

有沒有可能解決這個問題?

shape.setAsBox(0.1f, 0.1f, new Vector2(0, 0), 0); 
    bDef = new BodyDef(); 
    bDef.type = BodyDef.BodyType.DynamicBody; 
    bDef.position.set(0, 0); 

    fDef.shape = shape; 
    fDef.density = 0.001f; 
    fDef.friction = 0.5f; 
    fDef.restitution = 0.0f; 

    for (int i = 1; i < 50; i++) { 
     bDef.position.set(0, i * 0.201f); 
     body1 = world.createBody(bDef); 
     fixture = body1.createFixture(fDef); 
    } 
+0

嘗試增加兩個盒子之間的間隙並讓它們掉落,您可能會將它們放在彼此的頂部,導致側向移動。 –

+0

試了很多值。當它們互相墜落時,它也不起作用。 – NuclearVirus

+0

「地面」塊的恢復是否也設置爲0?此外,請嘗試增加密度,因爲密度更大時會彈起更少的密度。 –

回答

0

只要這是我認爲的問題,那麼是的,這是可以解決的。雖然有額外的工作。但在短期內,沒有。

當我從Box2D 2.3.2運行測試牀的「垂直堆棧」測試時,我看到一堆盒子在垂直堆棧中相互疊放。起初他們堆疊,然後他們擺動,然後他們翻倒。這是Box2D如何設計的。我不喜歡那種行爲,所以我改變了它。

我懷疑這和你所看到的基本上是一樣的問題。我用來修改這個並獲得穩定堆棧行爲的「修復」涉及到更改內部Box2D庫代碼。

從算法上講,我修改了通過一次應用一個碰撞流形點解決衝動來完成位置分辨率的方式,以解決按穿透深度順序應用脈衝或者當它們幾乎相等時同時應用脈衝。代碼方面,我基本上對Erin的b2ContactSolver::SolvePositionConstraintsb2ContactSolver::SolveTOIPositionConstraints方法(Erin的b2ContactSolver.cpp)進行了算法改變。

此更改算法的代碼位於dev branch of my fork of Box2D(請參閱ContactSolver.cpp文件中的SolvePositionConstraint函數)。不幸的是,我沒有差異,只適用於這些方法,因爲我的代碼更改超出了這些方法。此外,即使您可以爲您的平臺構建Box2D庫公共界面,我所做的更改仍然需要修改您的代碼以適應我的新界面。