home *** CD-ROM | disk | FTP | other *** search
/ 404 Jogos / CLJG.iso / Diversos / Beez.swf / scripts / Box2D / Dynamics / Joints / b2MouseJoint.as < prev    next >
Encoding:
Text File  |  2008-09-03  |  5.7 KB  |  175 lines

  1. package Box2D.Dynamics.Joints
  2. {
  3.    import Box2D.Common.Math.b2Mat22;
  4.    import Box2D.Common.Math.b2Vec2;
  5.    import Box2D.Common.b2Settings;
  6.    import Box2D.Dynamics.b2Body;
  7.    import Box2D.Dynamics.b2TimeStep;
  8.    
  9.    public class b2MouseJoint extends b2Joint
  10.    {
  11.        
  12.       
  13.       private var K1:b2Mat22;
  14.       
  15.       private var K:b2Mat22;
  16.       
  17.       public var m_beta:Number;
  18.       
  19.       public var m_mass:b2Mat22;
  20.       
  21.       private var K2:b2Mat22;
  22.       
  23.       public var m_target:b2Vec2;
  24.       
  25.       public var m_gamma:Number;
  26.       
  27.       public var m_impulse:b2Vec2;
  28.       
  29.       public var m_C:b2Vec2;
  30.       
  31.       public var m_localAnchor:b2Vec2;
  32.       
  33.       public var m_maxForce:Number;
  34.       
  35.       public function b2MouseJoint(def:b2MouseJointDef)
  36.       {
  37.          var tY:Number = NaN;
  38.          K = new b2Mat22();
  39.          K1 = new b2Mat22();
  40.          K2 = new b2Mat22();
  41.          m_localAnchor = new b2Vec2();
  42.          m_target = new b2Vec2();
  43.          m_impulse = new b2Vec2();
  44.          m_mass = new b2Mat22();
  45.          m_C = new b2Vec2();
  46.          super(def);
  47.          m_target.SetV(def.target);
  48.          var tX:Number = m_target.x - m_body2.m_xf.position.x;
  49.          tY = m_target.y - m_body2.m_xf.position.y;
  50.          var tMat:b2Mat22 = m_body2.m_xf.R;
  51.          m_localAnchor.x = tX * tMat.col1.x + tY * tMat.col1.y;
  52.          m_localAnchor.y = tX * tMat.col2.x + tY * tMat.col2.y;
  53.          m_maxForce = def.maxForce;
  54.          m_impulse.SetZero();
  55.          var mass:Number = m_body2.m_mass;
  56.          var omega:Number = 2 * b2Settings.b2_pi * def.frequencyHz;
  57.          var d:Number = 2 * mass * def.dampingRatio * omega;
  58.          var k:Number = def.timeStep * mass * (omega * omega);
  59.          m_gamma = 1 / (d + k);
  60.          m_beta = k / (d + k);
  61.       }
  62.       
  63.       public function SetTarget(target:b2Vec2) : void
  64.       {
  65.          if(m_body2.IsSleeping())
  66.          {
  67.             m_body2.WakeUp();
  68.          }
  69.          m_target = target;
  70.       }
  71.       
  72.       override public function GetAnchor2() : b2Vec2
  73.       {
  74.          return m_body2.GetWorldPoint(m_localAnchor);
  75.       }
  76.       
  77.       override public function InitVelocityConstraints(step:b2TimeStep) : void
  78.       {
  79.          var b:b2Body = null;
  80.          var tMat:b2Mat22 = null;
  81.          var rX:Number = NaN;
  82.          var rY:Number = NaN;
  83.          var invMass:Number = NaN;
  84.          var invI:Number = NaN;
  85.          b = m_body2;
  86.          tMat = b.m_xf.R;
  87.          rX = m_localAnchor.x - b.m_sweep.localCenter.x;
  88.          rY = m_localAnchor.y - b.m_sweep.localCenter.y;
  89.          var tX:Number = tMat.col1.x * rX + tMat.col2.x * rY;
  90.          rY = tMat.col1.y * rX + tMat.col2.y * rY;
  91.          rX = tX;
  92.          invMass = b.m_invMass;
  93.          invI = b.m_invI;
  94.          K1.col1.x = invMass;
  95.          K1.col2.x = 0;
  96.          K1.col1.y = 0;
  97.          K1.col2.y = invMass;
  98.          K2.col1.x = invI * rY * rY;
  99.          K2.col2.x = -invI * rX * rY;
  100.          K2.col1.y = -invI * rX * rY;
  101.          K2.col2.y = invI * rX * rX;
  102.          K.SetM(K1);
  103.          K.AddM(K2);
  104.          K.col1.x += m_gamma;
  105.          K.col2.y += m_gamma;
  106.          K.Invert(m_mass);
  107.          m_C.x = b.m_sweep.c.x + rX - m_target.x;
  108.          m_C.y = b.m_sweep.c.y + rY - m_target.y;
  109.          b.m_angularVelocity *= 0.98;
  110.          var PX:Number = step.dt * m_impulse.x;
  111.          var PY:Number = step.dt * m_impulse.y;
  112.          b.m_linearVelocity.x += invMass * PX;
  113.          b.m_linearVelocity.y += invMass * PY;
  114.          b.m_angularVelocity += invI * (rX * PY - rY * PX);
  115.       }
  116.       
  117.       override public function GetAnchor1() : b2Vec2
  118.       {
  119.          return m_target;
  120.       }
  121.       
  122.       override public function GetReactionTorque() : Number
  123.       {
  124.          return 0;
  125.       }
  126.       
  127.       override public function GetReactionForce() : b2Vec2
  128.       {
  129.          return m_impulse;
  130.       }
  131.       
  132.       override public function SolvePositionConstraints() : Boolean
  133.       {
  134.          return true;
  135.       }
  136.       
  137.       override public function SolveVelocityConstraints(step:b2TimeStep) : void
  138.       {
  139.          var tMat:b2Mat22 = null;
  140.          var tX:Number = NaN;
  141.          var tY:Number = NaN;
  142.          var b:b2Body = m_body2;
  143.          tMat = b.m_xf.R;
  144.          var rX:Number = m_localAnchor.x - b.m_sweep.localCenter.x;
  145.          var rY:Number = m_localAnchor.y - b.m_sweep.localCenter.y;
  146.          tX = tMat.col1.x * rX + tMat.col2.x * rY;
  147.          rY = tMat.col1.y * rX + tMat.col2.y * rY;
  148.          rX = tX;
  149.          var CdotX:Number = b.m_linearVelocity.x + -b.m_angularVelocity * rY;
  150.          var CdotY:Number = b.m_linearVelocity.y + b.m_angularVelocity * rX;
  151.          tMat = m_mass;
  152.          tX = CdotX + m_beta * step.inv_dt * m_C.x + m_gamma * step.dt * m_impulse.x;
  153.          tY = CdotY + m_beta * step.inv_dt * m_C.y + m_gamma * step.dt * m_impulse.y;
  154.          var forceX:Number = -step.inv_dt * (tMat.col1.x * tX + tMat.col2.x * tY);
  155.          var forceY:Number = -step.inv_dt * (tMat.col1.y * tX + tMat.col2.y * tY);
  156.          var oldForceX:Number = m_impulse.x;
  157.          var oldForceY:Number = m_impulse.y;
  158.          m_impulse.x += forceX;
  159.          m_impulse.y += forceY;
  160.          var forceMagnitude:Number = m_impulse.Length();
  161.          if(forceMagnitude > m_maxForce)
  162.          {
  163.             m_impulse.Multiply(m_maxForce / forceMagnitude);
  164.          }
  165.          forceX = m_impulse.x - oldForceX;
  166.          forceY = m_impulse.y - oldForceY;
  167.          var PX:Number = step.dt * forceX;
  168.          var PY:Number = step.dt * forceY;
  169.          b.m_linearVelocity.x += b.m_invMass * PX;
  170.          b.m_linearVelocity.y += b.m_invMass * PY;
  171.          b.m_angularVelocity += b.m_invI * (rX * PY - rY * PX);
  172.       }
  173.    }
  174. }
  175.