# Go-Kart

> A stylized racing go-kart: low tubular chassis, plastic nose cone, side pods and front panel, a bucket seat, small steering wheel and an exposed single-cylinder engine with cooling fins, air filter, exhaust and chain drive to the rear axle. The four wheels are separate groups (wheelFL, wheelFR, wheelRL, wheelRR) with axles along X. Pick fairing, frame and seat colors for kart racers, arcade tracks and party games.

![Go-Kart preview](https://codels.download/m/go-kart.png)

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

## Facts

- Category: Vehicles › Cars & Trucks
- Size (W × H × D): 1.44 × 0.54 × 1.88 m — units are meters, +Y up, front faces +Z
- Origin: center of the base (y = 0)
- Triangles: 2,864 · Meshes: 65 · Materials: 6
- License: CC0-1.0 (Codels built-in)
- Tags: car, go-kart, low-poly, stylized, modern, racing, sports, road, party-game, racing-game, vehicle, metal, plastic, game-ready, parametric, color-gray, color-red, size-medium, poly-medium
- Page: https://codels.download/models/go-kart

## Files

| Format | URL |
|---|---|
| three.js ES module (`createGoKart()`) | https://codels.download/m/go-kart.js |
| React Three Fiber component (`<GoKart />`) | https://codels.download/m/go-kart.jsx |
| Instancing module (`createGoKartInstances(count, place)`, one draw call per material) | https://codels.download/m/go-kart.instanced.js |
| Standalone HTML demo | https://codels.download/m/go-kart.html |
| glTF binary | https://codels.download/m/go-kart.glb |
| glTF binary, Meshopt-compressed (2–3× smaller; GLTFLoader needs `setMeshoptDecoder(MeshoptDecoder)`) | https://codels.download/m/go-kart.glb?compress=meshopt |
| glTF JSON | https://codels.download/m/go-kart.gltf |
| OBJ (vertex colors) + MTL | https://codels.download/m/go-kart.obj · https://codels.download/m/go-kart.mtl |
| STL | https://codels.download/m/go-kart.stl |
| CodelSpec JSON | https://codels.download/m/go-kart.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 | #e9452f | #e9452f |
| `frameColor` | color | #rrggbb | #c9ced6 | #c9ced6 |
| `seatColor` | color | #rrggbb | #26282c | #26282c |

## Parts

- body (group)
  - railL (tube · frame)
  - railR (tube · frame)
  - floorTray (box · trim)
  - rearAxle (cylinder · metal)
  - rearBumper (tube · frame)
  - noseCone (extrude · body)
  - noseStripe (box · white)
  - frontPanel (box · body)
  - numberPlate (box · white)
  - sidePodL (extrude · body)
  - sidePodR (extrude · body)
  - seat (group)
    - seatShell (extrude · seat)
  - steeringColumn (cylinder · frame)
  - steeringWheel (torus · trim)
  - fuelTank (cylinder · white)
  - engine (group)
    - crankcase (box · metal)
    - cylinderHead (box · trim)
    - carburetor (cylinder · trim)
    - airFilter (cylinder · trim)
    - clutch (cylinder · trim)
    - exhaustPipe (tube · metal)
    - muffler (cylinder · trim)
  - sprocket (cylinder · metal)
  - chain (tube · trim)
- wheels (group)
  - wheelFL (group)
    - tire (lathe · trim)
    - rim (cylinder · metal)
    - hub (cylinder · frame)
  - wheelFR (group)
    - tire (lathe · trim)
    - rim (cylinder · metal)
    - hub (cylinder · frame)
  - wheelRL (group)
    - tire (lathe · trim)
    - rim (cylinder · metal)
    - hub (cylinder · frame)

## How to use

Save the code below as `go-kart.js`, then:

```js
import { createGoKart } from './go-kart.js';
const model = createGoKart();
scene.add(model);
```

## Code

```js
/**
 * Go-Kart — Codels 3D model library (https://codels.download/models/go-kart)
 * License: CC0-1.0 · Units: meters · Y-up · Front: +Z · Origin: center of the base (y = 0)
 * Triangles: 2,864 · Size (W × H × D): 1.44 × 0.54 × 1.88 m
 *
 * Usage:
 *   import { createGoKart } from './go-kart.js';
 *   
 *   const model = createGoKart();
 *   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);
}

// Tube along a smooth curve through the given points.
function tube(path, radius, tubularSegments, radialSegments, closed = false) {
  const curve = new THREE.CatmullRomCurve3(path.map(([x, y, z]) => new THREE.Vector3(x, y, z)), closed);
  return new THREE.TubeGeometry(curve, tubularSegments, radius, radialSegments, closed);
}

export function createGoKart() {
  const root = new THREE.Group();
  root.name = 'GoKart';

  // Materials
  const bodyMat = new THREE.MeshStandardMaterial({ name: 'body', color: 0xe9452f, roughness: 0.45, metalness: 0.05, flatShading: true });
  const frameMat = new THREE.MeshStandardMaterial({ name: 'frame', color: 0xc9ced6, roughness: 0.35, metalness: 0.6, flatShading: true });
  const seatMat = new THREE.MeshStandardMaterial({ name: 'seat', color: 0x26282c, roughness: 0.6, flatShading: true });
  const trimMat = new THREE.MeshStandardMaterial({ name: 'trim', color: 0x222327, roughness: 0.85, flatShading: true });
  const metalMat = new THREE.MeshStandardMaterial({ name: 'metal', color: 0x9ea4ab, roughness: 0.4, metalness: 0.55, flatShading: true });
  const whiteMat = new THREE.MeshStandardMaterial({ name: 'white', color: 0xf2f2ee, roughness: 0.5, flatShading: true });

  // Shared geometries
  const cylinderGeo = new THREE.CylinderGeometry(0.016, 0.016, 0.2766, 5);
  const boxGeo = new THREE.BoxGeometry(0.03, 0.08, 0.05);
  const cylinderGeo2 = new THREE.CylinderGeometry(0.016, 0.016, 0.2655, 5);
  const cylinderGeo3 = new THREE.CylinderGeometry(0.016, 0.016, 0.2218, 5);
  const boxGeo2 = new THREE.BoxGeometry(0.05, 0.08, 0.08);
  const cylinderGeo4 = new THREE.CylinderGeometry(0.016, 0.016, 0.2502, 5);
  const extrudeGeo = extrude([[0.34, 0.05], [-0.3, 0.05], [-0.32, 0.17], [0, 0.22], [0.36, 0.13]], 0.2, [], [0.015, 0.015, 1]);
  const boxGeo3 = new THREE.BoxGeometry(0.006, 0.05, 0.36);
  const extrudeGeo2 = extrude([[0.14, 0], [-0.12, 0], [-0.26, 0.42], [-0.19, 0.44], [-0.05, 0.16], [0.14, 0.12]], 0.03);
  const boxGeo4 = new THREE.BoxGeometry(0.05, 0.1, 0.02);
  const latheGeo = lathe([[0.081, -0.0494], [0.081, -0.065], [0.115, -0.065], [0.135, -0.0364], [0.135, 0.0364], [0.115, 0.065], [0.081, 0.065], [0.081, 0.0494]], 12, 0, Math.PI * 2);
  const cylinderGeo5 = new THREE.CylinderGeometry(0.081, 0.081, 0.0988, 12);
  const cylinderGeo6 = new THREE.CylinderGeometry(0.0243, 0.0292, 0.05, 8);
  const latheGeo2 = lathe([[0.084, -0.076], [0.084, -0.1], [0.1092, -0.1], [0.14, -0.056], [0.14, 0.056], [0.1092, 0.1], [0.084, 0.1], [0.084, 0.076]], 12, 0, Math.PI * 2);
  const cylinderGeo7 = new THREE.CylinderGeometry(0.084, 0.084, 0.152, 12);
  const cylinderGeo8 = new THREE.CylinderGeometry(0.0252, 0.0302, 0.05, 8);

  // Parts
  const body = new THREE.Group();
  body.name = 'body';
  root.add(body);
  const railL = new THREE.Mesh(tube([[0.16, 0.075, 0.86], [0.2, 0.075, 0.6], [0.26, 0.075, 0.2], [0.3, 0.075, -0.3], [0.3, 0.075, -0.62]], 0.016, 20, 5), frameMat);
  railL.name = 'railL';
  body.add(railL);
  const cylinder3 = new THREE.Mesh(cylinderGeo, frameMat);
  cylinder3.position.set(0.315, 0.105, 0.52);
  cylinder3.rotation.set(0, 0, deg(-77.4712));
  body.add(cylinder3);
  const box4 = new THREE.Mesh(boxGeo, metalMat);
  box4.position.set(0.45, 0.135, 0.52);
  body.add(box4);
  const cylinder5 = new THREE.Mesh(cylinderGeo2, frameMat);
  cylinder5.position.set(0.39, 0.085, 0.125);
  cylinder5.rotation.set(deg(-11.0194), deg(9.8739), deg(-83.6887));
  body.add(cylinder5);
  const cylinder6 = new THREE.Mesh(cylinderGeo3, frameMat);
  cylinder6.position.set(0.41, 0.085, -0.19);
  cylinder6.rotation.set(deg(5.1908), deg(-4.7055), deg(-84.3786));
  body.add(cylinder6);
  const box7 = new THREE.Mesh(boxGeo2, metalMat);
  box7.position.set(0.3, 0.14, -0.5);
  body.add(box7);
  const railR = new THREE.Mesh(tube([[-0.16, 0.075, 0.86], [-0.2, 0.075, 0.6], [-0.26, 0.075, 0.2], [-0.3, 0.075, -0.3], [-0.3, 0.075, -0.62]], 0.016, 20, 5), frameMat);
  railR.name = 'railR';
  body.add(railR);
  const cylinder9 = new THREE.Mesh(cylinderGeo, frameMat);
  cylinder9.position.set(-0.315, 0.105, 0.52);
  cylinder9.rotation.set(0, 0, deg(77.4712));
  body.add(cylinder9);
  const box10 = new THREE.Mesh(boxGeo, metalMat);
  box10.position.set(-0.45, 0.135, 0.52);
  body.add(box10);
  const cylinder11 = new THREE.Mesh(cylinderGeo2, frameMat);
  cylinder11.position.set(-0.39, 0.085, 0.125);
  cylinder11.rotation.set(deg(-11.0194), deg(-9.8739), deg(83.6887));
  body.add(cylinder11);
  const cylinder12 = new THREE.Mesh(cylinderGeo3, frameMat);
  cylinder12.position.set(-0.41, 0.085, -0.19);
  cylinder12.rotation.set(deg(5.1908), deg(4.7055), deg(84.3786));
  body.add(cylinder12);
  const box13 = new THREE.Mesh(boxGeo2, metalMat);
  box13.position.set(-0.3, 0.14, -0.5);
  body.add(box13);
  const tube14 = new THREE.Mesh(tube([[-0.2, 0.075, 0.6], [0.2, 0.075, 0.6]], 0.016, 8, 5), frameMat);
  body.add(tube14);
  const tube15 = new THREE.Mesh(tube([[-0.3, 0.075, -0.3], [0.3, 0.075, -0.3]], 0.016, 8, 5), frameMat);
  body.add(tube15);
  const tube16 = new THREE.Mesh(tube([[-0.3, 0.075, -0.62], [0.3, 0.075, -0.62]], 0.016, 8, 5), frameMat);
  body.add(tube16);
  const floorTray = new THREE.Mesh(new THREE.BoxGeometry(0.4, 0.008, 0.62), trimMat);
  floorTray.name = 'floorTray';
  floorTray.position.set(0, 0.063, 0.3);
  body.add(floorTray);
  const rearAxle = new THREE.Mesh(new THREE.CylinderGeometry(0.02, 0.02, 1.1, 6), metalMat);
  rearAxle.name = 'rearAxle';
  rearAxle.position.set(0, 0.14, -0.5);
  rearAxle.rotation.set(0, 0, deg(90));
  body.add(rearAxle);
  const rearBumper = new THREE.Mesh(tube([[-0.55, 0.12, -0.6], [-0.5, 0.13, -0.76], [0, 0.13, -0.8], [0.5, 0.13, -0.76], [0.55, 0.12, -0.6]], 0.016, 12, 5), frameMat);
  rearBumper.name = 'rearBumper';
  body.add(rearBumper);
  const cylinder20 = new THREE.Mesh(cylinderGeo4, frameMat);
  cylinder20.position.set(0.4, 0.1025, -0.69);
  cylinder20.rotation.set(deg(-36.9624), deg(21.5028), deg(-59.203));
  body.add(cylinder20);
  const cylinder21 = new THREE.Mesh(cylinderGeo4, frameMat);
  cylinder21.position.set(-0.4, 0.1025, -0.69);
  cylinder21.rotation.set(deg(-36.9624), deg(-21.5028), deg(59.203));
  body.add(cylinder21);
  const noseCone = new THREE.Mesh(extrude([[0.7, 0.035], [1, 0.035], [1.03, 0.08], [0.86, 0.15], [0.7, 0.165]], 0.78, [], [0.02, 0.02, 1]), bodyMat);
  noseCone.name = 'noseCone';
  noseCone.rotation.set(0, deg(-90), 0);
  body.add(noseCone);
  const noseStripe = new THREE.Mesh(new THREE.BoxGeometry(0.36, 0.035, 0.02), whiteMat);
  noseStripe.name = 'noseStripe';
  noseStripe.position.set(0, 0.125, 0.93);
  noseStripe.rotation.set(deg(-22), 0, 0);
  body.add(noseStripe);
  const frontPanel = new THREE.Mesh(new THREE.BoxGeometry(0.34, 0.24, 0.025), bodyMat);
  frontPanel.name = 'frontPanel';
  frontPanel.position.set(0.06, 0.24, 0.64);
  frontPanel.rotation.set(deg(-30), 0, 0);
  body.add(frontPanel);
  const numberPlate = new THREE.Mesh(new THREE.BoxGeometry(0.2, 0.13, 0.01), whiteMat);
  numberPlate.name = 'numberPlate';
  numberPlate.position.set(0.06, 0.25, 0.66);
  numberPlate.rotation.set(deg(-30), 0, 0);
  body.add(numberPlate);
  const sidePodL = new THREE.Mesh(extrudeGeo, bodyMat);
  sidePodL.name = 'sidePodL';
  sidePodL.position.set(0.52, 0, 0);
  sidePodL.rotation.set(0, deg(-90), 0);
  body.add(sidePodL);
  const box27 = new THREE.Mesh(boxGeo3, whiteMat);
  box27.position.set(0.64, 0.14, 0.02);
  body.add(box27);
  const sidePodR = new THREE.Mesh(extrudeGeo, bodyMat);
  sidePodR.name = 'sidePodR';
  sidePodR.position.set(-0.52, 0, 0);
  sidePodR.rotation.set(0, deg(-90), 0);
  body.add(sidePodR);
  const box29 = new THREE.Mesh(boxGeo3, whiteMat);
  box29.position.set(-0.64, 0.14, 0.02);
  body.add(box29);
  const seat = new THREE.Group();
  seat.name = 'seat';
  seat.position.set(0.06, 0.085, -0.2);
  body.add(seat);
  const seatShell = new THREE.Mesh(extrude([[0.14, 0], [-0.12, 0], [-0.26, 0.42], [-0.21, 0.44], [-0.08, 0.06], [0.14, 0.06]], 0.34, [], [0.02, 0.015, 1]), seatMat);
  seatShell.name = 'seatShell';
  seatShell.rotation.set(0, deg(-90), 0);
  seat.add(seatShell);
  const extrude32 = new THREE.Mesh(extrudeGeo2, seatMat);
  extrude32.position.set(0.19, 0, 0);
  extrude32.rotation.set(0, deg(-90), 0);
  seat.add(extrude32);
  const extrude33 = new THREE.Mesh(extrudeGeo2, seatMat);
  extrude33.position.set(-0.19, 0, 0);
  extrude33.rotation.set(0, deg(-90), 0);
  seat.add(extrude33);
  const steeringColumn = new THREE.Mesh(new THREE.CylinderGeometry(0.014, 0.014, 0.4191, 5), frameMat);
  steeringColumn.name = 'steeringColumn';
  steeringColumn.position.set(0.06, 0.2375, 0.43);
  steeringColumn.rotation.set(deg(-54.2239), 0, 0);
  body.add(steeringColumn);
  const steeringWheel = new THREE.Mesh(new THREE.TorusGeometry(0.13, 0.016, 3, 10), trimMat);
  steeringWheel.name = 'steeringWheel';
  steeringWheel.position.set(0.06, 0.375, 0.245);
  steeringWheel.rotation.set(deg(36), 0, 0);
  body.add(steeringWheel);
  const box36 = new THREE.Mesh(new THREE.BoxGeometry(0.22, 0.03, 0.03), trimMat);
  box36.position.set(0.06, 0.375, 0.245);
  box36.rotation.set(deg(36), 0, 0);
  body.add(box36);
  const box37 = new THREE.Mesh(boxGeo4, metalMat);
  box37.position.set(0.15, 0.13, 0.66);
  box37.rotation.set(deg(-20), 0, 0);
  body.add(box37);
  const box38 = new THREE.Mesh(boxGeo4, metalMat);
  box38.position.set(-0.03, 0.13, 0.66);
  box38.rotation.set(deg(-20), 0, 0);
  body.add(box38);
  const fuelTank = new THREE.Mesh(new THREE.CylinderGeometry(0.07, 0.07, 0.16, 8), whiteMat);
  fuelTank.name = 'fuelTank';
  fuelTank.position.set(0.06, 0.16, 0.42);
  fuelTank.rotation.set(deg(90), 0, 0);
  body.add(fuelTank);
  const engine = new THREE.Group();
  engine.name = 'engine';
  engine.position.set(-0.36, 0.095, -0.22);
  body.add(engine);
  const crankcase = new THREE.Mesh(new THREE.BoxGeometry(0.2, 0.16, 0.18), metalMat);
  crankcase.name = 'crankcase';
  crankcase.position.set(0, 0.08, 0);
  engine.add(crankcase);
  const box42 = new THREE.Mesh(new THREE.BoxGeometry(0.16, 0.012, 0.16), metalMat);
  box42.position.set(0, 0.176, 0);
  engine.add(box42);
  const box43 = new THREE.Mesh(new THREE.BoxGeometry(0.154, 0.012, 0.154), metalMat);
  box43.position.set(0, 0.2, 0);
  engine.add(box43);
  const box44 = new THREE.Mesh(new THREE.BoxGeometry(0.148, 0.012, 0.148), metalMat);
  box44.position.set(0, 0.224, 0);
  engine.add(box44);
  const box45 = new THREE.Mesh(new THREE.BoxGeometry(0.142, 0.012, 0.142), metalMat);
  box45.position.set(0, 0.248, 0);
  engine.add(box45);
  const box46 = new THREE.Mesh(new THREE.BoxGeometry(0.136, 0.012, 0.136), metalMat);
  box46.position.set(0, 0.272, 0);
  engine.add(box46);
  const box47 = new THREE.Mesh(new THREE.BoxGeometry(0.13, 0.012, 0.13), metalMat);
  box47.position.set(0, 0.296, 0);
  engine.add(box47);
  const cylinderHead = new THREE.Mesh(new THREE.BoxGeometry(0.09, 0.03, 0.09), trimMat);
  cylinderHead.name = 'cylinderHead';
  cylinderHead.position.set(0, 0.325, 0);
  engine.add(cylinderHead);
  const cylinder49 = new THREE.Mesh(new THREE.CylinderGeometry(0.01, 0.01, 0.05, 5), whiteMat);
  cylinder49.position.set(0, 0.365, 0);
  engine.add(cylinder49);
  const carburetor = new THREE.Mesh(new THREE.CylinderGeometry(0.035, 0.035, 0.08, 6), trimMat);
  carburetor.name = 'carburetor';
  carburetor.position.set(-0.13, 0.2, 0.02);
  carburetor.rotation.set(0, 0, deg(90));
  engine.add(carburetor);
  const airFilter = new THREE.Mesh(new THREE.CylinderGeometry(0.06, 0.06, 0.1, 8), trimMat);
  airFilter.name = 'airFilter';
  airFilter.position.set(-0.21, 0.2, 0.02);
  airFilter.rotation.set(0, 0, deg(90));
  engine.add(airFilter);
  const clutch = new THREE.Mesh(new THREE.CylinderGeometry(0.08, 0.08, 0.04, 10), trimMat);
  clutch.name = 'clutch';
  clutch.position.set(0.12, 0.08, 0);
  clutch.rotation.set(0, 0, deg(90));
  engine.add(clutch);
  const exhaustPipe = new THREE.Mesh(tube([[0, 0.3, -0.08], [0.02, 0.3, -0.2], [0, 0.22, -0.3], [-0.04, 0.16, -0.36]], 0.018, 8, 5), metalMat);
  exhaustPipe.name = 'exhaustPipe';
  engine.add(exhaustPipe);
  const muffler = new THREE.Mesh(new THREE.CylinderGeometry(0.05, 0.05, 0.22, 8), trimMat);
  muffler.name = 'muffler';
  muffler.position.set(-0.04, 0.16, -0.46);
  muffler.rotation.set(deg(90), 0, 0);
  engine.add(muffler);
  const sprocket = new THREE.Mesh(new THREE.CylinderGeometry(0.075, 0.075, 0.012, 12), metalMat);
  sprocket.name = 'sprocket';
  sprocket.position.set(-0.24, 0.14, -0.5);
  sprocket.rotation.set(0, 0, deg(90));
  body.add(sprocket);
  const chain = new THREE.Mesh(tube([[-0.24, 0.17, -0.22], [-0.24, 0.21, -0.5], [-0.24, 0.07, -0.5], [-0.24, 0.07, -0.22], [-0.24, 0.17, -0.22]], 0.008, 16, 3, true), trimMat);
  chain.name = 'chain';
  body.add(chain);
  const wheels = new THREE.Group();
  wheels.name = 'wheels';
  root.add(wheels);
  const wheelFL = new THREE.Group();
  wheelFL.name = 'wheelFL';
  wheelFL.position.set(0.55, 0.135, 0.52);
  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(cylinderGeo5, metalMat);
  rim.name = 'rim';
  rim.rotation.set(0, 0, deg(90));
  wheelFL.add(rim);
  const hub = new THREE.Mesh(cylinderGeo6, frameMat);
  hub.name = 'hub';
  hub.position.set(0.0694, 0, 0);
  hub.rotation.set(0, 0, deg(-90));
  wheelFL.add(hub);
  const wheelFR = new THREE.Group();
  wheelFR.name = 'wheelFR';
  wheelFR.position.set(-0.55, 0.135, 0.52);
  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(cylinderGeo5, metalMat);
  rim2.name = 'rim';
  rim2.rotation.set(0, 0, deg(90));
  wheelFR.add(rim2);
  const hub2 = new THREE.Mesh(cylinderGeo6, frameMat);
  hub2.name = 'hub';
  hub2.position.set(-0.0694, 0, 0);
  hub2.rotation.set(0, 0, deg(90));
  wheelFR.add(hub2);
  const wheelRL = new THREE.Group();
  wheelRL.name = 'wheelRL';
  wheelRL.position.set(0.6, 0.14, -0.5);
  wheels.add(wheelRL);
  const tire3 = new THREE.Mesh(latheGeo2, trimMat);
  tire3.name = 'tire';
  tire3.rotation.set(0, 0, deg(90));
  wheelRL.add(tire3);
  const rim3 = new THREE.Mesh(cylinderGeo7, metalMat);
  rim3.name = 'rim';
  rim3.rotation.set(0, 0, deg(90));
  wheelRL.add(rim3);
  const hub3 = new THREE.Mesh(cylinderGeo8, frameMat);
  hub3.name = 'hub';
  hub3.position.set(0.096, 0, 0);
  hub3.rotation.set(0, 0, deg(-90));
  wheelRL.add(hub3);
  const wheelRR = new THREE.Group();
  wheelRR.name = 'wheelRR';
  wheelRR.position.set(-0.6, 0.14, -0.5);
  wheels.add(wheelRR);
  const tire4 = new THREE.Mesh(latheGeo2, trimMat);
  tire4.name = 'tire';
  tire4.rotation.set(0, 0, deg(90));
  wheelRR.add(tire4);
  const rim4 = new THREE.Mesh(cylinderGeo7, metalMat);
  rim4.name = 'rim';
  rim4.rotation.set(0, 0, deg(90));
  wheelRR.add(rim4);
  const hub4 = new THREE.Mesh(cylinderGeo8, frameMat);
  hub4.name = 'hub';
  hub4.position.set(-0.096, 0, 0);
  hub4.rotation.set(0, 0, deg(90));
  wheelRR.add(hub4);

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

export default createGoKart;
```

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