Reef Aquarium — daylit tropical tank

Reef Aquarium preview: fifty small tropical fish of six kinds roaming in a sunlit daylit tank

A bright daylit tropical-aquarium Three.js scene that runs in the browser (WebGL2, three.js vendored locally, no network requests). A school of fifty tropical fish at half the previous size — clownfish (anemonefish, Amphiprioninae), blue tang (Paracanthurus hepatus), yellow tang (Zebrasoma flavescens), copperband butterflyfish (Chelmon rostratus, honestly stylized), royal gramma (Gramma loreto, honestly stylized) and pajama cardinalfish (Sphaeramia nematoptera, honestly stylized) — roams the full water volume under warm diffused daylight while the moving surface draws soft caustics on the beige photogrammetric sand. Grounded layered rock (Poly Haven boulders + a flat buried coastal-stone reef shelf — no floating slabs) and two scanned CC0 coral skeletons (staghorn Acropora and cup-coral Tubastraea, warm reconstruction tints, honestly labelled — not live coral) complete the reef. Drag to orbit, scroll or pinch to zoom, tap the water for ripples.

▶ START — Play Reef Aquarium

← Back to Play

Controls

Provenance

Original: Scottie (caustic-volume water/caustics core) — MIT License, Copyright (c) 2026 Scottie. Daylit tropical aquarium derived from the upstream single-file water/caustics core (random sea, GPU ripples, photon caustics, water/glass shaders reused): rubber duck and night-lamp rig removed; warm diffused daylight through the surface; real CC0 3D assets loaded from local game/assets/ with the vendored three.js r186 GLTFLoader — a school of 50 tropical fish at half the previous displayed length (0.13/0.20/0.165 m for the first three plus 0.17/0.11/0.12 m copperband/royal-gramma/pajama-cardinal; default six-species round-robin 9/9/8/8/8/8): by default an original spline-lofted school drawn with InstancedMesh (one draw per species part) — species-specific catmull-rom half-body silhouettes sampled into cross-section frames and lofted into one mesh, with separate dorsal/anal/caudal/pectoral/pelvic fins, iris/pupil eyeballs, painted species liveries (bands, palette marking, sail fins, scales, lateral line, operculum) and a steering-driven carangiform swim shader (technique after the three.js forum thread "A Fish of Splines"; original implementation, no demo code copied; honestly stylized-realistic, not photoreal) — with the first three species available as verified CC0 Quaternius GLBs via ?fishmodel=glb (GLB mode honestly caps at 3; the three extra spline species have no GLB) (poly.pizza, SkeletonUtils clones, Swimming_Normal clips, documented FBX colour-balance lift) plus instanced Poly Haven rock_07 boulders/pebbles (CC0, Jenelle van Heerden) and a flat, buried coast_rocks_01 reef shelf (CC0, laid flat on the sand — never standing slabs), and two Smithsonian Open Access (CC0) coral-skeleton scans (Acropora cervicornis staghorn + Tubastraea faulkneri mound, Draco-decoded, ~31.5k tris each, warm documented reconstruction tints, nestled replicas) over a pale natural sand-bed floor shader (AmbientCG Ground054 CC0 albedo + normal) with contact shadows; all PBR reef materials share an underwater optical grade (depth/camera attenuation, live-caustic shimmer scaled by a Caustics slider, bright aqua scatter lift) so fish, stone, coral, sand and water read as one sunlit volume; GPU-backend NaN hardening in the day sky and waterline meniscus (pow(0,y) clamps); resolution floor 55% with bubble-shedding eco step-down; three.js r186 vendored under game/vendor/ (no CDN); added a top-right #back link and license link. Simulation core unchanged. Real-asset provenance: SOURCES.md. Full license at /play/reef-aquarium/LICENSE. Game options: ?nofish=1 hide fish, ?fish=0..50 fish count (default 50; ?fish=4 shows four kinds at default diversity 6, 2/1/1 at diversity 3), ?t=8 fixed time, ?shot=1 deterministic full-resolution frame (preview capture), ?fishmodel=glb swim the CC0 Quaternius GLB models instead of the default spline-lofted school (correct, and heavier at 50 because each fish is a skinned clone). In-game panel adjusts waves, caustics, fish size (100% is the half-size school), live count 0..50, species diversity 1..6 (default 6; GLB mode caps at 3), lighting brightness and tank brightness. 100% lighting and tank brightness keep the original daylight. The fish checkbox still shows or hides the school.