Box2D Elevator with Prismatic Joint
Lifting block with prismatic joint (b2PrismaticJointDef) on upper point gives impulse to the dynamic body that lays on lifting block surface even if lifting block doesn't move at all.
HTML
<script src="http://box2dweb.googlecode.com/svn/trunk/Box2d.min.js"></script>
<canvas id="playground" width="400" height="300" ></canvas>
<div>
<b>Strange Box2D Lifting block on Prismatic Joint</b>
<p>Lifting block on prismatic joint (b2PrismaticJointDef) on upper point gives impulse to the dynamic body that lays on lifting block surface even if lifting block doesn't move at all.</p>
</div>
JavaScript
var b2Vec2 = Box2D.Common.Math.b2Vec2,
b2BodyDef = Box2D.Dynamics.b2BodyDef,
b2Body = Box2D.Dynamics.b2Body,
b2FixtureDef = Box2D.Dynamics.b2FixtureDef,
b2World = Box2D.Dynamics.b2World,
b2PolygonShape = Box2D.Collision.Shapes.b2PolygonShape,
b2CircleShape = Box2D.Collision.Shapes.b2CircleShape,
b2DebugDraw = Box2D.Dynamics.b2DebugDraw,
b2PrismaticJointDef = Box2D.Dynamics.Joints.b2PrismaticJointDef;
(function() {
var world = buildWorld();
var leftBlock = buildBlock({world: world, x: 2, y: 8, width: 2, height: 12, static: true});
var rightBlock = buildBlock({world: world, x: 12, y: 8, width: 2, height: 12, static: true});
var bottomBlock = buildBlock({world: world, x: 7, y: 13, width: 8, height: 2, static: false});
var box = buildBlock({world: world, x: 7, y: 10, width: 2, height: 2, static: false});
var joint = buildPrismaticJoint({world: world,
anchorA: new b2Vec2(7, 13),
axis: new b2Vec2(0, 1),
bodyA: bottomBlock,
bodyB: world.GetGroundBody()});
var debugDraw = buildDebugDraw(world);
setInterval(function(){
world.Step(1 / 60, 10, 10);
world.DrawDebugData();
world.ClearForces();
},1000/60);
})();
function buildWorld() {
return new b2World(
new b2Vec2(0, 10), //gravity vector
true
);
}
function buildBlock(state) {
var fixDef = new b2FixtureDef;
fixDef.shape = new b2PolygonShape;
fixDef.density = 1.0;
fixDef.friction = 0.5;
fixDef.restitution = .5;
fixDef.shape.SetAsBox(state.width / 2, state.height / 2);
var bodyDef = new b2BodyDef;
bodyDef.type = state.static?b2Body.b2_staticBody:b2Body.b2_dynamicBody;
bodyDef.position.Set(state.x, state.y);
var body = state.world.CreateBody(bodyDef);
...