Snake
A European snake about 95 cm long lying on the ground, head toward +Z: a smooth round body that tapers to a thin tail, a slightly wider head with eyes and a glint, a hinged lower jaw and a forked tongue that flicks out. Grass snake: olive with a yellow and black collar behind the head, black bars along the flanks and a chequered pale belly; adder: grey-brown with a dark zigzag down the back, a dark V on the head and a stripe through the eye. The body is a chain of twelve nested segments (seg_0 behind the head to seg_11 at the tail tip) with head, jaw and tongue. It travels on the ground by distance: side-to-side waves run from head to tail with every joint following the path of the one ahead (Loop clip, loop_m metres per wave). Named clips: Slither (the same wave in seconds), Dangle (hanging limp from talons gripping it at seg_2 and seg_3, about a third of the way back: the body drops straight down from the pivot of seg_3 and sways like a pendulum, the tail curls, the head lifts and the tongue flicks) and Strike (rears into an S, lunges with the mouth open, settles back).
- Size
- 0.17 × 0.03 × 0.84 m
- Triangles
- 3,588
- Kit
- Wildlife
The other 13 in WildlifePro
Pro is $12 a month: all 590 specimens, every knob baked into GLB or OBJ. Or $79 once. See Pro plans
Tune it
3 knobs: Species, Colour, Size.
Specs
- Size
- 0.17 × 0.03 × 0.84 m width × height × depth
- Triangles
- 3,588 of 6,000
- Draw calls
- 1 one vertex-colour material
- Loop clip
- 0.577 m of travel per cycle
- Moving parts
- 15 seg_0 · rotate, seg_1 · rotate, seg_2 · rotate, seg_3 · rotate, seg_4 · rotate, seg_5 · rotate, seg_6 · rotate, seg_7 · rotate, seg_8 · rotate, seg_9 · rotate, seg_10 · rotate, seg_11 · rotate, head · rotate, jaw · rotate, tongue · slide
- Knobs
- 3 4 presets
- Night lights
- 0 none
Passed the validator: real scale, rests on y = 0, front faces +Z, deterministic.
Use it
Code for the specimen as it is set up above; it follows your knobs.
import { createAsset } from 'https://gaitkit.com/cdn/snake.mjs';
const snake = createAsset();
scene.add(snake); // rests on y = 0, front faces +Z
let dist = 0;
renderer.setAnimationLoop(() => {
dist += speed * clock.getDelta();
snake.position.z = dist;
snake.userData.tick(dist); // wheels roll exactly with the distance
renderer.render(scene, camera);
});import { useGLTF, useAnimations } from '@react-three/drei';
import { useEffect } from 'react';
// snake.glb from the Download button (it carries the knobs you set), saved in /public
export function Snake({ speed = 1 }) {
const { scene, animations } = useGLTF('/snake.glb');
const { actions } = useAnimations(animations, scene);
useEffect(() => {
const clip = actions['Loop'];
clip?.play();
if (clip) clip.timeScale = speed / 0.577; // one Loop = 0.577 m of travel
}, [actions, speed]);
return <primitive object={scene} />;
}
// Live knobs or terrain-following feet: copy snake.mjs and runtime/ into your project and use the three.js tab.# Import snake.glb (download below). It carries an in-place "Loop" animation.
@onready var anim: AnimationPlayer = $Snake/AnimationPlayer
func _physics_process(delta):
velocity = transform.basis.z * speed
move_and_slide()
anim.play("Loop")
anim.speed_scale = speed / 0.577 # one Loop = 0.577 m of travel// Import snake.glb with glTFast (com.unity.cloud.gltfast).
animator.Play("Loop");
animator.speed = speed / 0.577 // one Loop = 0.577 m of travelUse the gaitkit MCP server: get_variant({ "id": "snake", "want": "default look" })
then place the result and drive it with userData.tick(distance).
# MCP endpoint
https://gaitkit.com/mcpKnobs
| Knob | Type | Values | Default | What it does |
|---|---|---|---|---|
species | choice | grass adder | grass | grass = grass snake (Natrix): slender, olive with a yellow and black collar behind the head, black flank bars, round pupils. adder = European adder (Vipera berus): stouter, a broad flat head, a dark zigzag down the back, a dark V on the head and red eyes with slit pupils. |
colour | choice | natural pale dark | natural | natural = the usual colours (olive grass snake, brown adder). pale = a grey-green grass snake or a silver-grey male adder with a black zigzag. dark = a dark olive grass snake or an almost black (melanistic) adder. |
size | range | 0.6 to 1.25, step 0.05 | 1 | Uniform scale. 1 is a 95 cm grass snake or a 90 cm adder; 0.6 is a young one about 55 cm long; 1.25 is a big female of 1.2 m. |
Presets: grass snake {"species":"grass"} · adder {"species":"adder"} · silver adder {"species":"adder","colour":"pale"} · young grass snake {"species":"grass","size":0.6}
Files
| File | What |
|---|---|
| snake.glb | GLB, default look · 539 KB |
| snake.mjs | ES module, every knob live |
| snake.obj | OBJ, static; colours in the .mtl |
| snake.mtl | OBJ colours; keep it next to the .obj |
| snake-params.json | knob schema, presets, night zones |
Licence
Use it in games, apps, renders and client work, commercially and without credit. Do not resell it as an asset or train a 3D generator on it. The full licence.