# Giant Spider

> A big, chunky cartoon low-poly spider with a round spotted abdomen, a faceted head, little fangs and eight jointed, banded legs that arch high before touching the ground. Choose a cute look with huge googly eyes or a creepy look with eight glowing red eyes, recolor body and markings, and scale it from house spider to dungeon boss. Each leg is its own group (legL1–legL4, legR1–legR4) pivoted at the body, plus head and abdomen groups — ready for skittering walk cycles in caves, dungeons, forests and Halloween levels.

![Giant Spider preview](https://codels.download/m/spider.png)

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

## Facts

- Category: Characters › Creatures & Monsters
- Size (W × H × D): 1.46 × 0.74 × 1.39 m — units are meters, +Y up, front faces +Z
- Origin: center of the base (y = 0)
- Triangles: 1,678 · Meshes: 56 · Materials: 6
- License: CC0-1.0 (Codels built-in)
- Tags: boss, spider, cartoon, low-poly, stylized, fantasy, halloween, horror, cave, dungeon, forest, roguelike, rpg, animal, enemy, game-ready, parametric, color-purple, size-medium, poly-medium
- Page: https://codels.download/models/spider

## Files

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

## Parameters

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

| Param | Type | Range / options | Default | Current |
|---|---|---|---|---|
| `body` | color | #rrggbb | #3d3448 | #3d3448 |
| `markings` | color | #rrggbb | #e5493b | #e5493b |
| `look` | select | cute \| creepy | cute | cute |
| `size` | number | 0.3 – 3 | 1 | 1 |

## Parts

- spider (group)
  - abdomen (group)
    - abdomenShell (sphere · body)
    - markSpot1 (sphere · mark)
    - markSpot2 (sphere · mark)
    - markSpot3 (sphere · mark)
    - markSide (sphere · mark)
    - markSide (sphere · mark)
    - markSide (sphere · mark)
    - markSide (sphere · mark)
    - spinneret (cone · joint)
  - head (group)
    - cephalothorax (sphere · body)
    - eyeL (sphere · eyeWhite)
    - pupilL (sphere · pupil)
    - eyeShineL (box · eyeWhite)
    - eyeSmall (sphere · pupil)
    - eyeSmall (sphere · pupil)
    - eyeR (sphere · eyeWhite)
    - pupilR (sphere · pupil)
    - eyeShineR (box · eyeWhite)
    - eyeSmall (sphere · pupil)
    - eyeSmall (sphere · pupil)
    - chelicera (sphere · body)
    - fang (cone · fang)
    - chelicera (sphere · body)
    - fang (cone · fang)
  - legL1 (group)
    - femur (cylinder · body)
    - knee (sphere · joint)
    - tibia (cylinder · body)
    - legBand (cylinder · mark)
  - legL2 (group)
    - femur (cylinder · body)
    - knee (sphere · joint)
    - tibia (cylinder · body)
    - legBand (cylinder · mark)
  - legL3 (group)
    - femur (cylinder · body)
    - knee (sphere · joint)

## How to use

Save the code below as `spider.js`, then:

```js
import { createSpider } from './spider.js';
const model = createSpider();
scene.add(model);
```

## Code

```js
/**
 * Giant Spider — Codels 3D model library (https://codels.download/models/spider)
 * License: CC0-1.0 · Units: meters · Y-up · Front: +Z · Origin: center of the base (y = 0)
 * Triangles: 1,678 · Size (W × H × D): 1.46 × 0.74 × 1.39 m
 *
 * Usage:
 *   import { createSpider } from './spider.js';
 *   
 *   const model = createSpider();
 *   model.position.set(0, 0, 0);
 *   scene.add(model);
 */
import * as THREE from 'three';

const deg = THREE.MathUtils.degToRad;

export function createSpider() {
  const root = new THREE.Group();
  root.name = 'Spider';

  // Materials
  const bodyMat = new THREE.MeshStandardMaterial({ name: 'body', color: 0x3d3448, roughness: 0.6, flatShading: true });
  const jointMat = new THREE.MeshStandardMaterial({ name: 'joint', color: 0x605969, roughness: 0.6, flatShading: true });
  const markMat = new THREE.MeshStandardMaterial({ name: 'mark', color: 0xe5493b, roughness: 0.55, flatShading: true });
  const eyeWhiteMat = new THREE.MeshStandardMaterial({ name: 'eyeWhite', color: 0xfbfaf6, roughness: 0.3, flatShading: true });
  const pupilMat = new THREE.MeshStandardMaterial({ name: 'pupil', color: 0x141116, roughness: 0.2, flatShading: true });
  const fangMat = new THREE.MeshStandardMaterial({ name: 'fang', color: 0xefe6d2, roughness: 0.5, flatShading: true });

  // Shared geometries
  const sphereGeo = new THREE.SphereGeometry(0.055, 8, 3);
  const sphereGeo2 = new THREE.SphereGeometry(0.042, 8, 3);
  const sphereGeo3 = new THREE.SphereGeometry(0.075, 8, 6);
  const sphereGeo4 = new THREE.SphereGeometry(0.038, 8, 6);
  const boxGeo = new THREE.BoxGeometry(0.014, 0.014, 0.006);
  const sphereGeo5 = new THREE.SphereGeometry(0.022, 6, 4);
  const sphereGeo6 = new THREE.SphereGeometry(0.018, 6, 4);
  const sphereGeo7 = new THREE.SphereGeometry(0.05, 6, 4);
  const coneGeo = new THREE.ConeGeometry(0.022, 0.07, 5);
  const cylinderGeo = new THREE.CylinderGeometry(0.046, 0.058, 0.4292, 6, 1, true);
  const sphereGeo8 = new THREE.SphereGeometry(0.054, 6, 3);
  const cylinderGeo2 = new THREE.CylinderGeometry(0.016, 0.044, 0.6881, 6);
  const cylinderGeo3 = new THREE.CylinderGeometry(0.041, 0.044, 0.0688, 6, 1, true);
  const cylinderGeo4 = new THREE.CylinderGeometry(0.046, 0.058, 0.4105, 6, 1, true);
  const cylinderGeo5 = new THREE.CylinderGeometry(0.016, 0.044, 0.6756, 6);
  const cylinderGeo6 = new THREE.CylinderGeometry(0.041, 0.044, 0.0676, 6, 1, true);

  // Parts
  const spider = new THREE.Group();
  spider.name = 'spider';
  spider.position.set(0, -0.0074, 0);
  root.add(spider);
  const abdomen = new THREE.Group();
  abdomen.name = 'abdomen';
  abdomen.position.set(0, 0.36, -0.05);
  spider.add(abdomen);
  const abdomenShell = new THREE.Mesh(new THREE.SphereGeometry(1, 12, 8), bodyMat);
  abdomenShell.name = 'abdomenShell';
  abdomenShell.position.set(0, 0.1, -0.32);
  abdomenShell.scale.set(0.32, 0.27, 0.36);
  abdomen.add(abdomenShell);
  const markSpot1 = new THREE.Mesh(new THREE.SphereGeometry(0.085, 8, 3), markMat);
  markSpot1.name = 'markSpot1';
  markSpot1.position.set(0, 0.3447, -0.18);
  markSpot1.rotation.set(deg(17.5671), 0, 0);
  markSpot1.scale.set(1, 0.28, 1);
  abdomen.add(markSpot1);
  const markSpot2 = new THREE.Mesh(new THREE.SphereGeometry(0.07, 8, 3), markMat);
  markSpot2.name = 'markSpot2';
  markSpot2.position.set(0, 0.3643, -0.36);
  markSpot2.rotation.set(deg(-4.7932), 0, 0);
  markSpot2.scale.set(1, 0.28, 1);
  abdomen.add(markSpot2);
  const markSpot3 = new THREE.Mesh(new THREE.SphereGeometry(0.05, 8, 3), markMat);
  markSpot3.name = 'markSpot3';
  markSpot3.position.set(0, 0.3205, -0.52);
  markSpot3.rotation.set(deg(-26.6161), 0, 0);
  markSpot3.scale.set(1, 0.28, 1);
  abdomen.add(markSpot3);
  const markSide = new THREE.Mesh(sphereGeo, markMat);
  markSide.name = 'markSide';
  markSide.position.set(0.15, 0.3315, -0.27);
  markSide.rotation.set(deg(6.2085), deg(-1.3347), deg(-24.2437));
  markSide.scale.set(1, 0.28, 1);
  abdomen.add(markSide);
  const markSide2 = new THREE.Mesh(sphereGeo2, markMat);
  markSide2.name = 'markSide';
  markSide2.position.set(0.13, 0.3226, -0.45);
  markSide2.rotation.set(deg(-16.6574), deg(3.1495), deg(-21.2716));
  markSide2.scale.set(1, 0.28, 1);
  abdomen.add(markSide2);
  const markSide3 = new THREE.Mesh(sphereGeo, markMat);
  markSide3.name = 'markSide';
  markSide3.position.set(-0.15, 0.3315, -0.27);
  markSide3.rotation.set(deg(6.2085), deg(1.3347), deg(24.2437));
  markSide3.scale.set(1, 0.28, 1);
  abdomen.add(markSide3);
  const markSide4 = new THREE.Mesh(sphereGeo2, markMat);
  markSide4.name = 'markSide';
  markSide4.position.set(-0.13, 0.3226, -0.45);
  markSide4.rotation.set(deg(-16.6574), deg(-3.1495), deg(21.2716));
  markSide4.scale.set(1, 0.28, 1);
  abdomen.add(markSide4);
  const spinneret = new THREE.Mesh(new THREE.ConeGeometry(0.04, 0.06, 5), jointMat);
  spinneret.name = 'spinneret';
  spinneret.position.set(0, 0.06, -0.67);
  spinneret.rotation.set(deg(-110), 0, 0);
  abdomen.add(spinneret);
  const head = new THREE.Group();
  head.name = 'head';
  head.position.set(0, 0.36, 0);
  spider.add(head);
  const cephalothorax = new THREE.Mesh(new THREE.SphereGeometry(0.22, 10, 7), bodyMat);
  cephalothorax.name = 'cephalothorax';
  cephalothorax.position.set(0, 0.02, 0.1);
  cephalothorax.scale.set(1, 0.72, 1.08);
  head.add(cephalothorax);
  const eyeL = new THREE.Mesh(sphereGeo3, eyeWhiteMat);
  eyeL.name = 'eyeL';
  eyeL.position.set(0.075, 0.07, 0.2776);
  head.add(eyeL);
  const pupilL = new THREE.Mesh(sphereGeo4, pupilMat);
  pupilL.name = 'pupilL';
  pupilL.position.set(0.07, 0.065, 0.3426);
  pupilL.scale.set(1, 1.1, 0.55);
  head.add(pupilL);
  const eyeShineL = new THREE.Mesh(boxGeo, eyeWhiteMat);
  eyeShineL.name = 'eyeShineL';
  eyeShineL.position.set(0.082, 0.08, 0.3626);
  head.add(eyeShineL);
  const eyeSmall = new THREE.Mesh(sphereGeo5, pupilMat);
  eyeSmall.name = 'eyeSmall';
  eyeSmall.position.set(0.045, 0.14, 0.2676);
  head.add(eyeSmall);
  const eyeSmall2 = new THREE.Mesh(sphereGeo6, pupilMat);
  eyeSmall2.name = 'eyeSmall';
  eyeSmall2.position.set(0.105, 0.125, 0.2376);
  head.add(eyeSmall2);
  const eyeR = new THREE.Mesh(sphereGeo3, eyeWhiteMat);
  eyeR.name = 'eyeR';
  eyeR.position.set(-0.075, 0.07, 0.2776);
  head.add(eyeR);
  const pupilR = new THREE.Mesh(sphereGeo4, pupilMat);
  pupilR.name = 'pupilR';
  pupilR.position.set(-0.07, 0.065, 0.3426);
  pupilR.scale.set(1, 1.1, 0.55);
  head.add(pupilR);
  const eyeShineR = new THREE.Mesh(boxGeo, eyeWhiteMat);
  eyeShineR.name = 'eyeShineR';
  eyeShineR.position.set(-0.058, 0.08, 0.3626);
  head.add(eyeShineR);
  const eyeSmall3 = new THREE.Mesh(sphereGeo5, pupilMat);
  eyeSmall3.name = 'eyeSmall';
  eyeSmall3.position.set(-0.045, 0.14, 0.2676);
  head.add(eyeSmall3);
  const eyeSmall4 = new THREE.Mesh(sphereGeo6, pupilMat);
  eyeSmall4.name = 'eyeSmall';
  eyeSmall4.position.set(-0.105, 0.125, 0.2376);
  head.add(eyeSmall4);
  const chelicera = new THREE.Mesh(sphereGeo7, bodyMat);
  chelicera.name = 'chelicera';
  chelicera.position.set(0.045, -0.06, 0.2976);
  chelicera.scale.set(1, 1.2, 1);
  head.add(chelicera);
  const fang = new THREE.Mesh(coneGeo, fangMat);
  fang.name = 'fang';
  fang.position.set(0.045, -0.12, 0.3176);
  fang.rotation.set(deg(160), 0, deg(8));
  head.add(fang);
  const chelicera2 = new THREE.Mesh(sphereGeo7, bodyMat);
  chelicera2.name = 'chelicera';
  chelicera2.position.set(-0.045, -0.06, 0.2976);
  chelicera2.scale.set(1, 1.2, 1);
  head.add(chelicera2);
  const fang2 = new THREE.Mesh(coneGeo, fangMat);
  fang2.name = 'fang';
  fang2.position.set(-0.045, -0.12, 0.3176);
  fang2.rotation.set(deg(160), 0, deg(-8));
  head.add(fang2);
  const legL1 = new THREE.Group();
  legL1.name = 'legL1';
  legL1.position.set(0.12, 0.36, 0.1);
  spider.add(legL1);
  const femur = new THREE.Mesh(cylinderGeo, bodyMat);
  femur.name = 'femur';
  femur.position.set(0.0997, 0.125, 0.1277);
  femur.rotation.set(deg(39.4424), deg(-10.8813), deg(-29.759));
  legL1.add(femur);
  const knee = new THREE.Mesh(sphereGeo8, jointMat);
  knee.name = 'knee';
  knee.position.set(0.1995, 0.25, 0.2553);
  legL1.add(knee);
  const tibia = new THREE.Mesh(cylinderGeo2, bodyMat);
  tibia.name = 'tibia';
  tibia.position.set(0.3059, -0.0475, 0.3915);
  tibia.rotation.set(deg(111.7515), deg(-64.7779), deg(-46.5236));
  legL1.add(tibia);
  const legBand = new THREE.Mesh(cylinderGeo3, markMat);
  legBand.name = 'legBand';
  legBand.position.set(0.2484, 0.1132, 0.318);
  legBand.rotation.set(deg(111.7515), deg(-64.7779), deg(-46.5236));
  legBand.scale.set(1.12, 1, 1.12);
  legL1.add(legBand);
  const legL2 = new THREE.Group();
  legL2.name = 'legL2';
  legL2.position.set(0.12, 0.36, 0.03);
  spider.add(legL2);
  const femur2 = new THREE.Mesh(cylinderGeo4, bodyMat);
  femur2.name = 'femur';
  femur2.position.set(0.1427, 0.125, 0.0464);
  femur2.rotation.set(deg(13.8117), deg(-6.0702), deg(-47.2854));
  legL2.add(femur2);
  const knee2 = new THREE.Mesh(sphereGeo8, jointMat);
  knee2.name = 'knee';
  knee2.position.set(0.2853, 0.25, 0.0927);
  legL2.add(knee2);
  const tibia2 = new THREE.Mesh(cylinderGeo5, bodyMat);
  tibia2.name = 'tibia';
  tibia2.position.set(0.4375, -0.0475, 0.1421);
  tibia2.rotation.set(deg(10.1157), deg(-33.5543), deg(-147.2788));
  legL2.add(tibia2);
  const legBand2 = new THREE.Mesh(cylinderGeo6, markMat);
  legBand2.name = 'legBand';
  legBand2.position.set(0.3553, 0.1132, 0.1154);
  legBand2.rotation.set(deg(10.1157), deg(-33.5543), deg(-147.2788));
  legBand2.scale.set(1.12, 1, 1.12);
  legL2.add(legBand2);
  const legL3 = new THREE.Group();
  legL3.name = 'legL3';
  legL3.position.set(0.12, 0.36, -0.04);
  spider.add(legL3);
  const femur3 = new THREE.Mesh(cylinderGeo4, bodyMat);
  femur3.name = 'femur';
  femur3.position.set(0.1442, 0.125, -0.0413);
  femur3.rotation.set(deg(-12.2818), deg(5.4707), deg(-47.8885));
  legL3.add(femur3);
  const knee3 = new THREE.Mesh(sphereGeo8, jointMat);
  knee3.name = 'knee';
  knee3.position.set(0.2884, 0.25, -0.0827);
  legL3.add(knee3);
  const tibia3 = new THREE.Mesh(cylinderGeo5, bodyMat);
  tibia3.name = 'tibia';
  tibia3.position.set(0.4422, -0.0475, -0.1268);
  tibia3.rotation.set(deg(-8.6609), deg(29.8884), deg(-148.3212));
  legL3.add(tibia3);
  const legBand3 = new THREE.Mesh(cylinderGeo6, markMat);
  legBand3.name = 'legBand';
  legBand3.position.set(0.3591, 0.1132, -0.103);
  legBand3.rotation.set(deg(-8.6609), deg(29.8884), deg(-148.3212));
  legBand3.scale.set(1.12, 1, 1.12);
  legL3.add(legBand3);
  const legL4 = new THREE.Group();
  legL4.name = 'legL4';
  legL4.position.set(0.12, 0.36, -0.11);
  spider.add(legL4);
  const femur4 = new THREE.Mesh(cylinderGeo, bodyMat);
  femur4.name = 'femur';
  femur4.position.set(0.1041, 0.125, -0.1241);
  femur4.rotation.set(deg(-38.1656), deg(11.0461), deg(-31.2324));
  legL4.add(femur4);
  const knee4 = new THREE.Mesh(sphereGeo8, jointMat);
  knee4.name = 'knee';
  knee4.position.set(0.2083, 0.25, -0.2482);
  legL4.add(knee4);
  const tibia4 = new THREE.Mesh(cylinderGeo2, bodyMat);
  tibia4.name = 'tibia';
  tibia4.position.set(0.3193, -0.0475, -0.3806);
  tibia4.rotation.set(deg(-103.7656), deg(66.6634), deg(-54.5872));
  legL4.add(tibia4);
  const legBand4 = new THREE.Mesh(cylinderGeo3, markMat);
  legBand4.name = 'legBand';
  legBand4.position.set(0.2594, 0.1132, -0.3091);
  legBand4.rotation.set(deg(-103.7656), deg(66.6634), deg(-54.5872));
  legBand4.scale.set(1.12, 1, 1.12);
  legL4.add(legBand4);
  const legR1 = new THREE.Group();
  legR1.name = 'legR1';
  legR1.position.set(-0.12, 0.36, 0.1);
  spider.add(legR1);
  const femur5 = new THREE.Mesh(cylinderGeo, bodyMat);
  femur5.name = 'femur';
  femur5.position.set(-0.0997, 0.125, 0.1277);
  femur5.rotation.set(deg(39.4424), deg(10.8813), deg(29.759));
  legR1.add(femur5);
  const knee5 = new THREE.Mesh(sphereGeo8, jointMat);
  knee5.name = 'knee';
  knee5.position.set(-0.1995, 0.25, 0.2553);
  legR1.add(knee5);
  const tibia5 = new THREE.Mesh(cylinderGeo2, bodyMat);
  tibia5.name = 'tibia';
  tibia5.position.set(-0.3059, -0.0475, 0.3915);
  tibia5.rotation.set(deg(111.7515), deg(64.7779), deg(46.5236));
  legR1.add(tibia5);
  const legBand5 = new THREE.Mesh(cylinderGeo3, markMat);
  legBand5.name = 'legBand';
  legBand5.position.set(-0.2484, 0.1132, 0.318);
  legBand5.rotation.set(deg(111.7515), deg(64.7779), deg(46.5236));
  legBand5.scale.set(1.12, 1, 1.12);
  legR1.add(legBand5);
  const legR2 = new THREE.Group();
  legR2.name = 'legR2';
  legR2.position.set(-0.12, 0.36, 0.03);
  spider.add(legR2);
  const femur6 = new THREE.Mesh(cylinderGeo4, bodyMat);
  femur6.name = 'femur';
  femur6.position.set(-0.1427, 0.125, 0.0464);
  femur6.rotation.set(deg(13.8117), deg(6.0702), deg(47.2854));
  legR2.add(femur6);
  const knee6 = new THREE.Mesh(sphereGeo8, jointMat);
  knee6.name = 'knee';
  knee6.position.set(-0.2853, 0.25, 0.0927);
  legR2.add(knee6);
  const tibia6 = new THREE.Mesh(cylinderGeo5, bodyMat);
  tibia6.name = 'tibia';
  tibia6.position.set(-0.4375, -0.0475, 0.1421);
  tibia6.rotation.set(deg(10.1157), deg(33.5543), deg(147.2788));
  legR2.add(tibia6);
  const legBand6 = new THREE.Mesh(cylinderGeo6, markMat);
  legBand6.name = 'legBand';
  legBand6.position.set(-0.3553, 0.1132, 0.1154);
  legBand6.rotation.set(deg(10.1157), deg(33.5543), deg(147.2788));
  legBand6.scale.set(1.12, 1, 1.12);
  legR2.add(legBand6);
  const legR3 = new THREE.Group();
  legR3.name = 'legR3';
  legR3.position.set(-0.12, 0.36, -0.04);
  spider.add(legR3);
  const femur7 = new THREE.Mesh(cylinderGeo4, bodyMat);
  femur7.name = 'femur';
  femur7.position.set(-0.1442, 0.125, -0.0413);
  femur7.rotation.set(deg(-12.2818), deg(-5.4707), deg(47.8885));
  legR3.add(femur7);
  const knee7 = new THREE.Mesh(sphereGeo8, jointMat);
  knee7.name = 'knee';
  knee7.position.set(-0.2884, 0.25, -0.0827);
  legR3.add(knee7);
  const tibia7 = new THREE.Mesh(cylinderGeo5, bodyMat);
  tibia7.name = 'tibia';
  tibia7.position.set(-0.4422, -0.0475, -0.1268);
  tibia7.rotation.set(deg(-8.6609), deg(-29.8884), deg(148.3212));
  legR3.add(tibia7);
  const legBand7 = new THREE.Mesh(cylinderGeo6, markMat);
  legBand7.name = 'legBand';
  legBand7.position.set(-0.3591, 0.1132, -0.103);
  legBand7.rotation.set(deg(-8.6609), deg(-29.8884), deg(148.3212));
  legBand7.scale.set(1.12, 1, 1.12);
  legR3.add(legBand7);
  const legR4 = new THREE.Group();
  legR4.name = 'legR4';
  legR4.position.set(-0.12, 0.36, -0.11);
  spider.add(legR4);
  const femur8 = new THREE.Mesh(cylinderGeo, bodyMat);
  femur8.name = 'femur';
  femur8.position.set(-0.1041, 0.125, -0.1241);
  femur8.rotation.set(deg(-38.1656), deg(-11.0461), deg(31.2324));
  legR4.add(femur8);
  const knee8 = new THREE.Mesh(sphereGeo8, jointMat);
  knee8.name = 'knee';
  knee8.position.set(-0.2083, 0.25, -0.2482);
  legR4.add(knee8);
  const tibia8 = new THREE.Mesh(cylinderGeo2, bodyMat);
  tibia8.name = 'tibia';
  tibia8.position.set(-0.3193, -0.0475, -0.3806);
  tibia8.rotation.set(deg(-103.7656), deg(-66.6634), deg(54.5872));
  legR4.add(tibia8);
  const legBand8 = new THREE.Mesh(cylinderGeo3, markMat);
  legBand8.name = 'legBand';
  legBand8.position.set(-0.2594, 0.1132, -0.3091);
  legBand8.rotation.set(deg(-103.7656), deg(-66.6634), deg(54.5872));
  legBand8.scale.set(1.12, 1, 1.12);
  legR4.add(legBand8);

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

export default createSpider;
```

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