2013-03-27 65 views
0

我正在創建一堆隨機物體,並將它們約束爲一個固定的物體(圓形),並帶有棱形關節。目標是讓他們滑向那個固定的圈子。爲什麼物體不能錨定到棱形關節

問題是 - 物體從關節的邊緣脫落,因爲它們似乎沒有錨定。

我在做什麼錯?

爵士小提琴:http://jsfiddle.net/Jk5VD/7/

JS:(直行Physics.prototype.connectToCenterWithJoint聯合代碼)

var Physics = (function() { 
    function Physics() { 
     this.bodies = []; 
     this.testObjectCount = 30; 
     this.w = new Box2D.Dynamics.b2World(new Box2D.Common.Math.b2Vec2(0, 10), true); 
     var fixture = new Box2D.Dynamics.b2FixtureDef(); 
     this.bodyDef = new Box2D.Dynamics.b2BodyDef(); 
     this.bodyDef.type = Box2D.Dynamics.b2Body.b2_staticBody; 
     this.bodyDef.position.x = 9; 
     this.bodyDef.position.y = 13; 
     fixture.shape = Box2D.Collision.Shapes.b2PolygonShape.AsBox(10, .5); 
     this.w.CreateBody(this.bodyDef).CreateFixture(fixture); 
     this.bodyDef.type = Box2D.Dynamics.b2Body.b2_dynamicBody; 
     this.bodyDef = new Box2D.Dynamics.b2BodyDef(); 
     this.bodyDef.type = Box2D.Dynamics.b2Body.b2_staticBody; 
     this.bodyDef.position.x = 10; 
     this.bodyDef.position.y = 6; 
     fixture.shape = new Box2D.Collision.Shapes.b2CircleShape(1); 
     var circle = this.w.CreateBody(this.bodyDef); 
     circle.CreateFixture(fixture); 
     this.c = circle; 
     this.bodyDef.type = Box2D.Dynamics.b2Body.b2_dynamicBody; 
     this.populate(); 
     this.testJoints(); 
    } 
    Physics.prototype.populate = function() { 
     var fixture = new Box2D.Dynamics.b2FixtureDef(); 
     for(var i = 0; i < this.testObjectCount; ++i) { 
      var rnd = Math.random(); 
      if(rnd > 0.7) { 
       fixture.shape = Box2D.Collision.Shapes.b2PolygonShape.AsBox(Math.random() + 0.1, Math.random() + 0.1); 
      } else if(rnd < .7 && rnd > .3) { 
       fixture.shape = new Box2D.Collision.Shapes.b2CircleShape(Math.random() + 0.1); 
      } else { 
       var vertices = [ 
        new Box2D.Common.Math.b2Vec2(0.0, 0.0), 
        new Box2D.Common.Math.b2Vec2(1.0, 0.0), 
        new Box2D.Common.Math.b2Vec2(0.0, 1.0) 
       ]; 
       fixture.shape = Box2D.Collision.Shapes.b2PolygonShape.AsArray(vertices); 
      } 
      this.bodyDef.position.x = Math.random() * 20; 
      this.bodyDef.position.y = Math.random() * 10; 
      var body = this.w.CreateBody(this.bodyDef); 
      body.CreateFixture(fixture); 
      this.bodies.push(body); 
     } 
    }; 
    Physics.prototype.bindToCanvas = function (canvasId) { 
     var _this = this; 
     var debugDraw = new Box2D.Dynamics.b2DebugDraw(); 
     debugDraw.SetSprite((document.getElementById(canvasId)).getContext("2d")); 
     debugDraw.SetDrawScale(30.0); 
     debugDraw.SetFillAlpha(0.3); 
     debugDraw.SetLineThickness(1.0); 
     debugDraw.SetFlags(Box2D.Dynamics.b2DebugDraw.e_shapeBit | Box2D.Dynamics.b2DebugDraw.e_jointBit); 
     this.w.SetDebugDraw(debugDraw); 
     window.setInterval(function() { 
      _this.update(); 
     }, 1000/60); 
    }; 
    Physics.prototype.connectToCenterWithJoint = function (b) { 
     var jd = new Box2D.Dynamics.Joints.b2PrismaticJointDef(); 
     var axis = Box2D.Common.Math.b2Math.SubtractVV(b.GetWorldCenter(), this.c.GetWorldCenter()); 
     axis.Normalize(); 
     jd.Initialize(this.c, b, b.GetWorldCenter(), axis); 
     jd.lowerTranslation = -1; 
     jd.upperTranslation = 0; 
     jd.enableLimit = true; 
     this.w.CreateJoint(jd); 
    }; 
    Physics.prototype.testJoints = function() { 
     for(var i = 0; i < this.testObjectCount; ++i) { 
      this.connectToCenterWithJoint(this.bodies[i]); 
     } 
    }; 
    Physics.prototype.applyTestFoce = function() { 
     for(var i = 0; i < this.testObjectCount; ++i) { 
      this.bodies[i].ApplyForce(new Box2D.Common.Math.b2Vec2(5000, 0), this.bodies[i].GetWorldCenter()); 
     } 
    }; 
    Physics.prototype.update = function() { 
     this.w.Step(1/60, 10, 10); 
     this.w.DrawDebugData(); 
     this.w.ClearForces(); 
    }; 
    return Physics; 
})(); 

回答

0

的問題是密度需求爲移動關節工作進行設置。這會教會我相信默認值。

修復:

fixture.density = .5; 

在這裏工作:http://jsfiddle.net/Jk5VD/9/

相關問題