UMotorsAndLimits.pas
上传用户:zkjn0718
上传日期:2021-01-01
资源大小:776k
文件大小:4k
源码类别:

Delphi/CppBuilder

开发平台:

Delphi

  1. unit UMotorsAndLimits;
  2. interface
  3. {$I ......SourcePhysics2D.inc}
  4. uses
  5.    UMain, UPhysics2DTypes, UPhysics2D, SysUtils;
  6. type
  7.    TMotorsAndLimits = class(TTester)
  8.    public
  9.       m_joint1, m_joint2: Tb2RevoluteJoint;
  10.       m_joint3: Tb2PrismaticJoint;
  11.       constructor Create; override;
  12.       procedure Step(var settings: TSettings; timeStep: Float); override;
  13.       procedure Keyboard(key: Byte); override;
  14.    end;
  15. implementation
  16. { TMotorsAndLimits }
  17. constructor TMotorsAndLimits.Create;
  18. const
  19.    y = 8.0;
  20. var
  21.    ground, body, prevBody: Tb2Body;
  22.    sd: Tb2PolygonDef;
  23.    bd: Tb2BodyDef;
  24.    rjd: Tb2RevoluteJointDef;
  25.    pjd: Tb2PrismaticJointDef;
  26. begin
  27.    inherited;
  28.    begin
  29.       sd := Tb2PolygonDef.Create;
  30.       sd.SetAsBox(50.0, 10.0);
  31.       bd := Tb2BodyDef.Create;
  32.       {$IFDEF OP_OVERLOAD}
  33.       bd.position.SetValue(0.0, -10.0);
  34.       {$ELSE}
  35.       SetValue(bd.position, 0.0, -10.0);
  36.       {$ENDIF}
  37.       ground := m_world.CreateBody(bd);
  38.       ground.CreateShape(sd);
  39.    end;
  40.    begin
  41.       sd := Tb2PolygonDef.Create;
  42.       sd.SetAsBox(2.0, 0.5);
  43.       sd.density := 5.0;
  44.       sd.friction := 0.05;
  45.       bd := Tb2BodyDef.Create;
  46.       rjd := Tb2RevoluteJointDef.Create;
  47.       prevBody := ground;
  48.       {$IFDEF OP_OVERLOAD}
  49.       bd.position.SetValue(3.0, y);
  50.       {$ELSE}
  51.       SetValue(bd.position, 3.0, y);
  52.       {$ENDIF}
  53.       body := m_world.CreateBody(bd, False);
  54.       body.CreateShape(sd, False);
  55.       body.SetMassFromShapes;
  56.       rjd.Initialize(prevBody, body, MakeVector(0.0, y));
  57.       rjd.motorSpeed := 1.0 * Pi;
  58.       rjd.maxMotorTorque := 10000.0;
  59.       rjd.enableMotor := True;
  60.       m_joint1 := Tb2RevoluteJoint(m_world.CreateJoint(rjd, False));
  61.       prevBody := body;
  62.       {$IFDEF OP_OVERLOAD}
  63.       bd.position.SetValue(9.0, y);
  64.       {$ELSE}
  65.       SetValue(bd.position, 9.0, y);
  66.       {$ENDIF}
  67.       body := m_world.CreateBody(bd, False);
  68.       body.CreateShape(sd, False);
  69.       body.SetMassFromShapes;
  70.       rjd.Initialize(prevBody, body, MakeVector(6.0, y));
  71.       rjd.motorSpeed := 0.5 * Pi;
  72.       rjd.maxMotorTorque := 2000.0;
  73.       rjd.enableMotor := True;
  74.       rjd.lowerAngle := -0.5 * Pi;
  75.       rjd.upperAngle := 0.5 * Pi;
  76.       rjd.enableLimit := True;
  77.       m_joint2 := Tb2RevoluteJoint(m_world.CreateJoint(rjd));
  78.       {$IFDEF OP_OVERLOAD}
  79.       bd.position.SetValue(-10.0, 10.0);
  80.       {$ELSE}
  81.       SetValue(bd.position, -10.0, 10.0);
  82.       {$ENDIF}
  83.       bd.angle := 0.5 * Pi;
  84.       body := m_world.CreateBody(bd);
  85.       body.CreateShape(sd);
  86.       body.SetMassFromShapes;
  87.       pjd := Tb2PrismaticJointDef.Create;
  88.       pjd.Initialize(ground, body, MakeVector(-10.0, 10.0), MakeVector(1.0, 0.0));
  89.       pjd.motorSpeed := 10.0;
  90.       pjd.maxMotorForce := 1000.0;
  91.       pjd.enableMotor := True;
  92.       pjd.lowerTranslation := 0.0;
  93.       pjd.upperTranslation := 20.0;
  94.       pjd.enableLimit := True;
  95.       m_joint3 := Tb2PrismaticJoint(m_world.CreateJoint(pjd));
  96.    end;
  97. end;
  98. procedure TMotorsAndLimits.Step(var settings: TSettings; timeStep: Float);
  99. begin
  100.    inherited;
  101.    DrawText('Keys: (L) limits, (M) motors, (P) prismatic speed');
  102.    DrawText(Format('Motor Torque = %4.0f, %4.0f : Motor Force = %4.0f', [m_joint1.m_motorForce,
  103.       m_joint2.m_motorForce, m_joint3.m_motorForce]));
  104. end;
  105. procedure TMotorsAndLimits.Keyboard(key: Byte);
  106. begin
  107.    case key of
  108.       76{L}:
  109.          begin
  110.             m_joint2.LimitEnabled := not m_joint2.LimitEnabled;
  111.             m_joint3.LimitEnabled := not m_joint3.LimitEnabled;
  112.             m_joint2.GetBody1.WakeUp;
  113.             m_joint3.GetBody2.WakeUp;
  114.          end;
  115.       77{M}:
  116.          begin
  117.             m_joint1.MotorEnabled := not m_joint1.MotorEnabled;
  118.             m_joint2.MotorEnabled := not m_joint2.MotorEnabled;
  119.             m_joint3.MotorEnabled := not m_joint3.MotorEnabled;
  120.             m_joint2.GetBody1.WakeUp;
  121.             m_joint3.GetBody2.WakeUp;
  122.          end;
  123.       80{P}:
  124.          begin
  125.       m_joint3.GetBody2.WakeUp;
  126.       m_joint3.m_motorSpeed := -m_joint3.m_motorSpeed;
  127.          end;
  128.    end;
  129. end;
  130. initialization
  131.    RegisterTestEntry('Motors & Limits', TMotorsAndLimits);
  132. end.