# Monster Truck

> A stylized monster truck: a short pickup body with flame decals and a roof light bar perched on four giant lugged tires, with fully exposed suspension — solid axles, differentials, four-link bars, colored coil-over shocks and drive shafts. The wheels are separate groups (wheelFL, wheelFR, wheelRL, wheelRR) with axles along X for spinning. Adjust paint, accent color, flames and suspension lift for stunt arenas, racing and destruction games.

![Monster Truck preview](https://codels.download/m/monster-truck.png)

Multi-view sheet (3/4, front, side, top): https://codels.download/m/monster-truck.sheet.png

## Facts

- Category: Vehicles › Cars & Trucks
- Size (W × H × D): 3.10 × 3.47 × 4.87 m — units are meters, +Y up, front faces +Z
- Origin: center of the base (y = 0)
- Triangles: 3,856 · Meshes: 155 · Materials: 8
- License: CC0-1.0 (Codels built-in)
- Tags: car, monster-truck, off-road, truck, low-poly, stylized, racing, sports, party-game, racing-game, hero-asset, vehicle, emissive, game-ready, parametric, color-blue, color-gray, size-large, poly-medium
- Page: https://codels.download/models/monster-truck

## Files

| Format | URL |
|---|---|
| three.js ES module (`createMonsterTruck()`) | https://codels.download/m/monster-truck.js |
| React Three Fiber component (`<MonsterTruck />`) | https://codels.download/m/monster-truck.jsx |
| Instancing module (`createMonsterTruckInstances(count, place)`, one draw call per material) | https://codels.download/m/monster-truck.instanced.js |
| Standalone HTML demo | https://codels.download/m/monster-truck.html |
| glTF binary | https://codels.download/m/monster-truck.glb |
| glTF binary, Meshopt-compressed (2–3× smaller; GLTFLoader needs `setMeshoptDecoder(MeshoptDecoder)`) | https://codels.download/m/monster-truck.glb?compress=meshopt |
| glTF JSON | https://codels.download/m/monster-truck.gltf |
| OBJ (vertex colors) + MTL | https://codels.download/m/monster-truck.obj · https://codels.download/m/monster-truck.mtl |
| STL | https://codels.download/m/monster-truck.stl |
| CodelSpec JSON | https://codels.download/m/monster-truck.json |

## Parameters

Append them as query parameters to any URL above to get a customized variant (e.g. `?bodyColor=...`).

| Param | Type | Range / options | Default | Current |
|---|---|---|---|---|
| `bodyColor` | color | #rrggbb | #2f6fd6 | #2f6fd6 |
| `accentColor` | color | #rrggbb | #f6c425 | #f6c425 |
| `flames` | boolean | true \| false | true | true |
| `lift` | number | 0 – 0.5 | 0.2 | 0.2 |

## Parts

- body (group)
  - lowerBody (extrude · paint)
  - cab (extrude · paint)
  - windshield (box · glass)
  - rearWindow (box · glass)
  - windowL (extrude · glass)
  - windowR (extrude · glass)
  - bed (extrude · paint)
  - lightBar (box · trim)
  - roofLight1 (circle · headlight)
  - roofLight2 (circle · headlight)
  - roofLight3 (circle · headlight)
  - roofLight4 (circle · headlight)
  - roofLight5 (circle · headlight)
  - grille (box · trim)
  - headlightL (box · headlight)
  - taillightL (box · taillight)
  - mirrorL (box · trim)
  - flamesL (extrude · flame)
  - headlightR (box · headlight)
  - taillightR (box · taillight)
  - mirrorR (box · trim)
  - flamesR (extrude · flame)
  - rearBumper (box · trim)
- suspension (group)
  - frameRailL (box · trim)
  - frameRailR (box · trim)
  - transmission (box · trim)
  - frontAxle (cylinder · metal)
  - frontDiff (sphere · metal)
  - rearAxle (cylinder · metal)
  - rearDiff (sphere · metal)
- wheels (group)
  - wheelFL (group)
    - tire (lathe · trim)
    - rim (cylinder · accent)
    - hub (cylinder · trim)
    - hubCap (cylinder · metal)
  - wheelFR (group)
    - tire (lathe · trim)

## How to use

Save the code below as `monster-truck.js`, then:

```js
import { createMonsterTruck } from './monster-truck.js';
const model = createMonsterTruck();
scene.add(model);
```

## Code

```js
/**
 * Monster Truck — Codels 3D model library (https://codels.download/models/monster-truck)
 * License: CC0-1.0 · Units: meters · Y-up · Front: +Z · Origin: center of the base (y = 0)
 * Triangles: 3,856 · Size (W × H × D): 3.10 × 3.47 × 4.87 m
 *
 * Usage:
 *   import { createMonsterTruck } from './monster-truck.js';
 *   
 *   const model = createMonsterTruck();
 *   model.position.set(0, 0, 0);
 *   scene.add(model);
 */
import * as THREE from 'three';

const deg = THREE.MathUtils.degToRad;

// Revolve a 2D profile [[radius, y], ...] around the Y axis.
function lathe(points, segments, phiStart = 0, phiLength = Math.PI * 2) {
  return new THREE.LatheGeometry(points.map(([x, y]) => new THREE.Vector2(x, y)), segments, phiStart, phiLength);
}

// Extrude a 2D outline along Z (centered). bevel = [thickness, size, segments].
function extrude(outline, depth, holes = [], bevel = null) {
  const shape = new THREE.Shape(outline.map(([x, y]) => new THREE.Vector2(x, y)));
  for (const hole of holes) shape.holes.push(new THREE.Path(hole.map(([x, y]) => new THREE.Vector2(x, y))));
  const options = bevel
    ? { depth, bevelEnabled: true, bevelThickness: bevel[0], bevelSize: bevel[1], bevelSegments: bevel[2] }
    : { depth, bevelEnabled: false };
  return new THREE.ExtrudeGeometry(shape, options).translate(0, 0, -depth / 2);
}

export function createMonsterTruck() {
  const root = new THREE.Group();
  root.name = 'MonsterTruck';

  // Materials
  const paintMat = new THREE.MeshStandardMaterial({ name: 'paint', color: 0x2f6fd6, roughness: 0.35, metalness: 0.2, flatShading: true });
  const accentMat = new THREE.MeshStandardMaterial({ name: 'accent', color: 0xf6c425, roughness: 0.4, metalness: 0.2, flatShading: true });
  const glassMat = new THREE.MeshStandardMaterial({ name: 'glass', color: 0x2a3644, roughness: 0.2, metalness: 0.3, flatShading: true });
  const trimMat = new THREE.MeshStandardMaterial({ name: 'trim', color: 0x222327, roughness: 0.85, flatShading: true });
  const metalMat = new THREE.MeshStandardMaterial({ name: 'metal', color: 0xa3a8ae, roughness: 0.35, metalness: 0.6, flatShading: true });
  const flameMat = new THREE.MeshStandardMaterial({ name: 'flame', color: 0xff6a1a, roughness: 0.45, flatShading: true });
  const headlightMat = new THREE.MeshStandardMaterial({ name: 'headlight', color: 0xfff4d6, roughness: 0.3, emissive: 0xffe2a0, emissiveIntensity: 0.9, flatShading: true });
  const taillightMat = new THREE.MeshStandardMaterial({ name: 'taillight', color: 0xd81e28, roughness: 0.3, emissive: 0xff2020, emissiveIntensity: 0.7, flatShading: true });

  // Shared geometries
  const extrudeGeo = extrude([[0.6516, 0.8], [0.4194, 1.14], [-0.34, 1.14], [-0.34, 0.8]], 0.02);
  const cylinderGeo = new THREE.CylinderGeometry(0.07, 0.07, 0.1, 8);
  const circleGeo = new THREE.CircleGeometry(0.06, 8);
  const boxGeo = new THREE.BoxGeometry(1.2, 0.03, 0.02);
  const boxGeo2 = new THREE.BoxGeometry(0.3, 0.16, 0.05);
  const boxGeo3 = new THREE.BoxGeometry(0.1, 0.26, 0.05);
  const boxGeo4 = new THREE.BoxGeometry(0.12, 0.1, 0.12);
  const boxGeo5 = new THREE.BoxGeometry(0.006, 0.5, 0.014);
  const boxGeo6 = new THREE.BoxGeometry(0.02, 0.03, 0.13);
  const boxGeo7 = new THREE.BoxGeometry(0.1, 0.16, 4.5);
  const boxGeo8 = new THREE.BoxGeometry(1.1, 0.1, 0.1);
  const cylinderGeo2 = new THREE.CylinderGeometry(0.08, 0.08, 2, 8);
  const sphereGeo = new THREE.SphereGeometry(0.22, 8, 6);
  const cylinderGeo3 = new THREE.CylinderGeometry(0.04, 0.04, 1.3068, 6);
  const cylinderGeo4 = new THREE.CylinderGeometry(0.035, 0.035, 1.0452, 6);
  const cylinderGeo5 = new THREE.CylinderGeometry(0.025, 0.025, 1.0179, 6);
  const cylinderGeo6 = new THREE.CylinderGeometry(0.075, 0.075, 0.6311, 8);
  const cylinderGeo7 = new THREE.CylinderGeometry(0.05, 0.05, 0.1222, 6);
  const latheGeo = lathe([[0.416, -0.32], [0.416, -0.37], [0.737, -0.37], [0.8, -0.28], [0.8, 0.28], [0.737, 0.37], [0.416, 0.37], [0.416, 0.32]], 14, 0.2244, Math.PI * 2);
  const cylinderGeo8 = new THREE.CylinderGeometry(0.416, 0.416, 0.64, 14);
  const cylinderGeo9 = new THREE.CylinderGeometry(0.1747, 0.208, 0.05, 8);
  const cylinderGeo10 = new THREE.CylinderGeometry(0.0832, 0.1082, 0.04, 6);
  const boxGeo9 = new THREE.BoxGeometry(0.37, 0.078, 0.1795);

  // Parts
  const body = new THREE.Group();
  body.name = 'body';
  body.position.set(0, 2, 0);
  root.add(body);
  const lowerBody = new THREE.Mesh(extrude([[2.3, 0], [2.38, 0.14], [2.38, 0.5], [2.22, 0.62], [0.95, 0.68], [-0.5, 0.68], [-0.52, 0.36], [-2.32, 0.36], [-2.36, 0.1], [-2.28, 0]], 1.82, [], [0.04, 0.04, 2]), paintMat);
  lowerBody.name = 'lowerBody';
  lowerBody.rotation.set(0, deg(-90), 0);
  body.add(lowerBody);
  const cab = new THREE.Mesh(extrude([[0.9, 0.6], [0.44, 1.22], [-0.42, 1.22], [-0.48, 0.6]], 1.62, [], [0.05, 0.05, 2]), paintMat);
  cab.name = 'cab';
  cab.rotation.set(0, deg(-90), 0);
  body.add(cab);
  const windshield = new THREE.Mesh(new THREE.BoxGeometry(1.5, 0.02, 0.4732), glassMat);
  windshield.name = 'windshield';
  windshield.position.set(0, 1.0081, 0.6769);
  windshield.rotation.set(deg(-126.573), 0, 0);
  body.add(windshield);
  const rearWindow = new THREE.Mesh(new THREE.BoxGeometry(1.5, 0.34, 0.02), glassMat);
  rearWindow.name = 'rearWindow';
  rearWindow.position.set(0, 0.98, -0.54);
  body.add(rearWindow);
  const windowL = new THREE.Mesh(extrudeGeo, glassMat);
  windowL.name = 'windowL';
  windowL.position.set(0.865, 0, 0);
  windowL.rotation.set(0, deg(-90), 0);
  body.add(windowL);
  const windowR = new THREE.Mesh(extrudeGeo, glassMat);
  windowR.name = 'windowR';
  windowR.position.set(-0.865, 0, 0);
  windowR.rotation.set(0, deg(-90), 0);
  body.add(windowR);
  const bed = new THREE.Mesh(extrude([[-0.91, -2.3], [0.91, -2.3], [0.91, -0.58], [-0.91, -0.58]], 0.34, [[[-0.84, -2.23], [0.84, -2.23], [0.84, -0.65], [-0.84, -0.65]]]), paintMat);
  bed.name = 'bed';
  bed.position.set(0, 0.53, 0);
  bed.rotation.set(deg(90), 0, 0);
  body.add(bed);
  const lightBar = new THREE.Mesh(new THREE.BoxGeometry(1.3, 0.06, 0.12), trimMat);
  lightBar.name = 'lightBar';
  lightBar.position.set(0, 1.3, 0.22);
  body.add(lightBar);
  const cylinder10 = new THREE.Mesh(cylinderGeo, trimMat);
  cylinder10.position.set(-0.52, 1.4, 0.24);
  cylinder10.rotation.set(deg(90), 0, 0);
  body.add(cylinder10);
  const roofLight1 = new THREE.Mesh(circleGeo, headlightMat);
  roofLight1.name = 'roofLight1';
  roofLight1.position.set(-0.52, 1.4, 0.292);
  body.add(roofLight1);
  const cylinder12 = new THREE.Mesh(cylinderGeo, trimMat);
  cylinder12.position.set(-0.26, 1.4, 0.24);
  cylinder12.rotation.set(deg(90), 0, 0);
  body.add(cylinder12);
  const roofLight2 = new THREE.Mesh(circleGeo, headlightMat);
  roofLight2.name = 'roofLight2';
  roofLight2.position.set(-0.26, 1.4, 0.292);
  body.add(roofLight2);
  const cylinder14 = new THREE.Mesh(cylinderGeo, trimMat);
  cylinder14.position.set(0, 1.4, 0.24);
  cylinder14.rotation.set(deg(90), 0, 0);
  body.add(cylinder14);
  const roofLight3 = new THREE.Mesh(circleGeo, headlightMat);
  roofLight3.name = 'roofLight3';
  roofLight3.position.set(0, 1.4, 0.292);
  body.add(roofLight3);
  const cylinder16 = new THREE.Mesh(cylinderGeo, trimMat);
  cylinder16.position.set(0.26, 1.4, 0.24);
  cylinder16.rotation.set(deg(90), 0, 0);
  body.add(cylinder16);
  const roofLight4 = new THREE.Mesh(circleGeo, headlightMat);
  roofLight4.name = 'roofLight4';
  roofLight4.position.set(0.26, 1.4, 0.292);
  body.add(roofLight4);
  const cylinder18 = new THREE.Mesh(cylinderGeo, trimMat);
  cylinder18.position.set(0.52, 1.4, 0.24);
  cylinder18.rotation.set(deg(90), 0, 0);
  body.add(cylinder18);
  const roofLight5 = new THREE.Mesh(circleGeo, headlightMat);
  roofLight5.name = 'roofLight5';
  roofLight5.position.set(0.52, 1.4, 0.292);
  body.add(roofLight5);
  const grille = new THREE.Mesh(new THREE.BoxGeometry(1.3, 0.24, 0.04), trimMat);
  grille.name = 'grille';
  grille.position.set(0, 0.34, 2.42);
  body.add(grille);
  const box21 = new THREE.Mesh(boxGeo, metalMat);
  box21.position.set(0, 0.27, 2.445);
  body.add(box21);
  const box22 = new THREE.Mesh(boxGeo, metalMat);
  box22.position.set(0, 0.34, 2.445);
  body.add(box22);
  const box23 = new THREE.Mesh(boxGeo, metalMat);
  box23.position.set(0, 0.41, 2.445);
  body.add(box23);
  const headlightL = new THREE.Mesh(boxGeo2, headlightMat);
  headlightL.name = 'headlightL';
  headlightL.position.set(0.74, 0.36, 2.41);
  body.add(headlightL);
  const taillightL = new THREE.Mesh(boxGeo3, taillightMat);
  taillightL.name = 'taillightL';
  taillightL.position.set(0.82, 0.5, -2.31);
  body.add(taillightL);
  const mirrorL = new THREE.Mesh(boxGeo4, trimMat);
  mirrorL.name = 'mirrorL';
  mirrorL.position.set(0.93, 0.82, 0.66);
  body.add(mirrorL);
  const box27 = new THREE.Mesh(boxGeo5, trimMat);
  box27.position.set(0.953, 0.38, -0.45);
  body.add(box27);
  const box28 = new THREE.Mesh(boxGeo6, trimMat);
  box28.position.set(0.96, 0.56, -0.25);
  body.add(box28);
  const flamesL = new THREE.Mesh(extrude([[0, 0.06], [0, 0.34], [0.75, 0.42], [0.5, 0.3], [1.1, 0.3], [0.75, 0.2], [1.35, 0.16], [0.8, 0.1], [1, 0], [0.3, 0.02]], 0.01), flameMat);
  flamesL.name = 'flamesL';
  flamesL.position.set(0.956, 0.08, 2.25);
  flamesL.rotation.set(0, deg(90), 0);
  body.add(flamesL);
  const extrude30 = new THREE.Mesh(extrude([[0, 0.12], [0, 0.26], [0.45, 0.3], [0.3, 0.22], [0.7, 0.2], [0.35, 0.12], [0.55, 0.06]], 0.01), accentMat);
  extrude30.position.set(0.962, 0.08, 2.25);
  extrude30.rotation.set(0, deg(90), 0);
  body.add(extrude30);
  const headlightR = new THREE.Mesh(boxGeo2, headlightMat);
  headlightR.name = 'headlightR';
  headlightR.position.set(-0.74, 0.36, 2.41);
  body.add(headlightR);
  const taillightR = new THREE.Mesh(boxGeo3, taillightMat);
  taillightR.name = 'taillightR';
  taillightR.position.set(-0.82, 0.5, -2.31);
  body.add(taillightR);
  const mirrorR = new THREE.Mesh(boxGeo4, trimMat);
  mirrorR.name = 'mirrorR';
  mirrorR.position.set(-0.93, 0.82, 0.66);
  body.add(mirrorR);
  const box34 = new THREE.Mesh(boxGeo5, trimMat);
  box34.position.set(-0.953, 0.38, -0.45);
  body.add(box34);
  const box35 = new THREE.Mesh(boxGeo6, trimMat);
  box35.position.set(-0.96, 0.56, -0.25);
  body.add(box35);
  const flamesR = new THREE.Mesh(extrude([[0, 0.06], [0, 0.34], [-0.75, 0.42], [-0.5, 0.3], [-1.1, 0.3], [-0.75, 0.2], [-1.35, 0.16], [-0.8, 0.1], [-1, 0], [-0.3, 0.02]], 0.01), flameMat);
  flamesR.name = 'flamesR';
  flamesR.position.set(-0.956, 0.08, 2.25);
  flamesR.rotation.set(0, deg(-90), 0);
  body.add(flamesR);
  const extrude37 = new THREE.Mesh(extrude([[0, 0.12], [0, 0.26], [-0.45, 0.3], [-0.3, 0.22], [-0.7, 0.2], [-0.35, 0.12], [-0.55, 0.06]], 0.01), accentMat);
  extrude37.position.set(-0.962, 0.08, 2.25);
  extrude37.rotation.set(0, deg(-90), 0);
  body.add(extrude37);
  const rearBumper = new THREE.Mesh(new THREE.BoxGeometry(1.7, 0.1, 0.12), trimMat);
  rearBumper.name = 'rearBumper';
  rearBumper.position.set(0, 0.08, -2.34);
  body.add(rearBumper);
  const suspension = new THREE.Group();
  suspension.name = 'suspension';
  root.add(suspension);
  const frameRailL = new THREE.Mesh(boxGeo7, trimMat);
  frameRailL.name = 'frameRailL';
  frameRailL.position.set(0.5, 1.88, 0);
  suspension.add(frameRailL);
  const frameRailR = new THREE.Mesh(boxGeo7, trimMat);
  frameRailR.name = 'frameRailR';
  frameRailR.position.set(-0.5, 1.88, 0);
  suspension.add(frameRailR);
  const box42 = new THREE.Mesh(boxGeo8, trimMat);
  box42.position.set(0, 1.88, 2.1);
  suspension.add(box42);
  const box43 = new THREE.Mesh(boxGeo8, trimMat);
  box43.position.set(0, 1.88, 2);
  suspension.add(box43);
  const box44 = new THREE.Mesh(boxGeo8, trimMat);
  box44.position.set(0, 1.88, 0);
  suspension.add(box44);
  const box45 = new THREE.Mesh(boxGeo8, trimMat);
  box45.position.set(0, 1.88, -2);
  suspension.add(box45);
  const box46 = new THREE.Mesh(boxGeo8, trimMat);
  box46.position.set(0, 1.88, -2.1);
  suspension.add(box46);
  const transmission = new THREE.Mesh(new THREE.BoxGeometry(0.5, 0.4, 1.1), trimMat);
  transmission.name = 'transmission';
  transmission.position.set(0, 1.73, 0.55);
  suspension.add(transmission);
  const frontAxle = new THREE.Mesh(cylinderGeo2, metalMat);
  frontAxle.name = 'frontAxle';
  frontAxle.position.set(0, 0.87, 1.55);
  frontAxle.rotation.set(0, 0, deg(90));
  suspension.add(frontAxle);
  const frontDiff = new THREE.Mesh(sphereGeo, metalMat);
  frontDiff.name = 'frontDiff';
  frontDiff.position.set(0.18, 0.87, 1.55);
  suspension.add(frontDiff);
  const cylinder50 = new THREE.Mesh(new THREE.CylinderGeometry(0.045, 0.045, 0.8346, 6), metalMat);
  cylinder50.position.set(0.09, 1.275, 1.15);
  cylinder50.rotation.set(deg(-28.6881), deg(-3.2019), deg(12.4753));
  suspension.add(cylinder50);
  const cylinder51 = new THREE.Mesh(cylinderGeo3, trimMat);
  cylinder51.position.set(0.435, 1.285, 1.1238);
  cylinder51.rotation.set(deg(-40.7209), deg(0.4882), deg(-1.3155));
  suspension.add(cylinder51);
  const cylinder52 = new THREE.Mesh(cylinderGeo4, trimMat);
  cylinder52.position.set(0.275, 1.41, 1.24);
  cylinder52.rotation.set(deg(-36.3877), deg(0.9014), deg(-2.7422));
  suspension.add(cylinder52);
  const cylinder53 = new THREE.Mesh(cylinderGeo5, metalMat);
  cylinder53.position.set(0.6, 1.415, 1.922);
  cylinder53.rotation.set(deg(15.0347), deg(1.1961), deg(9.0453));
  suspension.add(cylinder53);
  const cylinder54 = new THREE.Mesh(cylinderGeo6, accentMat);
  cylinder54.position.set(0.5824, 1.5217, 1.951);
  cylinder54.rotation.set(deg(15.0347), deg(1.1961), deg(9.0453));
  suspension.add(cylinder54);
  const cylinder55 = new THREE.Mesh(cylinderGeo7, trimMat);
  cylinder55.position.set(0.5296, 1.8418, 2.0382);
  cylinder55.rotation.set(deg(15.0347), deg(1.1961), deg(9.0453));
  suspension.add(cylinder55);
  const cylinder56 = new THREE.Mesh(cylinderGeo5, metalMat);
  cylinder56.position.set(0.6, 1.415, 1.178);
  cylinder56.rotation.set(deg(-15.0347), deg(-1.1961), deg(9.0453));
  suspension.add(cylinder56);
  const cylinder57 = new THREE.Mesh(cylinderGeo6, accentMat);
  cylinder57.position.set(0.5824, 1.5217, 1.149);
  cylinder57.rotation.set(deg(-15.0347), deg(-1.1961), deg(9.0453));
  suspension.add(cylinder57);
  const cylinder58 = new THREE.Mesh(cylinderGeo7, trimMat);
  cylinder58.position.set(0.5296, 1.8418, 1.0618);
  cylinder58.rotation.set(deg(-15.0347), deg(-1.1961), deg(9.0453));
  suspension.add(cylinder58);
  const cylinder59 = new THREE.Mesh(cylinderGeo3, trimMat);
  cylinder59.position.set(-0.435, 1.285, 1.1238);
  cylinder59.rotation.set(deg(-40.7209), deg(-0.4882), deg(1.3155));
  suspension.add(cylinder59);
  const cylinder60 = new THREE.Mesh(cylinderGeo4, trimMat);
  cylinder60.position.set(-0.275, 1.41, 1.24);
  cylinder60.rotation.set(deg(-36.3877), deg(-0.9014), deg(2.7422));
  suspension.add(cylinder60);
  const cylinder61 = new THREE.Mesh(cylinderGeo5, metalMat);
  cylinder61.position.set(-0.6, 1.415, 1.922);
  cylinder61.rotation.set(deg(15.0347), deg(-1.1961), deg(-9.0453));
  suspension.add(cylinder61);
  const cylinder62 = new THREE.Mesh(cylinderGeo6, accentMat);
  cylinder62.position.set(-0.5824, 1.5217, 1.951);
  cylinder62.rotation.set(deg(15.0347), deg(-1.1961), deg(-9.0453));
  suspension.add(cylinder62);
  const cylinder63 = new THREE.Mesh(cylinderGeo7, trimMat);
  cylinder63.position.set(-0.5296, 1.8418, 2.0382);
  cylinder63.rotation.set(deg(15.0347), deg(-1.1961), deg(-9.0453));
  suspension.add(cylinder63);
  const cylinder64 = new THREE.Mesh(cylinderGeo5, metalMat);
  cylinder64.position.set(-0.6, 1.415, 1.178);
  cylinder64.rotation.set(deg(-15.0347), deg(1.1961), deg(-9.0453));
  suspension.add(cylinder64);
  const cylinder65 = new THREE.Mesh(cylinderGeo6, accentMat);
  cylinder65.position.set(-0.5824, 1.5217, 1.149);
  cylinder65.rotation.set(deg(-15.0347), deg(1.1961), deg(-9.0453));
  suspension.add(cylinder65);
  const cylinder66 = new THREE.Mesh(cylinderGeo7, trimMat);
  cylinder66.position.set(-0.5296, 1.8418, 1.0618);
  cylinder66.rotation.set(deg(-15.0347), deg(1.1961), deg(-9.0453));
  suspension.add(cylinder66);
  const rearAxle = new THREE.Mesh(cylinderGeo2, metalMat);
  rearAxle.name = 'rearAxle';
  rearAxle.position.set(0, 0.87, -1.55);
  rearAxle.rotation.set(0, 0, deg(90));
  suspension.add(rearAxle);
  const rearDiff = new THREE.Mesh(sphereGeo, metalMat);
  rearDiff.name = 'rearDiff';
  rearDiff.position.set(0.18, 0.87, -1.55);
  suspension.add(rearDiff);
  const cylinder69 = new THREE.Mesh(new THREE.CylinderGeometry(0.045, 0.045, 1.1996, 6), metalMat);
  cylinder69.position.set(0.09, 1.275, -0.875);
  cylinder69.rotation.set(deg(52.5758), deg(4.2811), deg(8.6543));
  suspension.add(cylinder69);
  const cylinder70 = new THREE.Mesh(cylinderGeo3, trimMat);
  cylinder70.position.set(0.435, 1.285, -1.1237);
  cylinder70.rotation.set(deg(40.7209), deg(-0.4882), deg(-1.3155));
  suspension.add(cylinder70);
  const cylinder71 = new THREE.Mesh(cylinderGeo4, trimMat);
  cylinder71.position.set(0.275, 1.41, -1.24);
  cylinder71.rotation.set(deg(36.3877), deg(-0.9014), deg(-2.7422));
  suspension.add(cylinder71);
  const cylinder72 = new THREE.Mesh(cylinderGeo5, metalMat);
  cylinder72.position.set(0.6, 1.415, -1.178);
  cylinder72.rotation.set(deg(15.0347), deg(1.1961), deg(9.0453));
  suspension.add(cylinder72);
  const cylinder73 = new THREE.Mesh(cylinderGeo6, accentMat);
  cylinder73.position.set(0.5824, 1.5217, -1.149);
  cylinder73.rotation.set(deg(15.0347), deg(1.1961), deg(9.0453));
  suspension.add(cylinder73);
  const cylinder74 = new THREE.Mesh(cylinderGeo7, trimMat);
  cylinder74.position.set(0.5296, 1.8418, -1.0618);
  cylinder74.rotation.set(deg(15.0347), deg(1.1961), deg(9.0453));
  suspension.add(cylinder74);
  const cylinder75 = new THREE.Mesh(cylinderGeo5, metalMat);
  cylinder75.position.set(0.6, 1.415, -1.922);
  cylinder75.rotation.set(deg(-15.0347), deg(-1.1961), deg(9.0453));
  suspension.add(cylinder75);
  const cylinder76 = new THREE.Mesh(cylinderGeo6, accentMat);
  cylinder76.position.set(0.5824, 1.5217, -1.951);
  cylinder76.rotation.set(deg(-15.0347), deg(-1.1961), deg(9.0453));
  suspension.add(cylinder76);
  const cylinder77 = new THREE.Mesh(cylinderGeo7, trimMat);
  cylinder77.position.set(0.5296, 1.8418, -2.0382);
  cylinder77.rotation.set(deg(-15.0347), deg(-1.1961), deg(9.0453));
  suspension.add(cylinder77);
  const cylinder78 = new THREE.Mesh(cylinderGeo3, trimMat);
  cylinder78.position.set(-0.435, 1.285, -1.1237);
  cylinder78.rotation.set(deg(40.7209), deg(0.4882), deg(1.3155));
  suspension.add(cylinder78);
  const cylinder79 = new THREE.Mesh(cylinderGeo4, trimMat);
  cylinder79.position.set(-0.275, 1.41, -1.24);
  cylinder79.rotation.set(deg(36.3877), deg(0.9014), deg(2.7422));
  suspension.add(cylinder79);
  const cylinder80 = new THREE.Mesh(cylinderGeo5, metalMat);
  cylinder80.position.set(-0.6, 1.415, -1.178);
  cylinder80.rotation.set(deg(15.0347), deg(-1.1961), deg(-9.0453));
  suspension.add(cylinder80);
  const cylinder81 = new THREE.Mesh(cylinderGeo6, accentMat);
  cylinder81.position.set(-0.5824, 1.5217, -1.149);
  cylinder81.rotation.set(deg(15.0347), deg(-1.1961), deg(-9.0453));
  suspension.add(cylinder81);
  const cylinder82 = new THREE.Mesh(cylinderGeo7, trimMat);
  cylinder82.position.set(-0.5296, 1.8418, -1.0618);
  cylinder82.rotation.set(deg(15.0347), deg(-1.1961), deg(-9.0453));
  suspension.add(cylinder82);
  const cylinder83 = new THREE.Mesh(cylinderGeo5, metalMat);
  cylinder83.position.set(-0.6, 1.415, -1.922);
  cylinder83.rotation.set(deg(-15.0347), deg(1.1961), deg(-9.0453));
  suspension.add(cylinder83);
  const cylinder84 = new THREE.Mesh(cylinderGeo6, accentMat);
  cylinder84.position.set(-0.5824, 1.5217, -1.951);
  cylinder84.rotation.set(deg(-15.0347), deg(1.1961), deg(-9.0453));
  suspension.add(cylinder84);
  const cylinder85 = new THREE.Mesh(cylinderGeo7, trimMat);
  cylinder85.position.set(-0.5296, 1.8418, -2.0382);
  cylinder85.rotation.set(deg(-15.0347), deg(1.1961), deg(-9.0453));
  suspension.add(cylinder85);
  const wheels = new THREE.Group();
  wheels.name = 'wheels';
  root.add(wheels);
  const wheelFL = new THREE.Group();
  wheelFL.name = 'wheelFL';
  wheelFL.position.set(1.15, 0.87, 1.55);
  wheels.add(wheelFL);
  const tire = new THREE.Mesh(latheGeo, trimMat);
  tire.name = 'tire';
  tire.rotation.set(0, 0, deg(90));
  wheelFL.add(tire);
  const rim = new THREE.Mesh(cylinderGeo8, accentMat);
  rim.name = 'rim';
  rim.rotation.set(0, 0, deg(90));
  wheelFL.add(rim);
  const hub = new THREE.Mesh(cylinderGeo9, trimMat);
  hub.name = 'hub';
  hub.position.set(0.34, 0, 0);
  hub.rotation.set(0, 0, deg(-90));
  wheelFL.add(hub);
  const hubCap = new THREE.Mesh(cylinderGeo10, metalMat);
  hubCap.name = 'hubCap';
  hubCap.position.set(0.38, 0, 0);
  hubCap.rotation.set(0, 0, deg(-90));
  wheelFL.add(hubCap);
  const box92 = new THREE.Mesh(boxGeo9, trimMat);
  box92.position.set(0.175, -0.831, 0);
  box92.rotation.set(0, 0, deg(180));
  wheelFL.add(box92);
  const box93 = new THREE.Mesh(boxGeo9, trimMat);
  box93.position.set(-0.175, -0.7487, 0.3606);
  box93.rotation.set(deg(154.2857), 0, 0);
  wheelFL.add(box93);
  const box94 = new THREE.Mesh(boxGeo9, trimMat);
  box94.position.set(0.175, -0.5181, 0.6497);
  box94.rotation.set(deg(128.5714), 0, 0);
  wheelFL.add(box94);
  const box95 = new THREE.Mesh(boxGeo9, trimMat);
  box95.position.set(-0.175, -0.1849, 0.8102);
  box95.rotation.set(deg(102.8571), 0, 0);
  wheelFL.add(box95);
  const box96 = new THREE.Mesh(boxGeo9, trimMat);
  box96.position.set(0.175, 0.1849, 0.8102);
  box96.rotation.set(deg(77.1429), 0, 0);
  wheelFL.add(box96);
  const box97 = new THREE.Mesh(boxGeo9, trimMat);
  box97.position.set(-0.175, 0.5181, 0.6497);
  box97.rotation.set(deg(51.4286), 0, 0);
  wheelFL.add(box97);
  const box98 = new THREE.Mesh(boxGeo9, trimMat);
  box98.position.set(0.175, 0.7487, 0.3606);
  box98.rotation.set(deg(25.7143), 0, 0);
  wheelFL.add(box98);
  const box99 = new THREE.Mesh(boxGeo9, trimMat);
  box99.position.set(-0.175, 0.831, 0);
  wheelFL.add(box99);
  const box100 = new THREE.Mesh(boxGeo9, trimMat);
  box100.position.set(0.175, 0.7487, -0.3606);
  box100.rotation.set(deg(-25.7143), 0, 0);
  wheelFL.add(box100);
  const box101 = new THREE.Mesh(boxGeo9, trimMat);
  box101.position.set(-0.175, 0.5181, -0.6497);
  box101.rotation.set(deg(-51.4286), 0, 0);
  wheelFL.add(box101);
  const box102 = new THREE.Mesh(boxGeo9, trimMat);
  box102.position.set(0.175, 0.1849, -0.8102);
  box102.rotation.set(deg(-77.1429), 0, 0);
  wheelFL.add(box102);
  const box103 = new THREE.Mesh(boxGeo9, trimMat);
  box103.position.set(-0.175, -0.1849, -0.8102);
  box103.rotation.set(deg(-102.8571), 0, 0);
  wheelFL.add(box103);
  const box104 = new THREE.Mesh(boxGeo9, trimMat);
  box104.position.set(0.175, -0.5181, -0.6497);
  box104.rotation.set(deg(-128.5714), 0, 0);
  wheelFL.add(box104);
  const box105 = new THREE.Mesh(boxGeo9, trimMat);
  box105.position.set(-0.175, -0.7487, -0.3606);
  box105.rotation.set(deg(-154.2857), 0, 0);
  wheelFL.add(box105);
  const wheelFR = new THREE.Group();
  wheelFR.name = 'wheelFR';
  wheelFR.position.set(-1.15, 0.87, 1.55);
  wheels.add(wheelFR);
  const tire2 = new THREE.Mesh(latheGeo, trimMat);
  tire2.name = 'tire';
  tire2.rotation.set(0, 0, deg(90));
  wheelFR.add(tire2);
  const rim2 = new THREE.Mesh(cylinderGeo8, accentMat);
  rim2.name = 'rim';
  rim2.rotation.set(0, 0, deg(90));
  wheelFR.add(rim2);
  const hub2 = new THREE.Mesh(cylinderGeo9, trimMat);
  hub2.name = 'hub';
  hub2.position.set(-0.34, 0, 0);
  hub2.rotation.set(0, 0, deg(90));
  wheelFR.add(hub2);
  const hubCap2 = new THREE.Mesh(cylinderGeo10, metalMat);
  hubCap2.name = 'hubCap';
  hubCap2.position.set(-0.38, 0, 0);
  hubCap2.rotation.set(0, 0, deg(90));
  wheelFR.add(hubCap2);
  const box111 = new THREE.Mesh(boxGeo9, trimMat);
  box111.position.set(0.175, -0.831, 0);
  box111.rotation.set(0, 0, deg(180));
  wheelFR.add(box111);
  const box112 = new THREE.Mesh(boxGeo9, trimMat);
  box112.position.set(-0.175, -0.7487, 0.3606);
  box112.rotation.set(deg(154.2857), 0, 0);
  wheelFR.add(box112);
  const box113 = new THREE.Mesh(boxGeo9, trimMat);
  box113.position.set(0.175, -0.5181, 0.6497);
  box113.rotation.set(deg(128.5714), 0, 0);
  wheelFR.add(box113);
  const box114 = new THREE.Mesh(boxGeo9, trimMat);
  box114.position.set(-0.175, -0.1849, 0.8102);
  box114.rotation.set(deg(102.8571), 0, 0);
  wheelFR.add(box114);
  const box115 = new THREE.Mesh(boxGeo9, trimMat);
  box115.position.set(0.175, 0.1849, 0.8102);
  box115.rotation.set(deg(77.1429), 0, 0);
  wheelFR.add(box115);
  const box116 = new THREE.Mesh(boxGeo9, trimMat);
  box116.position.set(-0.175, 0.5181, 0.6497);
  box116.rotation.set(deg(51.4286), 0, 0);
  wheelFR.add(box116);
  const box117 = new THREE.Mesh(boxGeo9, trimMat);
  box117.position.set(0.175, 0.7487, 0.3606);
  box117.rotation.set(deg(25.7143), 0, 0);
  wheelFR.add(box117);
  const box118 = new THREE.Mesh(boxGeo9, trimMat);
  box118.position.set(-0.175, 0.831, 0);
  wheelFR.add(box118);
  const box119 = new THREE.Mesh(boxGeo9, trimMat);
  box119.position.set(0.175, 0.7487, -0.3606);
  box119.rotation.set(deg(-25.7143), 0, 0);
  wheelFR.add(box119);
  const box120 = new THREE.Mesh(boxGeo9, trimMat);
  box120.position.set(-0.175, 0.5181, -0.6497);
  box120.rotation.set(deg(-51.4286), 0, 0);
  wheelFR.add(box120);
  const box121 = new THREE.Mesh(boxGeo9, trimMat);
  box121.position.set(0.175, 0.1849, -0.8102);
  box121.rotation.set(deg(-77.1429), 0, 0);
  wheelFR.add(box121);
  const box122 = new THREE.Mesh(boxGeo9, trimMat);
  box122.position.set(-0.175, -0.1849, -0.8102);
  box122.rotation.set(deg(-102.8571), 0, 0);
  wheelFR.add(box122);
  const box123 = new THREE.Mesh(boxGeo9, trimMat);
  box123.position.set(0.175, -0.5181, -0.6497);
  box123.rotation.set(deg(-128.5714), 0, 0);
  wheelFR.add(box123);
  const box124 = new THREE.Mesh(boxGeo9, trimMat);
  box124.position.set(-0.175, -0.7487, -0.3606);
  box124.rotation.set(deg(-154.2857), 0, 0);
  wheelFR.add(box124);
  const wheelRL = new THREE.Group();
  wheelRL.name = 'wheelRL';
  wheelRL.position.set(1.15, 0.87, -1.55);
  wheels.add(wheelRL);
  const tire3 = new THREE.Mesh(latheGeo, trimMat);
  tire3.name = 'tire';
  tire3.rotation.set(0, 0, deg(90));
  wheelRL.add(tire3);
  const rim3 = new THREE.Mesh(cylinderGeo8, accentMat);
  rim3.name = 'rim';
  rim3.rotation.set(0, 0, deg(90));
  wheelRL.add(rim3);
  const hub3 = new THREE.Mesh(cylinderGeo9, trimMat);
  hub3.name = 'hub';
  hub3.position.set(0.34, 0, 0);
  hub3.rotation.set(0, 0, deg(-90));
  wheelRL.add(hub3);
  const hubCap3 = new THREE.Mesh(cylinderGeo10, metalMat);
  hubCap3.name = 'hubCap';
  hubCap3.position.set(0.38, 0, 0);
  hubCap3.rotation.set(0, 0, deg(-90));
  wheelRL.add(hubCap3);
  const box130 = new THREE.Mesh(boxGeo9, trimMat);
  box130.position.set(0.175, -0.831, 0);
  box130.rotation.set(0, 0, deg(180));
  wheelRL.add(box130);
  const box131 = new THREE.Mesh(boxGeo9, trimMat);
  box131.position.set(-0.175, -0.7487, 0.3606);
  box131.rotation.set(deg(154.2857), 0, 0);
  wheelRL.add(box131);
  const box132 = new THREE.Mesh(boxGeo9, trimMat);
  box132.position.set(0.175, -0.5181, 0.6497);
  box132.rotation.set(deg(128.5714), 0, 0);
  wheelRL.add(box132);
  const box133 = new THREE.Mesh(boxGeo9, trimMat);
  box133.position.set(-0.175, -0.1849, 0.8102);
  box133.rotation.set(deg(102.8571), 0, 0);
  wheelRL.add(box133);
  const box134 = new THREE.Mesh(boxGeo9, trimMat);
  box134.position.set(0.175, 0.1849, 0.8102);
  box134.rotation.set(deg(77.1429), 0, 0);
  wheelRL.add(box134);
  const box135 = new THREE.Mesh(boxGeo9, trimMat);
  box135.position.set(-0.175, 0.5181, 0.6497);
  box135.rotation.set(deg(51.4286), 0, 0);
  wheelRL.add(box135);
  const box136 = new THREE.Mesh(boxGeo9, trimMat);
  box136.position.set(0.175, 0.7487, 0.3606);
  box136.rotation.set(deg(25.7143), 0, 0);
  wheelRL.add(box136);
  const box137 = new THREE.Mesh(boxGeo9, trimMat);
  box137.position.set(-0.175, 0.831, 0);
  wheelRL.add(box137);
  const box138 = new THREE.Mesh(boxGeo9, trimMat);
  box138.position.set(0.175, 0.7487, -0.3606);
  box138.rotation.set(deg(-25.7143), 0, 0);
  wheelRL.add(box138);
  const box139 = new THREE.Mesh(boxGeo9, trimMat);
  box139.position.set(-0.175, 0.5181, -0.6497);
  box139.rotation.set(deg(-51.4286), 0, 0);
  wheelRL.add(box139);
  const box140 = new THREE.Mesh(boxGeo9, trimMat);
  box140.position.set(0.175, 0.1849, -0.8102);
  box140.rotation.set(deg(-77.1429), 0, 0);
  wheelRL.add(box140);
  const box141 = new THREE.Mesh(boxGeo9, trimMat);
  box141.position.set(-0.175, -0.1849, -0.8102);
  box141.rotation.set(deg(-102.8571), 0, 0);
  wheelRL.add(box141);
  const box142 = new THREE.Mesh(boxGeo9, trimMat);
  box142.position.set(0.175, -0.5181, -0.6497);
  box142.rotation.set(deg(-128.5714), 0, 0);
  wheelRL.add(box142);
  const box143 = new THREE.Mesh(boxGeo9, trimMat);
  box143.position.set(-0.175, -0.7487, -0.3606);
  box143.rotation.set(deg(-154.2857), 0, 0);
  wheelRL.add(box143);
  const wheelRR = new THREE.Group();
  wheelRR.name = 'wheelRR';
  wheelRR.position.set(-1.15, 0.87, -1.55);
  wheels.add(wheelRR);
  const tire4 = new THREE.Mesh(latheGeo, trimMat);
  tire4.name = 'tire';
  tire4.rotation.set(0, 0, deg(90));
  wheelRR.add(tire4);
  const rim4 = new THREE.Mesh(cylinderGeo8, accentMat);
  rim4.name = 'rim';
  rim4.rotation.set(0, 0, deg(90));
  wheelRR.add(rim4);
  const hub4 = new THREE.Mesh(cylinderGeo9, trimMat);
  hub4.name = 'hub';
  hub4.position.set(-0.34, 0, 0);
  hub4.rotation.set(0, 0, deg(90));
  wheelRR.add(hub4);
  const hubCap4 = new THREE.Mesh(cylinderGeo10, metalMat);
  hubCap4.name = 'hubCap';
  hubCap4.position.set(-0.38, 0, 0);
  hubCap4.rotation.set(0, 0, deg(90));
  wheelRR.add(hubCap4);
  const box149 = new THREE.Mesh(boxGeo9, trimMat);
  box149.position.set(0.175, -0.831, 0);
  box149.rotation.set(0, 0, deg(180));
  wheelRR.add(box149);
  const box150 = new THREE.Mesh(boxGeo9, trimMat);
  box150.position.set(-0.175, -0.7487, 0.3606);
  box150.rotation.set(deg(154.2857), 0, 0);
  wheelRR.add(box150);
  const box151 = new THREE.Mesh(boxGeo9, trimMat);
  box151.position.set(0.175, -0.5181, 0.6497);
  box151.rotation.set(deg(128.5714), 0, 0);
  wheelRR.add(box151);
  const box152 = new THREE.Mesh(boxGeo9, trimMat);
  box152.position.set(-0.175, -0.1849, 0.8102);
  box152.rotation.set(deg(102.8571), 0, 0);
  wheelRR.add(box152);
  const box153 = new THREE.Mesh(boxGeo9, trimMat);
  box153.position.set(0.175, 0.1849, 0.8102);
  box153.rotation.set(deg(77.1429), 0, 0);
  wheelRR.add(box153);
  const box154 = new THREE.Mesh(boxGeo9, trimMat);
  box154.position.set(-0.175, 0.5181, 0.6497);
  box154.rotation.set(deg(51.4286), 0, 0);
  wheelRR.add(box154);
  const box155 = new THREE.Mesh(boxGeo9, trimMat);
  box155.position.set(0.175, 0.7487, 0.3606);
  box155.rotation.set(deg(25.7143), 0, 0);
  wheelRR.add(box155);
  const box156 = new THREE.Mesh(boxGeo9, trimMat);
  box156.position.set(-0.175, 0.831, 0);
  wheelRR.add(box156);
  const box157 = new THREE.Mesh(boxGeo9, trimMat);
  box157.position.set(0.175, 0.7487, -0.3606);
  box157.rotation.set(deg(-25.7143), 0, 0);
  wheelRR.add(box157);
  const box158 = new THREE.Mesh(boxGeo9, trimMat);
  box158.position.set(-0.175, 0.5181, -0.6497);
  box158.rotation.set(deg(-51.4286), 0, 0);
  wheelRR.add(box158);
  const box159 = new THREE.Mesh(boxGeo9, trimMat);
  box159.position.set(0.175, 0.1849, -0.8102);
  box159.rotation.set(deg(-77.1429), 0, 0);
  wheelRR.add(box159);
  const box160 = new THREE.Mesh(boxGeo9, trimMat);
  box160.position.set(-0.175, -0.1849, -0.8102);
  box160.rotation.set(deg(-102.8571), 0, 0);
  wheelRR.add(box160);
  const box161 = new THREE.Mesh(boxGeo9, trimMat);
  box161.position.set(0.175, -0.5181, -0.6497);
  box161.rotation.set(deg(-128.5714), 0, 0);
  wheelRR.add(box161);
  const box162 = new THREE.Mesh(boxGeo9, trimMat);
  box162.position.set(-0.175, -0.7487, -0.3606);
  box162.rotation.set(deg(-154.2857), 0, 0);
  wheelRR.add(box162);

  root.traverse((o) => {
    if (o.isMesh) {
      o.castShadow = true;
      o.receiveShadow = true;
    }
  });
  return root;
}

export default createMonsterTruck;
```

---
Codels — 3D models as code for three.js. Search more: https://codels.download/api/v1/models?q=<query> · Guide: https://codels.download/llms.txt
