Trout
A wild 45 cm river trout, brown (olive back, golden flanks, black spots and pale-ringed red spots) or rainbow (green-olive back peppered with black spots, a pink band along the side, silver belly): a streamlined, slightly flattened body built from five nested segments and a tail that bend smoothly, a real trout head with a long mouth line, hinged lower jaw, gill cover and an eye with a glint, a small adipose fin and a square tail. Swims by distance with a body wave that grows toward the tail and cruises 0.6 m deep; named clips Swim (cruise loop) and Flap (a fast thrash with a gaping mouth, for a leap out of the water or wriggling in talons).
- Size
- 0.07 × 0.15 × 0.45 m
- Triangles
- 3,767
- Kit
- Underwater
The other 6 in UnderwaterPro
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, Size, Markings.
Specs
- Size
- 0.07 × 0.15 × 0.45 m width × height × depth
- Triangles
- 3,767 of 6,000
- Draw calls
- 1 one vertex-colour material
- Loop clip
- 0.293 m of travel per cycle
- Altitude
- 0.6 m below the surface
- Moving parts
- 9 body_0 · rotate, body_1 · rotate, body_2 · rotate, body_3 · rotate, body_4 · rotate, tail · rotate, jaw · rotate, pectoral_L · rotate, pectoral_R · rotate
- Knobs
- 3 3 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/trout.mjs';
const trout = createAsset();
scene.add(trout); // rests on y = 0, front faces +Z
let dist = 0;
renderer.setAnimationLoop(() => {
dist += speed * clock.getDelta();
trout.position.set(0, groundY + trout.userData.altitude, dist);
trout.userData.tick(dist); // the body waves with the distance
renderer.render(scene, camera);
});import { useGLTF, useAnimations } from '@react-three/drei';
import { useEffect } from 'react';
// trout.glb from the Download button (it carries the knobs you set), saved in /public
export function Trout({ speed = 1 }) {
const { scene, animations } = useGLTF('/trout.glb');
const { actions } = useAnimations(animations, scene);
useEffect(() => {
const clip = actions['Loop'];
clip?.play();
if (clip) clip.timeScale = speed / 0.293; // one Loop = 0.293 m of travel
}, [actions, speed]);
return <primitive object={scene} />;
}
// Live knobs or terrain-following feet: copy trout.mjs and runtime/ into your project and use the three.js tab.# Import trout.glb (download below). It carries an in-place "Loop" animation.
@onready var anim: AnimationPlayer = $Trout/AnimationPlayer
func _physics_process(delta):
velocity = transform.basis.z * speed
move_and_slide()
anim.play("Loop")
anim.speed_scale = speed / 0.293 # one Loop = 0.293 m of travel// Import trout.glb with glTFast (com.unity.cloud.gltfast).
animator.Play("Loop");
animator.speed = speed / 0.293 // one Loop = 0.293 m of travelUse the gaitkit MCP server: get_variant({ "id": "trout", "want": "default look" })
then place the result.
# MCP endpoint
https://gaitkit.com/mcpKnobs
| Knob | Type | Values | Default | What it does |
|---|---|---|---|---|
species | choice | brown rainbow | brown | brown (brown trout: olive-brown back, golden flanks, black spots and red spots ringed pale, cream belly) or rainbow (rainbow trout: green-olive back with small black spots over the back and fins, a pink-red band along the side, silver belly). |
size | range | 0.6 to 1.5, step 0.05 | 1 | Uniform scale. 1 is a 45 cm adult; 0.6 is a 27 cm stream trout; 1.5 is a 68 cm trophy fish. |
seed | range | 1 to 40, step 1 | 5 | Seed for where the spots fall; every number is a different fish of the same species. |
Presets: river brown {"species":"brown"} · rainbow trout {"species":"rainbow"} · trophy brown {"species":"brown","size":1.4,"seed":17}
Files
| File | What |
|---|---|
| trout.glb | GLB, default look · 521 KB |
| trout.mjs | ES module, every knob live |
| trout.obj | OBJ, static; colours in the .mtl |
| trout.mtl | OBJ colours; keep it next to the .obj |
| trout-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.