我正在嘗試使用box2dweb在2D中創建一個類似汽車的事物。我有一個車廂和兩個圓圈,通過旋轉關節與車輪相連。一切運作良好一段時間,但逐漸增加輪子的中心和他們所附的盒子上的點之間的差距。爲求解器設置更多的迭代不會有幫助,並且遲早輪子會完全離開盒子。它看起來像某種累積的錯誤。此外,車輪碰撞與地面上的一些顛簸似乎是造成這一問題的最主要因素。最初,它就像左圖,但之後,我開車過來的大球在地面上幾次,它就會像右圖,並保持這種方式:Box2dWeb旋轉關節「拉伸」
我用了一箇舊的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問題,我在這裏做錯了什麼?
您可以上傳代碼,以便我可以看到它的實際運行情況嗎? – Shekhar
當然。 http://lazunin.com/ask/rotate。html最快的方法是使用「A」和「D」鍵幾次使前輪碰到地面(ASD控制後輪,JKL - 前輪)。http://lazunin.com/poro /我還有另一個例子,它使用box2djs而不是box2dweb,並且完全沒有伸展。 – Headcrab