home *** CD-ROM | disk | FTP | other *** search
- package Box2D.Dynamics.Joints
- {
- import Box2D.Common.Math.b2Mat22;
- import Box2D.Common.Math.b2Math;
- import Box2D.Common.Math.b2Vec2;
- import Box2D.Common.b2Settings;
- import Box2D.Dynamics.b2Body;
- import Box2D.Dynamics.b2TimeStep;
-
- public class b2PrismaticJoint extends b2Joint
- {
-
-
- public var m_limitForce:Number;
-
- public var m_lowerTranslation:Number;
-
- public var m_localXAxis1:b2Vec2;
-
- public var m_refAngle:Number;
-
- public var m_torque:Number;
-
- public var m_motorForce:Number;
-
- public var m_enableLimit:Boolean;
-
- public var m_angularMass:Number;
-
- public var m_maxMotorForce:Number;
-
- public var m_localYAxis1:b2Vec2;
-
- public var m_force:Number;
-
- public var m_motorMass:Number;
-
- public var m_upperTranslation:Number;
-
- public var m_localAnchor1:b2Vec2;
-
- public var m_localAnchor2:b2Vec2;
-
- public var m_limitState:int;
-
- public var m_linearMass:Number;
-
- public var m_motorJacobian:b2Jacobian;
-
- public var m_limitPositionImpulse:Number;
-
- public var m_motorSpeed:Number;
-
- public var m_enableMotor:Boolean;
-
- public var m_linearJacobian:b2Jacobian;
-
- public function b2PrismaticJoint(def:b2PrismaticJointDef)
- {
- var tMat:b2Mat22 = null;
- var tX:Number = NaN;
- var tY:Number = NaN;
- m_localAnchor1 = new b2Vec2();
- m_localAnchor2 = new b2Vec2();
- m_localXAxis1 = new b2Vec2();
- m_localYAxis1 = new b2Vec2();
- m_linearJacobian = new b2Jacobian();
- m_motorJacobian = new b2Jacobian();
- super(def);
- m_localAnchor1.SetV(def.localAnchor1);
- m_localAnchor2.SetV(def.localAnchor2);
- m_localXAxis1.SetV(def.localAxis1);
- m_localYAxis1.x = -m_localXAxis1.y;
- m_localYAxis1.y = m_localXAxis1.x;
- m_refAngle = def.referenceAngle;
- m_linearJacobian.SetZero();
- m_linearMass = 0;
- m_force = 0;
- m_angularMass = 0;
- m_torque = 0;
- m_motorJacobian.SetZero();
- m_motorMass = 0;
- m_motorForce = 0;
- m_limitForce = 0;
- m_limitPositionImpulse = 0;
- m_lowerTranslation = def.lowerTranslation;
- m_upperTranslation = def.upperTranslation;
- m_maxMotorForce = def.maxMotorForce;
- m_motorSpeed = def.motorSpeed;
- m_enableLimit = def.enableLimit;
- m_enableMotor = def.enableMotor;
- }
-
- override public function SolveVelocityConstraints(step:b2TimeStep) : void
- {
- var oldLimitForce:Number = NaN;
- var motorCdot:Number = NaN;
- var motorForce:Number = NaN;
- var oldMotorForce:Number = NaN;
- var limitCdot:Number = NaN;
- var limitForce:Number = NaN;
- var b1:b2Body = m_body1;
- var b2:b2Body = m_body2;
- var invMass1:Number = b1.m_invMass;
- var invMass2:Number = b2.m_invMass;
- var invI1:Number = b1.m_invI;
- var invI2:Number = b2.m_invI;
- var linearCdot:Number = m_linearJacobian.Compute(b1.m_linearVelocity,b1.m_angularVelocity,b2.m_linearVelocity,b2.m_angularVelocity);
- var force:Number = -step.inv_dt * m_linearMass * linearCdot;
- m_force += force;
- var P:Number = step.dt * force;
- b1.m_linearVelocity.x += invMass1 * P * m_linearJacobian.linear1.x;
- b1.m_linearVelocity.y += invMass1 * P * m_linearJacobian.linear1.y;
- b1.m_angularVelocity += invI1 * P * m_linearJacobian.angular1;
- b2.m_linearVelocity.x += invMass2 * P * m_linearJacobian.linear2.x;
- b2.m_linearVelocity.y += invMass2 * P * m_linearJacobian.linear2.y;
- b2.m_angularVelocity += invI2 * P * m_linearJacobian.angular2;
- var angularCdot:Number = b2.m_angularVelocity - b1.m_angularVelocity;
- var torque:Number = -step.inv_dt * m_angularMass * angularCdot;
- m_torque += torque;
- var L:Number = step.dt * torque;
- b1.m_angularVelocity -= invI1 * L;
- b2.m_angularVelocity += invI2 * L;
- if(m_enableMotor && m_limitState != e_equalLimits)
- {
- motorCdot = m_motorJacobian.Compute(b1.m_linearVelocity,b1.m_angularVelocity,b2.m_linearVelocity,b2.m_angularVelocity) - m_motorSpeed;
- motorForce = -step.inv_dt * m_motorMass * motorCdot;
- oldMotorForce = m_motorForce;
- m_motorForce = b2Math.b2Clamp(m_motorForce + motorForce,-m_maxMotorForce,m_maxMotorForce);
- motorForce = m_motorForce - oldMotorForce;
- P = step.dt * motorForce;
- b1.m_linearVelocity.x += invMass1 * P * m_motorJacobian.linear1.x;
- b1.m_linearVelocity.y += invMass1 * P * m_motorJacobian.linear1.y;
- b1.m_angularVelocity += invI1 * P * m_motorJacobian.angular1;
- b2.m_linearVelocity.x += invMass2 * P * m_motorJacobian.linear2.x;
- b2.m_linearVelocity.y += invMass2 * P * m_motorJacobian.linear2.y;
- b2.m_angularVelocity += invI2 * P * m_motorJacobian.angular2;
- }
- if(m_enableLimit && m_limitState != e_inactiveLimit)
- {
- limitCdot = m_motorJacobian.Compute(b1.m_linearVelocity,b1.m_angularVelocity,b2.m_linearVelocity,b2.m_angularVelocity);
- limitForce = -step.inv_dt * m_motorMass * limitCdot;
- if(m_limitState == e_equalLimits)
- {
- m_limitForce += limitForce;
- }
- else if(m_limitState == e_atLowerLimit)
- {
- oldLimitForce = m_limitForce;
- m_limitForce = b2Math.b2Max(m_limitForce + limitForce,0);
- limitForce = m_limitForce - oldLimitForce;
- }
- else if(m_limitState == e_atUpperLimit)
- {
- oldLimitForce = m_limitForce;
- m_limitForce = b2Math.b2Min(m_limitForce + limitForce,0);
- limitForce = m_limitForce - oldLimitForce;
- }
- P = step.dt * limitForce;
- b1.m_linearVelocity.x += invMass1 * P * m_motorJacobian.linear1.x;
- b1.m_linearVelocity.y += invMass1 * P * m_motorJacobian.linear1.y;
- b1.m_angularVelocity += invI1 * P * m_motorJacobian.angular1;
- b2.m_linearVelocity.x += invMass2 * P * m_motorJacobian.linear2.x;
- b2.m_linearVelocity.y += invMass2 * P * m_motorJacobian.linear2.y;
- b2.m_angularVelocity += invI2 * P * m_motorJacobian.angular2;
- }
- }
-
- override public function GetAnchor1() : b2Vec2
- {
- return m_body1.GetWorldPoint(m_localAnchor1);
- }
-
- override public function GetAnchor2() : b2Vec2
- {
- return m_body2.GetWorldPoint(m_localAnchor2);
- }
-
- public function GetUpperLimit() : Number
- {
- return m_upperTranslation;
- }
-
- public function GetLowerLimit() : Number
- {
- return m_lowerTranslation;
- }
-
- public function EnableMotor(flag:Boolean) : void
- {
- m_enableMotor = flag;
- }
-
- public function GetJointTranslation() : Number
- {
- var tMat:b2Mat22 = null;
- var b1:b2Body = m_body1;
- var b2:b2Body = m_body2;
- var p1:b2Vec2 = b1.GetWorldPoint(m_localAnchor1);
- var p2:b2Vec2 = b2.GetWorldPoint(m_localAnchor2);
- var dX:Number = p2.x - p1.x;
- var dY:Number = p2.y - p1.y;
- var axis:b2Vec2 = b1.GetWorldVector(m_localXAxis1);
- return axis.x * dX + axis.y * dY;
- }
-
- public function GetMotorSpeed() : Number
- {
- return m_motorSpeed;
- }
-
- override public function GetReactionForce() : b2Vec2
- {
- var tMat:b2Mat22 = m_body1.m_xf.R;
- var ax1X:Number = m_limitForce * (tMat.col1.x * m_localXAxis1.x + tMat.col2.x * m_localXAxis1.y);
- var ax1Y:Number = m_limitForce * (tMat.col1.y * m_localXAxis1.x + tMat.col2.y * m_localXAxis1.y);
- var ay1X:Number = m_force * (tMat.col1.x * m_localYAxis1.x + tMat.col2.x * m_localYAxis1.y);
- var ay1Y:Number = m_force * (tMat.col1.y * m_localYAxis1.x + tMat.col2.y * m_localYAxis1.y);
- return new b2Vec2(m_limitForce * ax1X + m_force * ay1X,m_limitForce * ax1Y + m_force * ay1Y);
- }
-
- override public function SolvePositionConstraints() : Boolean
- {
- var limitC:Number = NaN;
- var oldLimitImpulse:Number = NaN;
- var tMat:b2Mat22 = null;
- var tX:Number = NaN;
- var ax1X:Number = NaN;
- var ax1Y:Number = NaN;
- var translation:Number = NaN;
- var limitImpulse:Number = NaN;
- var b1:b2Body = m_body1;
- var b2:b2Body = m_body2;
- var invMass1:Number = b1.m_invMass;
- var invMass2:Number = b2.m_invMass;
- var invI1:Number = b1.m_invI;
- var invI2:Number = b2.m_invI;
- tMat = b1.m_xf.R;
- var r1X:Number = m_localAnchor1.x - b1.m_sweep.localCenter.x;
- var r1Y:Number = m_localAnchor1.y - b1.m_sweep.localCenter.y;
- tX = tMat.col1.x * r1X + tMat.col2.x * r1Y;
- r1Y = tMat.col1.y * r1X + tMat.col2.y * r1Y;
- r1X = tX;
- tMat = b2.m_xf.R;
- var r2X:Number = m_localAnchor2.x - b2.m_sweep.localCenter.x;
- var r2Y:Number = m_localAnchor2.y - b2.m_sweep.localCenter.y;
- tX = tMat.col1.x * r2X + tMat.col2.x * r2Y;
- r2Y = tMat.col1.y * r2X + tMat.col2.y * r2Y;
- r2X = tX;
- var p1X:Number = b1.m_sweep.c.x + r1X;
- var p1Y:Number = b1.m_sweep.c.y + r1Y;
- var p2X:Number = b2.m_sweep.c.x + r2X;
- var p2Y:Number = b2.m_sweep.c.y + r2Y;
- var dX:Number = p2X - p1X;
- var dY:Number = p2Y - p1Y;
- tMat = b1.m_xf.R;
- var ay1X:Number = tMat.col1.x * m_localYAxis1.x + tMat.col2.x * m_localYAxis1.y;
- var ay1Y:Number = tMat.col1.y * m_localYAxis1.x + tMat.col2.y * m_localYAxis1.y;
- var linearC:Number = ay1X * dX + ay1Y * dY;
- linearC = b2Math.b2Clamp(linearC,-b2Settings.b2_maxLinearCorrection,b2Settings.b2_maxLinearCorrection);
- var linearImpulse:Number = -m_linearMass * linearC;
- b1.m_sweep.c.x += invMass1 * linearImpulse * m_linearJacobian.linear1.x;
- b1.m_sweep.c.y += invMass1 * linearImpulse * m_linearJacobian.linear1.y;
- b1.m_sweep.a += invI1 * linearImpulse * m_linearJacobian.angular1;
- b2.m_sweep.c.x += invMass2 * linearImpulse * m_linearJacobian.linear2.x;
- b2.m_sweep.c.y += invMass2 * linearImpulse * m_linearJacobian.linear2.y;
- b2.m_sweep.a += invI2 * linearImpulse * m_linearJacobian.angular2;
- var positionError:Number = b2Math.b2Abs(linearC);
- var angularC:Number = b2.m_sweep.a - b1.m_sweep.a - m_refAngle;
- angularC = b2Math.b2Clamp(angularC,-b2Settings.b2_maxAngularCorrection,b2Settings.b2_maxAngularCorrection);
- var angularImpulse:Number = -m_angularMass * angularC;
- b1.m_sweep.a -= b1.m_invI * angularImpulse;
- b2.m_sweep.a += b2.m_invI * angularImpulse;
- b1.SynchronizeTransform();
- b2.SynchronizeTransform();
- var angularError:Number = b2Math.b2Abs(angularC);
- if(m_enableLimit && m_limitState != e_inactiveLimit)
- {
- tMat = b1.m_xf.R;
- r1X = m_localAnchor1.x - b1.m_sweep.localCenter.x;
- r1Y = m_localAnchor1.y - b1.m_sweep.localCenter.y;
- tX = tMat.col1.x * r1X + tMat.col2.x * r1Y;
- r1Y = tMat.col1.y * r1X + tMat.col2.y * r1Y;
- r1X = tX;
- tMat = b2.m_xf.R;
- r2X = m_localAnchor2.x - b2.m_sweep.localCenter.x;
- r2Y = m_localAnchor2.y - b2.m_sweep.localCenter.y;
- tX = tMat.col1.x * r2X + tMat.col2.x * r2Y;
- r2Y = tMat.col1.y * r2X + tMat.col2.y * r2Y;
- r2X = tX;
- p1X = b1.m_sweep.c.x + r1X;
- p1Y = b1.m_sweep.c.y + r1Y;
- p2X = b2.m_sweep.c.x + r2X;
- p2Y = b2.m_sweep.c.y + r2Y;
- dX = p2X - p1X;
- dY = p2Y - p1Y;
- tMat = b1.m_xf.R;
- ax1X = tMat.col1.x * m_localXAxis1.x + tMat.col2.x * m_localXAxis1.y;
- ax1Y = tMat.col1.y * m_localXAxis1.x + tMat.col2.y * m_localXAxis1.y;
- translation = ax1X * dX + ax1Y * dY;
- limitImpulse = 0;
- if(m_limitState == e_equalLimits)
- {
- limitC = b2Math.b2Clamp(translation,-b2Settings.b2_maxLinearCorrection,b2Settings.b2_maxLinearCorrection);
- limitImpulse = -m_motorMass * limitC;
- positionError = b2Math.b2Max(positionError,b2Math.b2Abs(angularC));
- }
- else if(m_limitState == e_atLowerLimit)
- {
- limitC = translation - m_lowerTranslation;
- positionError = b2Math.b2Max(positionError,-limitC);
- limitC = b2Math.b2Clamp(limitC + b2Settings.b2_linearSlop,-b2Settings.b2_maxLinearCorrection,0);
- limitImpulse = -m_motorMass * limitC;
- oldLimitImpulse = m_limitPositionImpulse;
- m_limitPositionImpulse = b2Math.b2Max(m_limitPositionImpulse + limitImpulse,0);
- limitImpulse = m_limitPositionImpulse - oldLimitImpulse;
- }
- else if(m_limitState == e_atUpperLimit)
- {
- limitC = translation - m_upperTranslation;
- positionError = b2Math.b2Max(positionError,limitC);
- limitC = b2Math.b2Clamp(limitC - b2Settings.b2_linearSlop,0,b2Settings.b2_maxLinearCorrection);
- limitImpulse = -m_motorMass * limitC;
- oldLimitImpulse = m_limitPositionImpulse;
- m_limitPositionImpulse = b2Math.b2Min(m_limitPositionImpulse + limitImpulse,0);
- limitImpulse = m_limitPositionImpulse - oldLimitImpulse;
- }
- b1.m_sweep.c.x += invMass1 * limitImpulse * m_motorJacobian.linear1.x;
- b1.m_sweep.c.y += invMass1 * limitImpulse * m_motorJacobian.linear1.y;
- b1.m_sweep.a += invI1 * limitImpulse * m_motorJacobian.angular1;
- b2.m_sweep.c.x += invMass2 * limitImpulse * m_motorJacobian.linear2.x;
- b2.m_sweep.c.y += invMass2 * limitImpulse * m_motorJacobian.linear2.y;
- b2.m_sweep.a += invI2 * limitImpulse * m_motorJacobian.angular2;
- b1.SynchronizeTransform();
- b2.SynchronizeTransform();
- }
- return positionError <= b2Settings.b2_linearSlop && angularError <= b2Settings.b2_angularSlop;
- }
-
- public function SetMotorSpeed(speed:Number) : void
- {
- m_motorSpeed = speed;
- }
-
- public function GetJointSpeed() : Number
- {
- var tMat:b2Mat22 = null;
- var b1:b2Body = m_body1;
- var b2:b2Body = m_body2;
- tMat = b1.m_xf.R;
- var r1X:Number = m_localAnchor1.x - b1.m_sweep.localCenter.x;
- var r1Y:Number = m_localAnchor1.y - b1.m_sweep.localCenter.y;
- var tX:Number = tMat.col1.x * r1X + tMat.col2.x * r1Y;
- r1Y = tMat.col1.y * r1X + tMat.col2.y * r1Y;
- r1X = tX;
- tMat = b2.m_xf.R;
- var r2X:Number = m_localAnchor2.x - b2.m_sweep.localCenter.x;
- var r2Y:Number = m_localAnchor2.y - b2.m_sweep.localCenter.y;
- tX = tMat.col1.x * r2X + tMat.col2.x * r2Y;
- r2Y = tMat.col1.y * r2X + tMat.col2.y * r2Y;
- r2X = tX;
- var p1X:Number = b1.m_sweep.c.x + r1X;
- var p1Y:Number = b1.m_sweep.c.y + r1Y;
- var p2X:Number = b2.m_sweep.c.x + r2X;
- var p2Y:Number = b2.m_sweep.c.y + r2Y;
- var dX:Number = p2X - p1X;
- var dY:Number = p2Y - p1Y;
- var axis:b2Vec2 = b1.GetWorldVector(m_localXAxis1);
- var v1:b2Vec2 = b1.m_linearVelocity;
- var v2:b2Vec2 = b2.m_linearVelocity;
- var w1:Number = b1.m_angularVelocity;
- var w2:Number = b2.m_angularVelocity;
- return dX * (-w1 * axis.y) + dY * (w1 * axis.x) + (axis.x * (v2.x + -w2 * r2Y - v1.x - -w1 * r1Y) + axis.y * (v2.y + w2 * r2X - v1.y - w1 * r1X));
- }
-
- override public function InitVelocityConstraints(step:b2TimeStep) : void
- {
- var tMat:b2Mat22 = null;
- var tX:Number = NaN;
- var ax1X:Number = NaN;
- var ax1Y:Number = NaN;
- var dX:Number = NaN;
- var dY:Number = NaN;
- var jointTranslation:Number = NaN;
- var P1X:Number = NaN;
- var P1Y:Number = NaN;
- var P2X:Number = NaN;
- var P2Y:Number = NaN;
- var L1:Number = NaN;
- var L2:Number = NaN;
- var b1:b2Body = m_body1;
- var b2:b2Body = m_body2;
- tMat = b1.m_xf.R;
- var r1X:Number = m_localAnchor1.x - b1.m_sweep.localCenter.x;
- var r1Y:Number = m_localAnchor1.y - b1.m_sweep.localCenter.y;
- tX = tMat.col1.x * r1X + tMat.col2.x * r1Y;
- r1Y = tMat.col1.y * r1X + tMat.col2.y * r1Y;
- r1X = tX;
- tMat = b2.m_xf.R;
- var r2X:Number = m_localAnchor2.x - b2.m_sweep.localCenter.x;
- var r2Y:Number = m_localAnchor2.y - b2.m_sweep.localCenter.y;
- tX = tMat.col1.x * r2X + tMat.col2.x * r2Y;
- r2Y = tMat.col1.y * r2X + tMat.col2.y * r2Y;
- r2X = tX;
- var invMass1:Number = b1.m_invMass;
- var invMass2:Number = b2.m_invMass;
- var invI1:Number = b1.m_invI;
- var invI2:Number = b2.m_invI;
- tMat = b1.m_xf.R;
- var ay1X:Number = tMat.col1.x * m_localYAxis1.x + tMat.col2.x * m_localYAxis1.y;
- var ay1Y:Number = tMat.col1.y * m_localYAxis1.x + tMat.col2.y * m_localYAxis1.y;
- var eX:Number = b2.m_sweep.c.x + r2X - b1.m_sweep.c.x;
- var eY:Number = b2.m_sweep.c.y + r2Y - b1.m_sweep.c.y;
- m_linearJacobian.linear1.x = -ay1X;
- m_linearJacobian.linear1.y = -ay1Y;
- m_linearJacobian.linear2.x = ay1X;
- m_linearJacobian.linear2.y = ay1Y;
- m_linearJacobian.angular1 = -(eX * ay1Y - eY * ay1X);
- m_linearJacobian.angular2 = r2X * ay1Y - r2Y * ay1X;
- m_linearMass = invMass1 + invI1 * m_linearJacobian.angular1 * m_linearJacobian.angular1 + invMass2 + invI2 * m_linearJacobian.angular2 * m_linearJacobian.angular2;
- m_linearMass = 1 / m_linearMass;
- m_angularMass = invI1 + invI2;
- if(m_angularMass > Number.MIN_VALUE)
- {
- m_angularMass = 1 / m_angularMass;
- }
- if(m_enableLimit || m_enableMotor)
- {
- tMat = b1.m_xf.R;
- ax1X = tMat.col1.x * m_localXAxis1.x + tMat.col2.x * m_localXAxis1.y;
- ax1Y = tMat.col1.y * m_localXAxis1.x + tMat.col2.y * m_localXAxis1.y;
- m_motorJacobian.linear1.x = -ax1X;
- m_motorJacobian.linear1.y = -ax1Y;
- m_motorJacobian.linear2.x = ax1X;
- m_motorJacobian.linear2.y = ax1Y;
- m_motorJacobian.angular1 = -(eX * ax1Y - eY * ax1X);
- m_motorJacobian.angular2 = r2X * ax1Y - r2Y * ax1X;
- m_motorMass = invMass1 + invI1 * m_motorJacobian.angular1 * m_motorJacobian.angular1 + invMass2 + invI2 * m_motorJacobian.angular2 * m_motorJacobian.angular2;
- m_motorMass = 1 / m_motorMass;
- if(m_enableLimit)
- {
- dX = eX - r1X;
- dY = eY - r1Y;
- jointTranslation = ax1X * dX + ax1Y * dY;
- if(b2Math.b2Abs(m_upperTranslation - m_lowerTranslation) < 2 * b2Settings.b2_linearSlop)
- {
- m_limitState = e_equalLimits;
- }
- else if(jointTranslation <= m_lowerTranslation)
- {
- if(m_limitState != e_atLowerLimit)
- {
- m_limitForce = 0;
- }
- m_limitState = e_atLowerLimit;
- }
- else if(jointTranslation >= m_upperTranslation)
- {
- if(m_limitState != e_atUpperLimit)
- {
- m_limitForce = 0;
- }
- m_limitState = e_atUpperLimit;
- }
- else
- {
- m_limitState = e_inactiveLimit;
- m_limitForce = 0;
- }
- }
- }
- if(m_enableMotor == false)
- {
- m_motorForce = 0;
- }
- if(m_enableLimit == false)
- {
- m_limitForce = 0;
- }
- if(step.warmStarting)
- {
- P1X = step.dt * (m_force * m_linearJacobian.linear1.x + (m_motorForce + m_limitForce) * m_motorJacobian.linear1.x);
- P1Y = step.dt * (m_force * m_linearJacobian.linear1.y + (m_motorForce + m_limitForce) * m_motorJacobian.linear1.y);
- P2X = step.dt * (m_force * m_linearJacobian.linear2.x + (m_motorForce + m_limitForce) * m_motorJacobian.linear2.x);
- P2Y = step.dt * (m_force * m_linearJacobian.linear2.y + (m_motorForce + m_limitForce) * m_motorJacobian.linear2.y);
- L1 = step.dt * (m_force * m_linearJacobian.angular1 - m_torque + (m_motorForce + m_limitForce) * m_motorJacobian.angular1);
- L2 = step.dt * (m_force * m_linearJacobian.angular2 + m_torque + (m_motorForce + m_limitForce) * m_motorJacobian.angular2);
- b1.m_linearVelocity.x += invMass1 * P1X;
- b1.m_linearVelocity.y += invMass1 * P1Y;
- b1.m_angularVelocity += invI1 * L1;
- b2.m_linearVelocity.x += invMass2 * P2X;
- b2.m_linearVelocity.y += invMass2 * P2Y;
- b2.m_angularVelocity += invI2 * L2;
- }
- else
- {
- m_force = 0;
- m_torque = 0;
- m_limitForce = 0;
- m_motorForce = 0;
- }
- m_limitPositionImpulse = 0;
- }
-
- public function GetMotorForce() : Number
- {
- return m_motorForce;
- }
-
- public function EnableLimit(flag:Boolean) : void
- {
- m_enableLimit = flag;
- }
-
- public function SetMaxMotorForce(force:Number) : void
- {
- m_maxMotorForce = force;
- }
-
- override public function GetReactionTorque() : Number
- {
- return m_torque;
- }
-
- public function IsLimitEnabled() : Boolean
- {
- return m_enableLimit;
- }
-
- public function IsMotorEnabled() : Boolean
- {
- return m_enableMotor;
- }
-
- public function SetLimits(lower:Number, upper:Number) : void
- {
- m_lowerTranslation = lower;
- m_upperTranslation = upper;
- }
- }
- }
-