home *** CD-ROM | disk | FTP | other *** search
- package Box2D.Dynamics.Joints
- {
- import Box2D.Common.Math.b2Mat22;
- import Box2D.Common.Math.b2Vec2;
- import Box2D.Common.b2Settings;
- import Box2D.Dynamics.b2Body;
- import Box2D.Dynamics.b2TimeStep;
-
- public class b2GearJoint extends b2Joint
- {
-
-
- public var m_ground2:b2Body;
-
- public var m_groundAnchor1:b2Vec2;
-
- public var m_groundAnchor2:b2Vec2;
-
- public var m_localAnchor1:b2Vec2;
-
- public var m_localAnchor2:b2Vec2;
-
- public var m_ratio:Number;
-
- public var m_revolute2:b2RevoluteJoint;
-
- public var m_force:Number;
-
- public var m_mass:Number;
-
- public var m_prismatic2:b2PrismaticJoint;
-
- public var m_ground1:b2Body;
-
- public var m_revolute1:b2RevoluteJoint;
-
- public var m_prismatic1:b2PrismaticJoint;
-
- public var m_constant:Number;
-
- public var m_J:b2Jacobian;
-
- public function b2GearJoint(def:b2GearJointDef)
- {
- var coordinate1:Number = NaN;
- var coordinate2:Number = NaN;
- m_groundAnchor1 = new b2Vec2();
- m_groundAnchor2 = new b2Vec2();
- m_localAnchor1 = new b2Vec2();
- m_localAnchor2 = new b2Vec2();
- m_J = new b2Jacobian();
- super(def);
- var type1:int = def.joint1.m_type;
- var type2:int = def.joint2.m_type;
- m_revolute1 = null;
- m_prismatic1 = null;
- m_revolute2 = null;
- m_prismatic2 = null;
- m_ground1 = def.joint1.m_body1;
- m_body1 = def.joint1.m_body2;
- if(type1 == b2Joint.e_revoluteJoint)
- {
- m_revolute1 = def.joint1 as b2RevoluteJoint;
- m_groundAnchor1.SetV(m_revolute1.m_localAnchor1);
- m_localAnchor1.SetV(m_revolute1.m_localAnchor2);
- coordinate1 = m_revolute1.GetJointAngle();
- }
- else
- {
- m_prismatic1 = def.joint1 as b2PrismaticJoint;
- m_groundAnchor1.SetV(m_prismatic1.m_localAnchor1);
- m_localAnchor1.SetV(m_prismatic1.m_localAnchor2);
- coordinate1 = m_prismatic1.GetJointTranslation();
- }
- m_ground2 = def.joint2.m_body1;
- m_body2 = def.joint2.m_body2;
- if(type2 == b2Joint.e_revoluteJoint)
- {
- m_revolute2 = def.joint2 as b2RevoluteJoint;
- m_groundAnchor2.SetV(m_revolute2.m_localAnchor1);
- m_localAnchor2.SetV(m_revolute2.m_localAnchor2);
- coordinate2 = m_revolute2.GetJointAngle();
- }
- else
- {
- m_prismatic2 = def.joint2 as b2PrismaticJoint;
- m_groundAnchor2.SetV(m_prismatic2.m_localAnchor1);
- m_localAnchor2.SetV(m_prismatic2.m_localAnchor2);
- coordinate2 = m_prismatic2.GetJointTranslation();
- }
- m_ratio = def.ratio;
- m_constant = coordinate1 + m_ratio * coordinate2;
- m_force = 0;
- }
-
- override public function GetAnchor1() : b2Vec2
- {
- return m_body1.GetWorldPoint(m_localAnchor1);
- }
-
- override public function GetAnchor2() : b2Vec2
- {
- return m_body2.GetWorldPoint(m_localAnchor2);
- }
-
- override public function InitVelocityConstraints(step:b2TimeStep) : void
- {
- var ugX:Number = NaN;
- var ugY:Number = NaN;
- var rX:Number = NaN;
- var rY:Number = NaN;
- var tMat:b2Mat22 = null;
- var tVec:b2Vec2 = null;
- var crug:Number = NaN;
- var tX:Number = NaN;
- var P:Number = NaN;
- var g1:b2Body = m_ground1;
- var g2:b2Body = m_ground2;
- var b1:b2Body = m_body1;
- var b2:b2Body = m_body2;
- var K:Number = 0;
- m_J.SetZero();
- if(m_revolute1)
- {
- m_J.angular1 = -1;
- K += b1.m_invI;
- }
- else
- {
- tMat = g1.m_xf.R;
- tVec = m_prismatic1.m_localXAxis1;
- ugX = tMat.col1.x * tVec.x + tMat.col2.x * tVec.y;
- ugY = tMat.col1.y * tVec.x + tMat.col2.y * tVec.y;
- tMat = b1.m_xf.R;
- rX = m_localAnchor1.x - b1.m_sweep.localCenter.x;
- rY = m_localAnchor1.y - b1.m_sweep.localCenter.y;
- tX = tMat.col1.x * rX + tMat.col2.x * rY;
- rY = tMat.col1.y * rX + tMat.col2.y * rY;
- rX = tX;
- crug = rX * ugY - rY * ugX;
- m_J.linear1.Set(-ugX,-ugY);
- m_J.angular1 = -crug;
- K += b1.m_invMass + b1.m_invI * crug * crug;
- }
- if(m_revolute2)
- {
- m_J.angular2 = -m_ratio;
- K += m_ratio * m_ratio * b2.m_invI;
- }
- else
- {
- tMat = g2.m_xf.R;
- tVec = m_prismatic2.m_localXAxis1;
- ugX = tMat.col1.x * tVec.x + tMat.col2.x * tVec.y;
- ugY = tMat.col1.y * tVec.x + tMat.col2.y * tVec.y;
- tMat = b2.m_xf.R;
- rX = m_localAnchor2.x - b2.m_sweep.localCenter.x;
- rY = m_localAnchor2.y - b2.m_sweep.localCenter.y;
- tX = tMat.col1.x * rX + tMat.col2.x * rY;
- rY = tMat.col1.y * rX + tMat.col2.y * rY;
- rX = tX;
- crug = rX * ugY - rY * ugX;
- m_J.linear2.Set(-m_ratio * ugX,-m_ratio * ugY);
- m_J.angular2 = -m_ratio * crug;
- K += m_ratio * m_ratio * (b2.m_invMass + b2.m_invI * crug * crug);
- }
- m_mass = 1 / K;
- if(step.warmStarting)
- {
- P = step.dt * m_force;
- b1.m_linearVelocity.x += b1.m_invMass * P * m_J.linear1.x;
- b1.m_linearVelocity.y += b1.m_invMass * P * m_J.linear1.y;
- b1.m_angularVelocity += b1.m_invI * P * m_J.angular1;
- b2.m_linearVelocity.x += b2.m_invMass * P * m_J.linear2.x;
- b2.m_linearVelocity.y += b2.m_invMass * P * m_J.linear2.y;
- b2.m_angularVelocity += b2.m_invI * P * m_J.angular2;
- }
- else
- {
- m_force = 0;
- }
- }
-
- override public function GetReactionTorque() : Number
- {
- var tMat:b2Mat22 = m_body2.m_xf.R;
- var rX:Number = m_localAnchor1.x - m_body2.m_sweep.localCenter.x;
- var rY:Number = m_localAnchor1.y - m_body2.m_sweep.localCenter.y;
- var tX:Number = tMat.col1.x * rX + tMat.col2.x * rY;
- rY = tMat.col1.y * rX + tMat.col2.y * rY;
- rX = tX;
- return m_force * m_J.angular2 - (rX * (m_force * m_J.linear2.y) - rY * (m_force * m_J.linear2.x));
- }
-
- override public function GetReactionForce() : b2Vec2
- {
- return new b2Vec2(m_force * m_J.linear2.x,m_force * m_J.linear2.y);
- }
-
- override public function SolvePositionConstraints() : Boolean
- {
- var coordinate1:Number = NaN;
- var coordinate2:Number = NaN;
- var linearError:Number = 0;
- var b1:b2Body = m_body1;
- var b2:b2Body = m_body2;
- if(m_revolute1)
- {
- coordinate1 = m_revolute1.GetJointAngle();
- }
- else
- {
- coordinate1 = m_prismatic1.GetJointTranslation();
- }
- if(m_revolute2)
- {
- coordinate2 = m_revolute2.GetJointAngle();
- }
- else
- {
- coordinate2 = m_prismatic2.GetJointTranslation();
- }
- var C:Number = m_constant - (coordinate1 + m_ratio * coordinate2);
- var impulse:Number = -m_mass * C;
- b1.m_sweep.c.x += b1.m_invMass * impulse * m_J.linear1.x;
- b1.m_sweep.c.y += b1.m_invMass * impulse * m_J.linear1.y;
- b1.m_sweep.a += b1.m_invI * impulse * m_J.angular1;
- b2.m_sweep.c.x += b2.m_invMass * impulse * m_J.linear2.x;
- b2.m_sweep.c.y += b2.m_invMass * impulse * m_J.linear2.y;
- b2.m_sweep.a += b2.m_invI * impulse * m_J.angular2;
- b1.SynchronizeTransform();
- b2.SynchronizeTransform();
- return linearError < b2Settings.b2_linearSlop;
- }
-
- public function GetRatio() : Number
- {
- return m_ratio;
- }
-
- override public function SolveVelocityConstraints(step:b2TimeStep) : void
- {
- var b1:b2Body = m_body1;
- var b2:b2Body = m_body2;
- var Cdot:Number = m_J.Compute(b1.m_linearVelocity,b1.m_angularVelocity,b2.m_linearVelocity,b2.m_angularVelocity);
- var force:Number = -step.inv_dt * m_mass * Cdot;
- m_force += force;
- var P:Number = step.dt * force;
- b1.m_linearVelocity.x += b1.m_invMass * P * m_J.linear1.x;
- b1.m_linearVelocity.y += b1.m_invMass * P * m_J.linear1.y;
- b1.m_angularVelocity += b1.m_invI * P * m_J.angular1;
- b2.m_linearVelocity.x += b2.m_invMass * P * m_J.linear2.x;
- b2.m_linearVelocity.y += b2.m_invMass * P * m_J.linear2.y;
- b2.m_angularVelocity += b2.m_invI * P * m_J.angular2;
- }
- }
- }
-