private void create() { b2Body bodyB; if (connectedB2BodyObject == null) { bodyB = _world.GetGroundBody(); } else { bodyB = connectedB2BodyObject.body; } b2RevoluteJointDef jointDef = new b2RevoluteJointDef(); jointDef.Initialize(_bodyObject.body, bodyB, new b2Vec2()); jointDef.collideConnected = enableCollision; jointDef.enableLimit = enableLimit; jointDef.referenceAngle = referenceAngle; jointDef.lowerAngle = lowerAngle; jointDef.upperAngle = upperAngle; jointDef.enableMotor = enableMotor; jointDef.motorSpeed = motorSpeed; jointDef.maxMotorTorque = maxMotorTorque; _joint = _world.CreateJoint(jointDef); _revoluteJoint = _joint as b2RevoluteJoint; _revoluteJoint.m_localAnchor1.SetV(localAnchor1); _revoluteJoint.m_localAnchor2.SetV(localAnchor2); _revoluteJoint.GetBodyA().SetAwake(true); _revoluteJoint.GetBodyB().SetAwake(true); }
internal static b2Joint Create(b2JointDef def) { b2Joint joint = null; switch (def.type) { case b2JointType.e_distanceJoint: { joint = new b2DistanceJoint((b2DistanceJointDef)def); } break; case b2JointType.e_mouseJoint: { joint = new b2MouseJoint((b2MouseJointDef)def); } break; case b2JointType.e_prismaticJoint: { joint = new b2PrismaticJoint((b2PrismaticJointDef)def); } break; case b2JointType.e_revoluteJoint: { joint = new b2RevoluteJoint((b2RevoluteJointDef)def); } break; case b2JointType.e_pulleyJoint: { joint = new b2PulleyJoint((b2PulleyJointDef)def); } break; case b2JointType.e_gearJoint: { joint = new b2GearJoint((b2GearJointDef)def); } break; case b2JointType.e_wheelJoint: { joint = new b2WheelJoint((b2WheelJointDef)def); } break; case b2JointType.e_weldJoint: { joint = new b2WeldJoint((b2WeldJointDef)def); } break; case b2JointType.e_frictionJoint: { joint = new b2FrictionJoint((b2FrictionJointDef)def); } break; case b2JointType.e_ropeJoint: { joint = new b2RopeJoint((b2RopeJointDef)def); } break; case b2JointType.e_motorJoint: { joint = new b2MotorJoint((b2MotorJointDef)def); } break; default: Debug.Assert(false); break; } return(joint); }
public CircleStress() { b2Body leftWall = null; b2Body rightWall = null; { // Ground b2PolygonShape sd = new b2PolygonShape(); sd.SetAsBox(50.0f, 10.0f); b2BodyDef bd = new b2BodyDef(); bd.type = b2BodyType.b2_staticBody; bd.position = new b2Vec2(0.0f, -10.0f); b2Body b = m_world.CreateBody(bd); b2FixtureDef fd = new b2FixtureDef(); fd.shape = sd; fd.friction = 1.0f; b.CreateFixture(fd); // Walls sd.SetAsBox(3.0f, 50.0f); bd = new b2BodyDef(); bd.position = new b2Vec2(45.0f, 25.0f); rightWall = m_world.CreateBody(bd); rightWall.CreateFixture(sd, 0); bd.position = new b2Vec2(-45.0f, 25.0f); leftWall = m_world.CreateBody(bd); leftWall.CreateFixture(sd, 0); // Corners bd = new b2BodyDef(); sd.SetAsBox(20.0f, 3.0f); bd.angle = (float)(-Math.PI / 4.0); bd.position = new b2Vec2(-35f, 8.0f); b2Body myBod = m_world.CreateBody(bd); myBod.CreateFixture(sd, 0); bd.angle = (float)(Math.PI / 4.0); bd.position = new b2Vec2(35f, 8.0f); myBod = m_world.CreateBody(bd); myBod.CreateFixture(sd, 0); // top sd.SetAsBox(50.0f, 10.0f); bd.type = b2BodyType.b2_staticBody; bd.angle = 0; bd.position = new b2Vec2(0.0f, 75.0f); b = m_world.CreateBody(bd); fd.shape = sd; fd.friction = 1.0f; b.CreateFixture(fd); } { b2CircleShape cd; b2FixtureDef fd = new b2FixtureDef(); b2BodyDef bd = new b2BodyDef(); bd.type = b2BodyType.b2_dynamicBody; int numPieces = 5; float radius = 6f; bd.position = new b2Vec2(0.0f, 10.0f); b2Body body = m_world.CreateBody(bd); for (int i = 0; i < numPieces; i++) { cd = new b2CircleShape(); cd.Radius = 1.2f; fd.shape = cd; fd.density = 25; fd.friction = .1f; fd.restitution = .9f; float xPos = radius * (float)Math.Cos(2f * Math.PI * (i / (float)(numPieces))); float yPos = radius * (float)Math.Sin(2f * Math.PI * (i / (float)(numPieces))); cd.Position.Set(xPos, yPos); body.CreateFixture(fd); } body.SetBullet(false); b2RevoluteJointDef rjd = new b2RevoluteJointDef(); rjd.Initialize(body, m_groundBody, body.Position); rjd.motorSpeed = (float)Math.PI; rjd.maxMotorTorque = 1000000.0f; rjd.enableMotor = true; joint = (b2RevoluteJoint)m_world.CreateJoint(rjd); } { int loadSize = 41; for (int j = 0; j < 15; j++) { for (int i = 0; i < loadSize; i++) { b2CircleShape circ = new b2CircleShape(); b2BodyDef bod = new b2BodyDef(); bod.type = b2BodyType.b2_dynamicBody; circ.Radius = 1.0f + (i % 2 == 0 ? 1.0f : -1.0f) * .5f * Rand.RandomFloat(.5f, 1f); b2FixtureDef fd2 = new b2FixtureDef(); fd2.shape = circ; fd2.density = circ.Radius * 1.5f; fd2.friction = 0.5f; fd2.restitution = 0.7f; float xPos = -39f + 2 * i; float yPos = 50f + j; bod.position = new b2Vec2(xPos, yPos); b2Body myBody = m_world.CreateBody(bod); myBody.CreateFixture(fd2); } } } m_world.Gravity = new b2Vec2(0, -50); }
internal static global::System.Runtime.InteropServices.HandleRef getCPtr(b2RevoluteJoint obj) { return((obj == null) ? new global::System.Runtime.InteropServices.HandleRef(null, global::System.IntPtr.Zero) : obj.swigCPtr); }
// friend class b2Joint; // Gear Joint: // C0 = (coordinate1 + ratio * coordinate2)_initial // C = (coordinate1 + ratio * coordinate2) - C0 = 0 // J = [J1 ratio * J2] // K = J * invM * JT // = J1 * invM1 * J1T + ratio * ratio * J2 * invM2 * J2T // // Revolute: // coordinate = rotation // Cdot = angularVelocity // J = [0 0 1] // K = J * invM * JT = invI // // Prismatic: // coordinate = dot(p - pg, ug) // Cdot = dot(v + cross(w, r), ug) // J = [ug cross(r, ug)] // K = J * invM * JT = invMass + invI * cross(r, ug)^2 internal b2GearJoint(b2GearJointDef def) : base(def) { m_joint1 = def.joint1; m_joint2 = def.joint2; m_typeA = m_joint1.GetType(); m_typeB = m_joint2.GetType(); Debug.Assert(m_typeA == b2JointType.e_revoluteJoint || m_typeA == b2JointType.e_prismaticJoint); Debug.Assert(m_typeB == b2JointType.e_revoluteJoint || m_typeB == b2JointType.e_prismaticJoint); float coordinateA; float coordinateB; // TODO_ERIN there might be some problem with the joint edges in b2Joint. m_bodyC = m_joint1.GetBodyA(); m_bodyA = m_joint1.GetBodyB(); // Get geometry of joint1 b2Transform xfA = new b2Transform(m_bodyA.m_xf); float aA = m_bodyA.m_sweep.a; b2Transform xfC = new b2Transform(m_bodyC.m_xf); float aC = m_bodyC.m_sweep.a; if (m_typeA == b2JointType.e_revoluteJoint) { b2RevoluteJoint revolute = (b2RevoluteJoint)def.joint1; m_localAnchorC = revolute.m_localAnchorA; m_localAnchorA = revolute.m_localAnchorB; m_referenceAngleA = revolute.m_referenceAngle; m_localAxisC.SetZero(); coordinateA = aA - aC - m_referenceAngleA; } else { b2PrismaticJoint prismatic = (b2PrismaticJoint)def.joint1; m_localAnchorC = prismatic.m_localAnchorA; m_localAnchorA = prismatic.m_localAnchorB; m_referenceAngleA = prismatic.m_referenceAngle; m_localAxisC = prismatic.m_localXAxisA; b2Vec2 pC = new b2Vec2(m_localAnchorC); b2Vec2 pA = Utils.b2MulT(xfC.q, Utils.b2Mul(xfA.q, m_localAnchorA) + (xfA.p - xfC.p)); coordinateA = Utils.b2Dot(pA - pC, m_localAxisC); } m_bodyD = m_joint2.GetBodyA(); m_bodyB = m_joint2.GetBodyB(); // Get geometry of joint2 b2Transform xfB = new b2Transform(m_bodyB.m_xf); float aB = m_bodyB.m_sweep.a; b2Transform xfD = new b2Transform(m_bodyD.m_xf); float aD = m_bodyD.m_sweep.a; if (m_typeB == b2JointType.e_revoluteJoint) { b2RevoluteJoint revolute = (b2RevoluteJoint)def.joint2; m_localAnchorD = revolute.m_localAnchorA; m_localAnchorB = revolute.m_localAnchorB; m_referenceAngleB = revolute.m_referenceAngle; m_localAxisD.SetZero(); coordinateB = aB - aD - m_referenceAngleB; } else { b2PrismaticJoint prismatic = (b2PrismaticJoint)def.joint2; m_localAnchorD = prismatic.m_localAnchorA; m_localAnchorB = prismatic.m_localAnchorB; m_referenceAngleB = prismatic.m_referenceAngle; m_localAxisD = prismatic.m_localXAxisA; b2Vec2 pD = new b2Vec2(m_localAnchorD); b2Vec2 pB = Utils.b2MulT(xfD.q, Utils.b2Mul(xfB.q, m_localAnchorB) + (xfB.p - xfD.p)); coordinateB = Utils.b2Dot(pB - pD, m_localAxisD); } m_ratio = def.ratio; m_constant = coordinateA + m_ratio * coordinateB; m_impulse = 0.0f; }