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

Delphi/CppBuilder

开发平台:

Delphi

  1. unit USliderCrank;
  2. interface
  3. {$I ......SourcePhysics2D.inc}
  4. uses
  5.    UMain, UPhysics2DTypes, UPhysics2D, SysUtils;
  6. type
  7.    TSliderCrank = class(TTester)
  8.    public
  9.       m_joint1: Tb2RevoluteJoint;
  10.      m_joint2: 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. { TSliderCrank }
  17. constructor TSliderCrank.Create;
  18. var
  19.    ground, prevBody, body: Tb2Body;
  20.    sd: Tb2PolygonDef;
  21.    bd: Tb2BodyDef;
  22.    rjd: Tb2RevoluteJointDef;
  23.    pjd: Tb2PrismaticJointDef;
  24. begin
  25.    inherited;
  26.    begin
  27.      sd := Tb2PolygonDef.Create;
  28.      sd.SetAsBox(50.0, 10.0);
  29.      bd := Tb2BodyDef.Create;
  30.      {$IFDEF OP_OVERLOAD}
  31.      bd.position.SetValue(0.0, -10.0);
  32.      {$ELSE}
  33.      SetValue(bd.position, 0.0, -10.0);
  34.      {$ENDIF}
  35.      ground := m_world.CreateBody(bd);
  36.      ground.CreateShape(sd);
  37.    end;
  38.    begin
  39.       // Define crank.
  40.       sd := Tb2PolygonDef.Create;
  41.       sd.SetAsBox(0.5, 2.0);
  42.       sd.density := 1.0;
  43.       rjd := Tb2RevoluteJointDef.Create;
  44.       prevBody := ground;
  45.       bd := Tb2BodyDef.Create;
  46.       {$IFDEF OP_OVERLOAD}
  47.       bd.position.SetValue(0.0, 7.0);
  48.       {$ELSE}
  49.       SetValue(bd.position, 0.0, 7.0);
  50.       {$ENDIF}
  51.       body := m_world.CreateBody(bd, False);
  52.       body.CreateShape(sd, False);
  53.       body.SetMassFromShapes;
  54.       rjd.Initialize(prevBody, body, MakeVector(0.0, 5.0));
  55.       rjd.motorSpeed := 1.0 * Pi;
  56.       rjd.maxMotorTorque := 10000.0;
  57.       rjd.enableMotor := True;
  58.       m_joint1 := Tb2RevoluteJoint(m_world.CreateJoint(rjd, False));
  59.       prevBody := body;
  60.       // Define follower.
  61.       sd.SetAsBox(0.5, 4.0);
  62.       {$IFDEF OP_OVERLOAD}
  63.       bd.position.SetValue(0.0, 13.0);
  64.       {$ELSE}
  65.       SetValue(bd.position, 0.0, 13.0);
  66.       {$ENDIF}
  67.       body := m_world.CreateBody(bd, False);
  68.       body.CreateShape(sd, False);
  69.       body.SetMassFromShapes;
  70.       rjd.Initialize(prevBody, body, MakeVector(0.0, 9.0));
  71.       rjd.enableMotor := False;
  72.       m_world.CreateJoint(rjd, False);
  73.       prevBody := body;
  74.       // Define piston
  75.       sd.SetAsBox(1.5, 1.5);
  76.       {$IFDEF OP_OVERLOAD}
  77.       bd.position.SetValue(0.0, 17.0);
  78.       {$ELSE}
  79.       SetValue(bd.position, 0.0, 17.0);
  80.       {$ENDIF}
  81.       body := m_world.CreateBody(bd, False);
  82.       body.CreateShape(sd, False);
  83.       body.SetMassFromShapes;
  84.       rjd.Initialize(prevBody, body, MakeVector(0.0, 17.0));
  85.       m_world.CreateJoint(rjd);
  86.       pjd := Tb2PrismaticJointDef.Create;
  87.       pjd.Initialize(ground, body, MakeVector(0.0, 17.0), MakeVector(0.0, 1.0));
  88.       pjd.maxMotorForce := 1000.0;
  89.       pjd.enableMotor := True;
  90.       m_joint2 := Tb2PrismaticJoint(m_world.CreateJoint(pjd));
  91.       // Create a payload
  92.       sd.density := 2.0;
  93.       {$IFDEF OP_OVERLOAD}
  94.       bd.position.SetValue(0.0, 23.0);
  95.       {$ELSE}
  96.       SetValue(bd.position, 0.0, 23.0);
  97.       {$ENDIF}
  98.       body := m_world.CreateBody(bd);
  99.       body.CreateShape(sd);
  100.       body.SetMassFromShapes;
  101.    end;
  102. end;
  103. procedure TSliderCrank.Step(var settings: TSettings; timeStep: Float);
  104. begin
  105.    inherited;
  106.    DrawText('Keys: (f) toggle friction, (m) toggle motor');
  107.    DrawText(Format('Motor Torque = %5.0f', [m_joint1.MotorTorque]));
  108. end;
  109. procedure TSliderCrank.Keyboard(key: Byte);
  110. begin
  111.    case key of
  112.       70{F}:
  113.          begin
  114.       m_joint2.m_enableMotor := not m_joint2.m_enableMotor;
  115.       m_joint2.GetBody2.WakeUp;
  116.          end;
  117.       77{M}:
  118.          begin
  119.       m_joint1.m_enableMotor := not m_joint1.m_enableMotor;
  120.       m_joint1.GetBody2.WakeUp;
  121.          end;
  122.    end;
  123. end;
  124. initialization
  125.    RegisterTestEntry('Slider Crank', TSliderCrank);
  126. end.