drag to orbit · tap the ground to send it
Creature · Swims
Koi Fish
A 60 cm ornamental pond carp with patterned scales and flowing fins. Swims by distance: a body wave runs from the shoulders to the tail fin while the side fins paddle; it cruises 35 cm above the pond floor.
- Size
- 0.23 × 0.22 × 0.71 m
- Triangles
- 856
- Kit
- Underwater
Tune it
5 knobs: Pattern, Fin length, Barbels, Markings, Size.
Specs
- Size
- 0.23 × 0.22 × 0.71 m width × height × depth
- Triangles
- 856 of 6,000
- Draw calls
- 1 one vertex-colour material
- Loop clip
- 0.42 m of travel per cycle
- Altitude
- 0.35 m below the surface
- Moving parts
- 6 seg_1 · rotate, seg_2 · rotate, tail · rotate, pectoral_L · rotate, pectoral_R · rotate, body · rotate
- Knobs
- 5 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/koi-fish.mjs';
const koiFish = createAsset();
scene.add(koiFish); // rests on y = 0, front faces +Z
let dist = 0;
renderer.setAnimationLoop(() => {
dist += speed * clock.getDelta();
koiFish.position.set(0, groundY + koiFish.userData.altitude, dist);
koiFish.userData.tick(dist); // the body waves with the distance
renderer.render(scene, camera);
});import { useMemo, useRef } from 'react';
import { useFrame } from '@react-three/fiber';
import { createAsset } from 'https://gaitkit.com/cdn/koi-fish.mjs';
export function KoiFish({ speed = 1 }) {
const model = useMemo(() => createAsset(), []);
const dist = useRef(0);
useFrame((_, dt) => {
dist.current += speed * dt;
model.position.set(0, groundY + model.userData.altitude, dist.current);
model.userData.tick(dist.current); // the body waves with the distance
});
return <primitive object={model} />;
}# Import koi-fish.glb (download below). It carries an in-place "Loop" animation.
@onready var anim: AnimationPlayer = $KoiFish/AnimationPlayer
func _physics_process(delta):
velocity = transform.basis.z * speed
move_and_slide()
anim.play("Loop")
anim.speed_scale = speed / 0.42 # one Loop = 0.42 m of travel// Import koi-fish.glb with glTFast (com.unity.cloud.gltfast).
animator.Play("Loop");
animator.speed = speed / 0.42 // one Loop = 0.42 m of travelUse the gaitkit MCP server: get_variant({ "id": "koi-fish", "want": "default look" })
then place the result.
# MCP endpoint
https://gaitkit.com/mcpKnobs
| Knob | Type | Values | Default | What it does |
|---|---|---|---|---|
pattern | choice | kohaku showa ogon asagi tancho | kohaku | Koi variety: kohaku (white with red patches), showa (black with red and white), ogon (solid metallic gold), asagi (blue-grey back, orange belly and fins), tancho (white with one red spot on the head). |
fins | range | 1 to 2, step 0.1 | 1 | Fin and tail length. 1 is a standard koi; 2 is a long-finned butterfly koi with trailing fins. |
whiskers | toggle | on / off | true | The two pairs of whiskers (barbels) at the mouth. |
seed | range | 1 to 40, step 1 | 7 | Seed for where the colour patches fall; every number is a different fish of the same variety. |
size | range | 0.4 to 1.6, step 0.05 | 1 | Uniform scale. 1 is 60 cm; 0.4 is a young 25 cm koi; 1.6 is a 1 m jumbo. |
Presets: butterfly koi {"pattern":"showa","fins":2} · golden ogon {"pattern":"ogon","whiskers":true,"size":1.2} · tancho {"pattern":"tancho"}
Files
| File | What |
|---|---|
| koi-fish.glb | GLB, default look · 109 KB |
| koi-fish.mjs | ES module, every knob live |
| koi-fish.obj | OBJ, static, no colour |
| koi-fish-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.