# No. 275 (Brown 1868): "Rotary motion of the worm gives a rectilinear motion to the rack."
#
# Model (cm): No. 31's worm (single thread, axial pitch 1.5708, the one driven joint, 60 rpm) along x, and over it a straight rack of 17 teeth at that pitch
# (flanks 20 degrees, 0.75 thick at the pitch line) in a guide that lets it slide only along x, against a little drag. Each turn of the worm the thread at its top
# advances one pitch along x and carries the rack one tooth: 1.5708 cm a turn, to the left (-x) as the worm turns +x by the right-hand rule. Only the thread touches the teeth. Generator: opencode-runs/batch12/gen275.py.
number: 275
slug: worm-and-rack
name: A worm driving a rack
brown: "Rotary motion of the worm gives a rectilinear motion to the rack."
units: cm
sim:
  timestep: 0.0002
  integrator: implicitfast
  iterations: 100
  solver: CG
  multiccd: true
  duration_s: 6
  floor: false
bodies:
  - id: worm
    shape: part
    pos: [0, 0, -9.1]
    density: 7800
    friction: 0.1
    color: "#e4d9bf"
    pieces:
      - {kind: rod, from: [-2.75, 0, -9.1], to: [2.75, 0, -9.1], radius: 0.98, collide: 0}   # the worm's core
      - {kind: rod, from: [-9, 0, -9.1], to: [9, 0, -9.1], radius: 0.5, collide: 0}          # its shaft
      - {kind: rod, from: [-9.6, 0, -9.1], to: [-9.0, 0, -9.1], radius: 1.6, collide: 0, color: "#8f8a80"}   # a hand-wheel's boss
      - {kind: loft, a: [[-2.89387, 0.975, -9.1], [-1.81851, 0.975, -9.1], [-2.22798, 2.1, -9.1], [-2.48441, 2.1, -9.1]], b: [[-2.82843, 0.94178, -8.84765], [-1.75306, 0.94178, -8.84765], [-2.16253, 2.02844, -8.55648], [-2.41896, 2.02844, -8.55648]], collide: 1}
      - {kind: loft, a: [[-2.82843, 0.94178, -8.84765], [-1.75306, 0.94178, -8.84765], [-2.16253, 2.02844, -8.55648], [-2.41896, 2.02844, -8.55648]], b: [[-2.76298, 0.84437, -8.6125], [-1.68761, 0.84437, -8.6125], [-2.09708, 1.81865, -8.05], [-2.35351, 1.81865, -8.05]], collide: 1}
      - {kind: loft, a: [[-2.76298, 0.84437, -8.6125], [-1.68761, 0.84437, -8.6125], [-2.09708, 1.81865, -8.05], [-2.35351, 1.81865, -8.05]], b: [[-2.69753, 0.68943, -8.41057], [-1.62216, 0.68943, -8.41057], [-2.03163, 1.48492, -7.61508], [-2.28806, 1.48492, -7.61508]], collide: 1}
      - {kind: loft, a: [[-2.69753, 0.68943, -8.41057], [-1.62216, 0.68943, -8.41057], [-2.03163, 1.48492, -7.61508], [-2.28806, 1.48492, -7.61508]], b: [[-2.63208, 0.4875, -8.25563], [-1.55671, 0.4875, -8.25563], [-1.96618, 1.05, -7.28135], [-2.22261, 1.05, -7.28135]], collide: 1}
      - {kind: loft, a: [[-2.63208, 0.4875, -8.25563], [-1.55671, 0.4875, -8.25563], [-1.96618, 1.05, -7.28135], [-2.22261, 1.05, -7.28135]], b: [[-2.56663, 0.25235, -8.15822], [-1.49126, 0.25235, -8.15822], [-1.90073, 0.54352, -7.07156], [-2.15716, 0.54352, -7.07156]], collide: 1}
      - {kind: loft, a: [[-2.56663, 0.25235, -8.15822], [-1.49126, 0.25235, -8.15822], [-1.90073, 0.54352, -7.07156], [-2.15716, 0.54352, -7.07156]], b: [[-2.50118, 0.0, -8.125], [-1.42581, 0.0, -8.125], [-1.83528, 0.0, -7.0], [-2.09171, 0.0, -7.0]], collide: 1}
      - {kind: loft, a: [[-2.50118, 0.0, -8.125], [-1.42581, 0.0, -8.125], [-1.83528, 0.0, -7.0], [-2.09171, 0.0, -7.0]], b: [[-2.43573, -0.25235, -8.15822], [-1.36037, -0.25235, -8.15822], [-1.76983, -0.54352, -7.07156], [-2.02626, -0.54352, -7.07156]], collide: 1}
      - {kind: loft, a: [[-2.43573, -0.25235, -8.15822], [-1.36037, -0.25235, -8.15822], [-1.76983, -0.54352, -7.07156], [-2.02626, -0.54352, -7.07156]], b: [[-2.37028, -0.4875, -8.25563], [-1.29492, -0.4875, -8.25563], [-1.70438, -1.05, -7.28135], [-1.96081, -1.05, -7.28135]], collide: 1}
      - {kind: loft, a: [[-2.37028, -0.4875, -8.25563], [-1.29492, -0.4875, -8.25563], [-1.70438, -1.05, -7.28135], [-1.96081, -1.05, -7.28135]], b: [[-2.30483, -0.68943, -8.41057], [-1.22947, -0.68943, -8.41057], [-1.63893, -1.48492, -7.61508], [-1.89536, -1.48492, -7.61508]], collide: 1}
      - {kind: loft, a: [[-2.30483, -0.68943, -8.41057], [-1.22947, -0.68943, -8.41057], [-1.63893, -1.48492, -7.61508], [-1.89536, -1.48492, -7.61508]], b: [[-2.23938, -0.84437, -8.6125], [-1.16402, -0.84437, -8.6125], [-1.57348, -1.81865, -8.05], [-1.82991, -1.81865, -8.05]], collide: 1}
      - {kind: loft, a: [[-2.23938, -0.84437, -8.6125], [-1.16402, -0.84437, -8.6125], [-1.57348, -1.81865, -8.05], [-1.82991, -1.81865, -8.05]], b: [[-2.17393, -0.94178, -8.84765], [-1.09857, -0.94178, -8.84765], [-1.50803, -2.02844, -8.55648], [-1.76446, -2.02844, -8.55648]], collide: 1}
      - {kind: loft, a: [[-2.17393, -0.94178, -8.84765], [-1.09857, -0.94178, -8.84765], [-1.50803, -2.02844, -8.55648], [-1.76446, -2.02844, -8.55648]], b: [[-2.10848, -0.975, -9.1], [-1.03312, -0.975, -9.1], [-1.44258, -2.1, -9.1], [-1.69901, -2.1, -9.1]], collide: 1}
      - {kind: loft, a: [[-2.10848, -0.975, -9.1], [-1.03312, -0.975, -9.1], [-1.44258, -2.1, -9.1], [-1.69901, -2.1, -9.1]], b: [[-2.04303, -0.94178, -9.35235], [-0.96767, -0.94178, -9.35235], [-1.37713, -2.02844, -9.64352], [-1.63356, -2.02844, -9.64352]], collide: 1}
      - {kind: loft, a: [[-2.04303, -0.94178, -9.35235], [-0.96767, -0.94178, -9.35235], [-1.37713, -2.02844, -9.64352], [-1.63356, -2.02844, -9.64352]], b: [[-1.97758, -0.84437, -9.5875], [-0.90222, -0.84437, -9.5875], [-1.31168, -1.81865, -10.15], [-1.56811, -1.81865, -10.15]], collide: 1}
      - {kind: loft, a: [[-1.97758, -0.84437, -9.5875], [-0.90222, -0.84437, -9.5875], [-1.31168, -1.81865, -10.15], [-1.56811, -1.81865, -10.15]], b: [[-1.91213, -0.68943, -9.78943], [-0.83677, -0.68943, -9.78943], [-1.24623, -1.48492, -10.58492], [-1.50266, -1.48492, -10.58492]], collide: 1}
      - {kind: loft, a: [[-1.91213, -0.68943, -9.78943], [-0.83677, -0.68943, -9.78943], [-1.24623, -1.48492, -10.58492], [-1.50266, -1.48492, -10.58492]], b: [[-1.84668, -0.4875, -9.94437], [-0.77132, -0.4875, -9.94437], [-1.18078, -1.05, -10.91865], [-1.43721, -1.05, -10.91865]], collide: 1}
      - {kind: loft, a: [[-1.84668, -0.4875, -9.94437], [-0.77132, -0.4875, -9.94437], [-1.18078, -1.05, -10.91865], [-1.43721, -1.05, -10.91865]], b: [[-1.78123, -0.25235, -10.04178], [-0.70587, -0.25235, -10.04178], [-1.11533, -0.54352, -11.12844], [-1.37176, -0.54352, -11.12844]], collide: 1}
      - {kind: loft, a: [[-1.78123, -0.25235, -10.04178], [-0.70587, -0.25235, -10.04178], [-1.11533, -0.54352, -11.12844], [-1.37176, -0.54352, -11.12844]], b: [[-1.71578, -0.0, -10.075], [-0.64042, -0.0, -10.075], [-1.04988, -0.0, -11.2], [-1.30631, -0.0, -11.2]], collide: 1}
      - {kind: loft, a: [[-1.71578, -0.0, -10.075], [-0.64042, -0.0, -10.075], [-1.04988, -0.0, -11.2], [-1.30631, -0.0, -11.2]], b: [[-1.65033, 0.25235, -10.04178], [-0.57497, 0.25235, -10.04178], [-0.98443, 0.54352, -11.12844], [-1.24086, 0.54352, -11.12844]], collide: 1}
      - {kind: loft, a: [[-1.65033, 0.25235, -10.04178], [-0.57497, 0.25235, -10.04178], [-0.98443, 0.54352, -11.12844], [-1.24086, 0.54352, -11.12844]], b: [[-1.58488, 0.4875, -9.94437], [-0.50952, 0.4875, -9.94437], [-0.91898, 1.05, -10.91865], [-1.17541, 1.05, -10.91865]], collide: 1}
      - {kind: loft, a: [[-1.58488, 0.4875, -9.94437], [-0.50952, 0.4875, -9.94437], [-0.91898, 1.05, -10.91865], [-1.17541, 1.05, -10.91865]], b: [[-1.51943, 0.68943, -9.78943], [-0.44407, 0.68943, -9.78943], [-0.85353, 1.48492, -10.58492], [-1.10996, 1.48492, -10.58492]], collide: 1}
      - {kind: loft, a: [[-1.51943, 0.68943, -9.78943], [-0.44407, 0.68943, -9.78943], [-0.85353, 1.48492, -10.58492], [-1.10996, 1.48492, -10.58492]], b: [[-1.45398, 0.84437, -9.5875], [-0.37862, 0.84437, -9.5875], [-0.78808, 1.81865, -10.15], [-1.04451, 1.81865, -10.15]], collide: 1}
      - {kind: loft, a: [[-1.45398, 0.84437, -9.5875], [-0.37862, 0.84437, -9.5875], [-0.78808, 1.81865, -10.15], [-1.04451, 1.81865, -10.15]], b: [[-1.38853, 0.94178, -9.35235], [-0.31317, 0.94178, -9.35235], [-0.72263, 2.02844, -9.64352], [-0.97906, 2.02844, -9.64352]], collide: 1}
      - {kind: loft, a: [[-1.38853, 0.94178, -9.35235], [-0.31317, 0.94178, -9.35235], [-0.72263, 2.02844, -9.64352], [-0.97906, 2.02844, -9.64352]], b: [[-1.32308, 0.975, -9.1], [-0.24772, 0.975, -9.1], [-0.65718, 2.1, -9.1], [-0.91361, 2.1, -9.1]], collide: 1}
      - {kind: loft, a: [[-1.32308, 0.975, -9.1], [-0.24772, 0.975, -9.1], [-0.65718, 2.1, -9.1], [-0.91361, 2.1, -9.1]], b: [[-1.25763, 0.94178, -8.84765], [-0.18227, 0.94178, -8.84765], [-0.59173, 2.02844, -8.55648], [-0.84816, 2.02844, -8.55648]], collide: 1}
      - {kind: loft, a: [[-1.25763, 0.94178, -8.84765], [-0.18227, 0.94178, -8.84765], [-0.59173, 2.02844, -8.55648], [-0.84816, 2.02844, -8.55648]], b: [[-1.19218, 0.84437, -8.6125], [-0.11682, 0.84437, -8.6125], [-0.52628, 1.81865, -8.05], [-0.78271, 1.81865, -8.05]], collide: 1}
      - {kind: loft, a: [[-1.19218, 0.84437, -8.6125], [-0.11682, 0.84437, -8.6125], [-0.52628, 1.81865, -8.05], [-0.78271, 1.81865, -8.05]], b: [[-1.12673, 0.68943, -8.41057], [-0.05137, 0.68943, -8.41057], [-0.46083, 1.48492, -7.61508], [-0.71726, 1.48492, -7.61508]], collide: 1}
      - {kind: loft, a: [[-1.12673, 0.68943, -8.41057], [-0.05137, 0.68943, -8.41057], [-0.46083, 1.48492, -7.61508], [-0.71726, 1.48492, -7.61508]], b: [[-1.06128, 0.4875, -8.25563], [0.01408, 0.4875, -8.25563], [-0.39538, 1.05, -7.28135], [-0.65181, 1.05, -7.28135]], collide: 1}
      - {kind: loft, a: [[-1.06128, 0.4875, -8.25563], [0.01408, 0.4875, -8.25563], [-0.39538, 1.05, -7.28135], [-0.65181, 1.05, -7.28135]], b: [[-0.99583, 0.25235, -8.15822], [0.07953, 0.25235, -8.15822], [-0.32993, 0.54352, -7.07156], [-0.58636, 0.54352, -7.07156]], collide: 1}
      - {kind: loft, a: [[-0.99583, 0.25235, -8.15822], [0.07953, 0.25235, -8.15822], [-0.32993, 0.54352, -7.07156], [-0.58636, 0.54352, -7.07156]], b: [[-0.93038, 0.0, -8.125], [0.14498, 0.0, -8.125], [-0.26449, 0.0, -7.0], [-0.52091, 0.0, -7.0]], collide: 1}
      - {kind: loft, a: [[-0.93038, 0.0, -8.125], [0.14498, 0.0, -8.125], [-0.26449, 0.0, -7.0], [-0.52091, 0.0, -7.0]], b: [[-0.86493, -0.25235, -8.15822], [0.21043, -0.25235, -8.15822], [-0.19904, -0.54352, -7.07156], [-0.45546, -0.54352, -7.07156]], collide: 1}
      - {kind: loft, a: [[-0.86493, -0.25235, -8.15822], [0.21043, -0.25235, -8.15822], [-0.19904, -0.54352, -7.07156], [-0.45546, -0.54352, -7.07156]], b: [[-0.79948, -0.4875, -8.25563], [0.27588, -0.4875, -8.25563], [-0.13359, -1.05, -7.28135], [-0.39001, -1.05, -7.28135]], collide: 1}
      - {kind: loft, a: [[-0.79948, -0.4875, -8.25563], [0.27588, -0.4875, -8.25563], [-0.13359, -1.05, -7.28135], [-0.39001, -1.05, -7.28135]], b: [[-0.73403, -0.68943, -8.41057], [0.34133, -0.68943, -8.41057], [-0.06814, -1.48492, -7.61508], [-0.32456, -1.48492, -7.61508]], collide: 1}
      - {kind: loft, a: [[-0.73403, -0.68943, -8.41057], [0.34133, -0.68943, -8.41057], [-0.06814, -1.48492, -7.61508], [-0.32456, -1.48492, -7.61508]], b: [[-0.66858, -0.84437, -8.6125], [0.40678, -0.84437, -8.6125], [-0.00269, -1.81865, -8.05], [-0.25911, -1.81865, -8.05]], collide: 1}
      - {kind: loft, a: [[-0.66858, -0.84437, -8.6125], [0.40678, -0.84437, -8.6125], [-0.00269, -1.81865, -8.05], [-0.25911, -1.81865, -8.05]], b: [[-0.60313, -0.94178, -8.84765], [0.47223, -0.94178, -8.84765], [0.06276, -2.02844, -8.55648], [-0.19366, -2.02844, -8.55648]], collide: 1}
      - {kind: loft, a: [[-0.60313, -0.94178, -8.84765], [0.47223, -0.94178, -8.84765], [0.06276, -2.02844, -8.55648], [-0.19366, -2.02844, -8.55648]], b: [[-0.53768, -0.975, -9.1], [0.53768, -0.975, -9.1], [0.12821, -2.1, -9.1], [-0.12821, -2.1, -9.1]], collide: 1}
      - {kind: loft, a: [[-0.53768, -0.975, -9.1], [0.53768, -0.975, -9.1], [0.12821, -2.1, -9.1], [-0.12821, -2.1, -9.1]], b: [[-0.47223, -0.94178, -9.35235], [0.60313, -0.94178, -9.35235], [0.19366, -2.02844, -9.64352], [-0.06276, -2.02844, -9.64352]], collide: 1}
      - {kind: loft, a: [[-0.47223, -0.94178, -9.35235], [0.60313, -0.94178, -9.35235], [0.19366, -2.02844, -9.64352], [-0.06276, -2.02844, -9.64352]], b: [[-0.40678, -0.84437, -9.5875], [0.66858, -0.84437, -9.5875], [0.25911, -1.81865, -10.15], [0.00269, -1.81865, -10.15]], collide: 1}
      - {kind: loft, a: [[-0.40678, -0.84437, -9.5875], [0.66858, -0.84437, -9.5875], [0.25911, -1.81865, -10.15], [0.00269, -1.81865, -10.15]], b: [[-0.34133, -0.68943, -9.78943], [0.73403, -0.68943, -9.78943], [0.32456, -1.48492, -10.58492], [0.06814, -1.48492, -10.58492]], collide: 1}
      - {kind: loft, a: [[-0.34133, -0.68943, -9.78943], [0.73403, -0.68943, -9.78943], [0.32456, -1.48492, -10.58492], [0.06814, -1.48492, -10.58492]], b: [[-0.27588, -0.4875, -9.94437], [0.79948, -0.4875, -9.94437], [0.39001, -1.05, -10.91865], [0.13359, -1.05, -10.91865]], collide: 1}
      - {kind: loft, a: [[-0.27588, -0.4875, -9.94437], [0.79948, -0.4875, -9.94437], [0.39001, -1.05, -10.91865], [0.13359, -1.05, -10.91865]], b: [[-0.21043, -0.25235, -10.04178], [0.86493, -0.25235, -10.04178], [0.45546, -0.54352, -11.12844], [0.19904, -0.54352, -11.12844]], collide: 1}
      - {kind: loft, a: [[-0.21043, -0.25235, -10.04178], [0.86493, -0.25235, -10.04178], [0.45546, -0.54352, -11.12844], [0.19904, -0.54352, -11.12844]], b: [[-0.14498, -0.0, -10.075], [0.93038, -0.0, -10.075], [0.52091, -0.0, -11.2], [0.26449, -0.0, -11.2]], collide: 1}
      - {kind: loft, a: [[-0.14498, -0.0, -10.075], [0.93038, -0.0, -10.075], [0.52091, -0.0, -11.2], [0.26449, -0.0, -11.2]], b: [[-0.07953, 0.25235, -10.04178], [0.99583, 0.25235, -10.04178], [0.58636, 0.54352, -11.12844], [0.32993, 0.54352, -11.12844]], collide: 1}
      - {kind: loft, a: [[-0.07953, 0.25235, -10.04178], [0.99583, 0.25235, -10.04178], [0.58636, 0.54352, -11.12844], [0.32993, 0.54352, -11.12844]], b: [[-0.01408, 0.4875, -9.94437], [1.06128, 0.4875, -9.94437], [0.65181, 1.05, -10.91865], [0.39538, 1.05, -10.91865]], collide: 1}
      - {kind: loft, a: [[-0.01408, 0.4875, -9.94437], [1.06128, 0.4875, -9.94437], [0.65181, 1.05, -10.91865], [0.39538, 1.05, -10.91865]], b: [[0.05137, 0.68943, -9.78943], [1.12673, 0.68943, -9.78943], [0.71726, 1.48492, -10.58492], [0.46083, 1.48492, -10.58492]], collide: 1}
      - {kind: loft, a: [[0.05137, 0.68943, -9.78943], [1.12673, 0.68943, -9.78943], [0.71726, 1.48492, -10.58492], [0.46083, 1.48492, -10.58492]], b: [[0.11682, 0.84437, -9.5875], [1.19218, 0.84437, -9.5875], [0.78271, 1.81865, -10.15], [0.52628, 1.81865, -10.15]], collide: 1}
      - {kind: loft, a: [[0.11682, 0.84437, -9.5875], [1.19218, 0.84437, -9.5875], [0.78271, 1.81865, -10.15], [0.52628, 1.81865, -10.15]], b: [[0.18227, 0.94178, -9.35235], [1.25763, 0.94178, -9.35235], [0.84816, 2.02844, -9.64352], [0.59173, 2.02844, -9.64352]], collide: 1}
      - {kind: loft, a: [[0.18227, 0.94178, -9.35235], [1.25763, 0.94178, -9.35235], [0.84816, 2.02844, -9.64352], [0.59173, 2.02844, -9.64352]], b: [[0.24772, 0.975, -9.1], [1.32308, 0.975, -9.1], [0.91361, 2.1, -9.1], [0.65718, 2.1, -9.1]], collide: 1}
      - {kind: loft, a: [[0.24772, 0.975, -9.1], [1.32308, 0.975, -9.1], [0.91361, 2.1, -9.1], [0.65718, 2.1, -9.1]], b: [[0.31317, 0.94178, -8.84765], [1.38853, 0.94178, -8.84765], [0.97906, 2.02844, -8.55648], [0.72263, 2.02844, -8.55648]], collide: 1}
      - {kind: loft, a: [[0.31317, 0.94178, -8.84765], [1.38853, 0.94178, -8.84765], [0.97906, 2.02844, -8.55648], [0.72263, 2.02844, -8.55648]], b: [[0.37862, 0.84437, -8.6125], [1.45398, 0.84437, -8.6125], [1.04451, 1.81865, -8.05], [0.78808, 1.81865, -8.05]], collide: 1}
      - {kind: loft, a: [[0.37862, 0.84437, -8.6125], [1.45398, 0.84437, -8.6125], [1.04451, 1.81865, -8.05], [0.78808, 1.81865, -8.05]], b: [[0.44407, 0.68943, -8.41057], [1.51943, 0.68943, -8.41057], [1.10996, 1.48492, -7.61508], [0.85353, 1.48492, -7.61508]], collide: 1}
      - {kind: loft, a: [[0.44407, 0.68943, -8.41057], [1.51943, 0.68943, -8.41057], [1.10996, 1.48492, -7.61508], [0.85353, 1.48492, -7.61508]], b: [[0.50952, 0.4875, -8.25563], [1.58488, 0.4875, -8.25563], [1.17541, 1.05, -7.28135], [0.91898, 1.05, -7.28135]], collide: 1}
      - {kind: loft, a: [[0.50952, 0.4875, -8.25563], [1.58488, 0.4875, -8.25563], [1.17541, 1.05, -7.28135], [0.91898, 1.05, -7.28135]], b: [[0.57497, 0.25235, -8.15822], [1.65033, 0.25235, -8.15822], [1.24086, 0.54352, -7.07156], [0.98443, 0.54352, -7.07156]], collide: 1}
      - {kind: loft, a: [[0.57497, 0.25235, -8.15822], [1.65033, 0.25235, -8.15822], [1.24086, 0.54352, -7.07156], [0.98443, 0.54352, -7.07156]], b: [[0.64042, 0.0, -8.125], [1.71578, 0.0, -8.125], [1.30631, 0.0, -7.0], [1.04988, 0.0, -7.0]], collide: 1}
      - {kind: loft, a: [[0.64042, 0.0, -8.125], [1.71578, 0.0, -8.125], [1.30631, 0.0, -7.0], [1.04988, 0.0, -7.0]], b: [[0.70587, -0.25235, -8.15822], [1.78123, -0.25235, -8.15822], [1.37176, -0.54352, -7.07156], [1.11533, -0.54352, -7.07156]], collide: 1}
      - {kind: loft, a: [[0.70587, -0.25235, -8.15822], [1.78123, -0.25235, -8.15822], [1.37176, -0.54352, -7.07156], [1.11533, -0.54352, -7.07156]], b: [[0.77132, -0.4875, -8.25563], [1.84668, -0.4875, -8.25563], [1.43721, -1.05, -7.28135], [1.18078, -1.05, -7.28135]], collide: 1}
      - {kind: loft, a: [[0.77132, -0.4875, -8.25563], [1.84668, -0.4875, -8.25563], [1.43721, -1.05, -7.28135], [1.18078, -1.05, -7.28135]], b: [[0.83677, -0.68943, -8.41057], [1.91213, -0.68943, -8.41057], [1.50266, -1.48492, -7.61508], [1.24623, -1.48492, -7.61508]], collide: 1}
      - {kind: loft, a: [[0.83677, -0.68943, -8.41057], [1.91213, -0.68943, -8.41057], [1.50266, -1.48492, -7.61508], [1.24623, -1.48492, -7.61508]], b: [[0.90222, -0.84437, -8.6125], [1.97758, -0.84437, -8.6125], [1.56811, -1.81865, -8.05], [1.31168, -1.81865, -8.05]], collide: 1}
      - {kind: loft, a: [[0.90222, -0.84437, -8.6125], [1.97758, -0.84437, -8.6125], [1.56811, -1.81865, -8.05], [1.31168, -1.81865, -8.05]], b: [[0.96767, -0.94178, -8.84765], [2.04303, -0.94178, -8.84765], [1.63356, -2.02844, -8.55648], [1.37713, -2.02844, -8.55648]], collide: 1}
      - {kind: loft, a: [[0.96767, -0.94178, -8.84765], [2.04303, -0.94178, -8.84765], [1.63356, -2.02844, -8.55648], [1.37713, -2.02844, -8.55648]], b: [[1.03312, -0.975, -9.1], [2.10848, -0.975, -9.1], [1.69901, -2.1, -9.1], [1.44258, -2.1, -9.1]], collide: 1}
      - {kind: loft, a: [[1.03312, -0.975, -9.1], [2.10848, -0.975, -9.1], [1.69901, -2.1, -9.1], [1.44258, -2.1, -9.1]], b: [[1.09857, -0.94178, -9.35235], [2.17393, -0.94178, -9.35235], [1.76446, -2.02844, -9.64352], [1.50803, -2.02844, -9.64352]], collide: 1}
      - {kind: loft, a: [[1.09857, -0.94178, -9.35235], [2.17393, -0.94178, -9.35235], [1.76446, -2.02844, -9.64352], [1.50803, -2.02844, -9.64352]], b: [[1.16402, -0.84437, -9.5875], [2.23938, -0.84437, -9.5875], [1.82991, -1.81865, -10.15], [1.57348, -1.81865, -10.15]], collide: 1}
      - {kind: loft, a: [[1.16402, -0.84437, -9.5875], [2.23938, -0.84437, -9.5875], [1.82991, -1.81865, -10.15], [1.57348, -1.81865, -10.15]], b: [[1.22947, -0.68943, -9.78943], [2.30483, -0.68943, -9.78943], [1.89536, -1.48492, -10.58492], [1.63893, -1.48492, -10.58492]], collide: 1}
      - {kind: loft, a: [[1.22947, -0.68943, -9.78943], [2.30483, -0.68943, -9.78943], [1.89536, -1.48492, -10.58492], [1.63893, -1.48492, -10.58492]], b: [[1.29492, -0.4875, -9.94437], [2.37028, -0.4875, -9.94437], [1.96081, -1.05, -10.91865], [1.70438, -1.05, -10.91865]], collide: 1}
      - {kind: loft, a: [[1.29492, -0.4875, -9.94437], [2.37028, -0.4875, -9.94437], [1.96081, -1.05, -10.91865], [1.70438, -1.05, -10.91865]], b: [[1.36037, -0.25235, -10.04178], [2.43573, -0.25235, -10.04178], [2.02626, -0.54352, -11.12844], [1.76983, -0.54352, -11.12844]], collide: 1}
      - {kind: loft, a: [[1.36037, -0.25235, -10.04178], [2.43573, -0.25235, -10.04178], [2.02626, -0.54352, -11.12844], [1.76983, -0.54352, -11.12844]], b: [[1.42581, 0.0, -10.075], [2.50118, 0.0, -10.075], [2.09171, 0.0, -11.2], [1.83528, 0.0, -11.2]], collide: 1}
      - {kind: loft, a: [[1.42581, 0.0, -10.075], [2.50118, 0.0, -10.075], [2.09171, 0.0, -11.2], [1.83528, 0.0, -11.2]], b: [[1.49126, 0.25235, -10.04178], [2.56663, 0.25235, -10.04178], [2.15716, 0.54352, -11.12844], [1.90073, 0.54352, -11.12844]], collide: 1}
      - {kind: loft, a: [[1.49126, 0.25235, -10.04178], [2.56663, 0.25235, -10.04178], [2.15716, 0.54352, -11.12844], [1.90073, 0.54352, -11.12844]], b: [[1.55671, 0.4875, -9.94437], [2.63208, 0.4875, -9.94437], [2.22261, 1.05, -10.91865], [1.96618, 1.05, -10.91865]], collide: 1}
      - {kind: loft, a: [[1.55671, 0.4875, -9.94437], [2.63208, 0.4875, -9.94437], [2.22261, 1.05, -10.91865], [1.96618, 1.05, -10.91865]], b: [[1.62216, 0.68943, -9.78943], [2.69753, 0.68943, -9.78943], [2.28806, 1.48492, -10.58492], [2.03163, 1.48492, -10.58492]], collide: 1}
      - {kind: loft, a: [[1.62216, 0.68943, -9.78943], [2.69753, 0.68943, -9.78943], [2.28806, 1.48492, -10.58492], [2.03163, 1.48492, -10.58492]], b: [[1.68761, 0.84437, -9.5875], [2.76298, 0.84437, -9.5875], [2.35351, 1.81865, -10.15], [2.09708, 1.81865, -10.15]], collide: 1}
      - {kind: loft, a: [[1.68761, 0.84437, -9.5875], [2.76298, 0.84437, -9.5875], [2.35351, 1.81865, -10.15], [2.09708, 1.81865, -10.15]], b: [[1.75306, 0.94178, -9.35235], [2.82843, 0.94178, -9.35235], [2.41896, 2.02844, -9.64352], [2.16253, 2.02844, -9.64352]], collide: 1}
      - {kind: loft, a: [[1.75306, 0.94178, -9.35235], [2.82843, 0.94178, -9.35235], [2.41896, 2.02844, -9.64352], [2.16253, 2.02844, -9.64352]], b: [[1.81851, 0.975, -9.1], [2.89387, 0.975, -9.1], [2.48441, 2.1, -9.1], [2.22798, 2.1, -9.1]], collide: 1}
  - id: rack
    shape: part
    pos: [-1.178, 0, -6.3]
    density: 7800
    friction: 0.1
    color: "#d9cdb0"
    pieces:
      - {kind: poly, points: [[-14.5444, -6.9], [12.1884, -6.9], [12.1884, -5.7], [-14.5444, -5.7]], y: [-0.4, 0.4], collide: 0}   # the rack's bar
      - {kind: poly, points: [[-14.3378, -6.9], [-13.9374, -8.0], [-13.5514, -8.0], [-13.151, -6.9]], y: [-0.4, 0.4], collide: 2}
      - {kind: poly, points: [[-12.767, -6.9], [-12.3666, -8.0], [-11.9806, -8.0], [-11.5802, -6.9]], y: [-0.4, 0.4], collide: 2}
      - {kind: poly, points: [[-11.1962, -6.9], [-10.7958, -8.0], [-10.4098, -8.0], [-10.0094, -6.9]], y: [-0.4, 0.4], collide: 2}
      - {kind: poly, points: [[-9.6254, -6.9], [-9.225, -8.0], [-8.839, -8.0], [-8.4386, -6.9]], y: [-0.4, 0.4], collide: 2}
      - {kind: poly, points: [[-8.0546, -6.9], [-7.6542, -8.0], [-7.2682, -8.0], [-6.8678, -6.9]], y: [-0.4, 0.4], collide: 2}
      - {kind: poly, points: [[-6.4838, -6.9], [-6.0834, -8.0], [-5.6974, -8.0], [-5.297, -6.9]], y: [-0.4, 0.4], collide: 2}
      - {kind: poly, points: [[-4.913, -6.9], [-4.5126, -8.0], [-4.1266, -8.0], [-3.7262, -6.9]], y: [-0.4, 0.4], collide: 2}
      - {kind: poly, points: [[-3.3422, -6.9], [-2.9418, -8.0], [-2.5558, -8.0], [-2.1554, -6.9]], y: [-0.4, 0.4], collide: 2}
      - {kind: poly, points: [[-1.7714, -6.9], [-1.371, -8.0], [-0.985, -8.0], [-0.5846, -6.9]], y: [-0.4, 0.4], collide: 2}
      - {kind: poly, points: [[-0.2006, -6.9], [0.1998, -8.0], [0.5858, -8.0], [0.9862, -6.9]], y: [-0.4, 0.4], collide: 2}
      - {kind: poly, points: [[1.3702, -6.9], [1.7706, -8.0], [2.1566, -8.0], [2.557, -6.9]], y: [-0.4, 0.4], collide: 2}
      - {kind: poly, points: [[2.941, -6.9], [3.3414, -8.0], [3.7274, -8.0], [4.1278, -6.9]], y: [-0.4, 0.4], collide: 2}
      - {kind: poly, points: [[4.5118, -6.9], [4.9122, -8.0], [5.2982, -8.0], [5.6986, -6.9]], y: [-0.4, 0.4], collide: 2}
      - {kind: poly, points: [[6.0826, -6.9], [6.483, -8.0], [6.869, -8.0], [7.2694, -6.9]], y: [-0.4, 0.4], collide: 2}
      - {kind: poly, points: [[7.6534, -6.9], [8.0538, -8.0], [8.4398, -8.0], [8.8402, -6.9]], y: [-0.4, 0.4], collide: 2}
      - {kind: poly, points: [[9.2242, -6.9], [9.6246, -8.0], [10.0106, -8.0], [10.411, -6.9]], y: [-0.4, 0.4], collide: 2}
      - {kind: poly, points: [[10.795, -6.9], [11.1954, -8.0], [11.5814, -8.0], [11.9818, -6.9]], y: [-0.4, 0.4], collide: 2}
  - id: frame
    shape: part
    pos: [0, 0, 0]
    fixed: true
    color: "#8f8a80"
    pieces:
      - {kind: rod, from: [-6.6, 0, -9.1], to: [-5.4, 0, -9.1], radius: 0.9, collide: 0}     # the worm's bearings
      - {kind: rod, from: [5.4, 0, -9.1], to: [6.6, 0, -9.1], radius: 0.9, collide: 0}
      - {kind: poly, points: [[-1.2, -5.6], [1.2, -5.6], [1.2, -4.9], [-1.2, -4.9]], y: [-0.6, 0.6], collide: 0}   # the rack's guide, over it
      - {kind: poly, points: [[-1.2, -7.8], [1.2, -7.8], [1.2, -4.9], [-1.2, -4.9]], y: [0.5, 0.9], collide: 0}   # and behind it
joints:
  - {id: j_worm, type: hinge, body: worm, axis: [1, 0, 0], damping: 0.001}   # the one driven joint
  - {id: j_rack, type: slide, body: rack, axis: [1, 0, 0], range: [-13, 13], damping: 2.0}   # the rack in its guide; + : to the right
contact: {solref: [0.002, 1.0], solimp: [0.98, 0.99, 0.0002], margin: 0}
driver: {joint: j_worm, kind: velocity, rpm: 60, kv: 2.0, max_torque: 3}
checks:
  - {type: follow, out: j_rack, in: j_worm, expect: -0.0025, tol: 5e-05, min_r2: 0.999, settle_s: 0.5, window_s: 5}   # one pitch a turn
  - {type: penetration, max: 0.0008, settle_s: 0.5}
camera: {target: [0, 0, -8.3], position: [0.0, -45.0, -3.0], fov: 34.0}
display:
  output: j_rack
  labels: {j_worm: "Worm (driver)", j_rack: "Rack"}
  proof: {label: "Worm and rack", sub: "one tooth of the rack for each turn of the worm"}

