2012-10-26 62 views
0

我正在嘗試使用box2dweb在2D中創建一個類似汽車的事物。我有一個車廂和兩個圓圈,通過旋轉關節與車輪相連。一切運作良好一段時間,但逐漸增加輪子的中心和他們所附的盒子上的點之間的差距。爲求解器設置更多的迭代不會有幫助,並且遲早輪子會完全離開盒子。它看起來像某種累積的錯誤。此外,車輪碰撞與地面上的一些顛簸似乎是造成這一問題的最主要因素。最初,它就像左圖,但之後,我開車過來的大球在地面上幾次,它就會像右圖,並保持這種方式:Box2dWeb旋轉關節「拉伸」

Left: initial state, right: after I drive it over the big circle several times.

我用了一箇舊的box2djs庫之前似乎並沒有這個問題。將代碼移植到box2dweb後出現問題。在這兩個圖書館中如何創造事物有很多不同,所以我一定錯過了一些東西,但不知道是什麼。

的框代碼:

function createBox(world, x, y, width, height) 
{ 
    var fixDef = new b2FixtureDef; 
    fixDef.density = 1.0; 
    fixDef.friction = 1.0; 
    fixDef.restitution = 1.0; 

    var bodyDef = new b2BodyDef; 
    bodyDef.type = b2Body.b2_dynamicBody; 
    bodyDef.position.x = x; 
    bodyDef.position.y = y; 

    fixDef.shape = new b2PolygonShape; 
    fixDef.shape.SetAsBox(width, height); 

    var b = world.CreateBody(bodyDef); 
    b.CreateFixture(fixDef); 
    return b; 
} 

對於車輪(幾乎相同,只是它創建圈子):

function createBall(world, x, y, r) 
{ 
    var fixDef = new b2FixtureDef; 
    fixDef.density = 1.0; 
    fixDef.friction = 1.0; 
    fixDef.restitution = 1.0; 

    var bodyDef = new b2BodyDef; 
    bodyDef.type = b2Body.b2_dynamicBody; 
    bodyDef.position.x = x; 
    bodyDef.position.y = y; 

    fixDef.shape = new b2CircleShape(r); 

    var b = world.CreateBody(bodyDef); 
    b.CreateFixture(fixDef); 
    return b; 
} 

而對於關節:

var jointDef_rear = new b2RevoluteJointDef(); 
jointDef_rear.Initialize(rear_wheel, car_body, rear_wheel.GetPosition()); 
jointDef_rear.maxMotorTorque = 10.0; 
jointDef_rear.enableMotor = true; 

rear_joint = world.CreateJoint(jointDef_rear); 

var jointDef_front = new b2RevoluteJointDef(); 
jointDef_front.Initialize(front_wheel, car_body, front_wheel.GetPosition()); 
jointDef_front.maxMotorTorque = 10.0; 
jointDef_front.enableMotor = true; 

front_joint = world.CreateJoint(jointDef_front); 

所以儘管我討厭問「我的代碼有什麼問題」-kinda問題,我在這裏做錯了什麼?

+0

您可以上傳代碼,以便我可以看到它的實際運行情況嗎? – Shekhar

+0

當然。 http://lazunin.com/ask/rotate。html最快的方法是使用「A」和「D」鍵幾次使前輪碰到地面(ASD控制後輪,JKL - 前輪)。http://lazunin.com/poro /我還有另一個例子,它使用box2djs而不是box2dweb,並且完全沒有伸展。 – Headcrab

回答

0

看來問題是由零位迭代造成的:

world.Step(dt, iterations); 

看來,在舊版本Box2Djs的函數的原型是完全一樣的。在較新的版本,但是,又改爲

function (dt, velocityIterations, positionIterations) 

的所有參數默認爲0調用舊的方式,像world.Step(dt, iterations)然後將等於world.Step(dt, iterations, 0),仍然「之類的」作品,但連接體的相對位置沒有正確解決。我嘗試將它稱爲world.Step(dt, iterations, iterations),並且突然間一切都得到了修復,即使迭代次數很低,例如3.

0

最可能的原因是大量的屍體。

Box2D的maunal說:如果一個打火機體支承較重的主體由關節連接機構的
鏈可以伸展。例如,連接到輕重量鏈條的破壞球可能不穩定。質量比通過10:1時,穩定性下降。

你前輪過小,並具有密度等於其他機構。所以它的質量與車身質量有很大的不同。例如,嘗試設置車身密度0.2,後輪密度超過0.5,密度前輪超過1.5。或者更好地通過b2Body::SetMassData設置每個機構的質量手冊。我認爲,最好讓車輪變得更重,然後是箱子。

+0

我試過了,沒有幫助,它們仍然伸展,並且非常可笑。 – Headcrab