# Animated fish model provenance

`cgi-fish-school.glb` is a third-party model downloaded on 2026-09-06 for the underwater redesign prototype. It is not an AI-generated model and is not original VibeVI artwork.

## Required attribution

“Animated Swimming Tropical Fish School Loop” by [LasquetiSpice](https://sketchfab.com/LasquetiSpice), licensed under [Creative Commons Attribution 4.0 International](https://creativecommons.org/licenses/by/4.0/).

[Original model and animation](https://sketchfab.com/3d-models/animated-swimming-tropical-fish-school-loop-62ccf83b35c744d7b5ffb7be80d4ea99).

The downloaded edition was repackaged with reduced textures by the [Open Water project](https://github.com/bob6664569/open-water). Its [third-party notices](https://github.com/bob6664569/open-water/blob/285b6ce32057c70191a7fe16c31d979fa383ac64/THIRD_PARTY_NOTICES.md) identify those adaptations and preserve the original creator and license. Preserve the creator, title, source and license links with redistribution, and describe any further modifications.

## Download record

- Downloaded public URL: https://raw.githubusercontent.com/bob6664569/open-water/main/site/assets/animals/tropical-fish-school-512.glb
- Source repository head observed during acquisition: `285b6ce32057c70191a7fe16c31d979fa383ac64`.
- Immutable source path: https://github.com/bob6664569/open-water/blob/285b6ce32057c70191a7fe16c31d979fa383ac64/site/assets/animals/tropical-fish-school-512.glb
- Git blob SHA reported by the GitHub Contents API: `961deb5fce57026b392f8d4e5152241764b88415`.
- Downloaded file size: **10,120,776 bytes** (9.65 MiB).
- Downloaded file SHA-256: `27B39A88AEDCFF15B31E8E827B9F4ADE35C3FAAC8304749928DCA6DE9C0F253E`.
- The GLB's embedded `asset.extras` independently identifies LasquetiSpice, the original Sketchfab URL, the work title, and `CC-BY-4.0`.
- No changes were made to the downloaded model during acquisition.

## Inspected model facts

- glTF 2.0 binary file; no external texture files required.
- One skeletal animation named `Animation`, approximately **40.9667 seconds**, with 228 animation channels.
- One skin with 148 joints; use a Three.js `AnimationMixer` on the loaded scene. Cloned animated instances need skeleton-aware cloning.
- Four meshes: `Object_0`, `Object_1`, `Object_2`, `Object_3`, each with one primitive and one material.
- **8,932 triangles** total, with 26,796 exported position vertices across the four meshes.
- Four materials named `material_0` through `material_3`; base color, normal and ambient-occlusion textures; all double-sided. Metallic factor 0 and roughness factor 0.58.
- Eighteen embedded PNG images, each 512 by 512 pixels.
- Nine individual fish root bones: three `Clown`, two `blue_tang`, two `moorish`, and two `Yellow`.
- Mesh accessor bounds are in source-local coordinates, approximately x -125 to 1679, y -0.52 to 504, z -406 to 406. Parent transforms, skinning and clip motion affect actual scene bounds; normalize the loaded scene using measured world bounds.

## Geographic scope

This is an illustrative tropical marine animation asset. Its clownfish, Moorish idols and yellow tangs do not establish an authentic Virgin Islands species roster. Do not label this collection as a scientific depiction of Virgin Islands wildlife or use its appearance to identify local snorkeling species. An authentic production scene should replace illustrative species with verified Caribbean models such as blue tangs of the appropriate Atlantic species, sergeant majors, parrotfish, grunts and turtles.

The live prototype may add placement, lighting, playback or material adjustments separately; those do not change the acquisition record above.

## Optimized prototype edition

`cgi-fish-school-optimized.glb` is a VibeVI adaptation of the acquired file under the same CC BY 4.0 license. Retain the attribution above when distributing it.

- Size: **630,908 bytes**; gzip level 9: **349,776 bytes**; Brotli: **235,620 bytes**.
- SHA-256: `bd9de199e451583ac556dacf3c49b11063d522a0b044d622247087b4feacb88e`.
- Retains **two blue tangs and two yellow tangs** as illustrative tropical wildlife. The geographical caveat above still applies, including the distinction between Pacific regal blue tangs and Caribbean Atlantic blue tangs.
- Retained meshes: `Object_1` and `Object_3`, with original material names `material_1` and `material_3`. Clownfish and Moorish idols, unused textures, and their unneeded animation and skeleton nodes were removed.
- Four fish, **3,972 triangles**, **2,666 vertices**, **50 scene nodes**, **36 skin joints**, **68 skeletal animation channels**. The original approximately 40.97-second animation duration remains.
- Duplicate triangle vertices were welded within 0.00001 source units. All retained triangle positions compare exactly to the acquired file. Tangent attributes were omitted so the renderer derives the tangent basis from geometry and UV coordinates.
- Uses `KHR_mesh_quantization`: signed normalized 8-bit normals, normalized 16-bit UV coordinates, normalized 8-bit skin weights, and unsigned 8-bit joint indices. Position coordinates remain float32. All vertex attributes obey 4-byte alignment rules.
- Seven embedded JPEGs: base color maps at 256 by 256 pixels, normal/occlusion/emissive maps at 128 by 128 pixels. Texture payload is **48,994 bytes**. Original material properties and mapped texture functions are preserved.
- Animation reduction adapts to the original motion, retaining rapid fin changes. It uses a 0.012-radian rotation simplification tolerance and reduces redundant Float32 animation precision to 14 mantissa bits. Animation time values remain float32. A uniform 12 Hz experimental version was superseded because it missed rapid fin reversals.
- Original payload breakdown: 3,649,200 texture bytes, 4,273,048 animation accessor bytes, and 2,198,528 other bytes. Optimized payload: 48,994 texture bytes, 98,480 geometry bytes, 446,000 animation bytes, 2,304 inverse-bind-matrix bytes, and 35,096 JSON bytes, plus binary headers/alignment.

### Verification

The reproducible optimizer and validator live beside the asset. The validator checks container size, accessor alignment and bounds, finite values, node/mesh/joint references, index correspondence, weight sums, quaternion normalization, increasing animation timestamps and output counts. It also compares the reduced animation against the original source keys.

- Retained mesh position difference: **0**.
- Maximum normalized skin-weight sum error: approximately **1.1e-16**.
- Across **39,762 original rotation samples**, the largest bone-rotation deviation is **0.6881 degrees**; the 99th percentile is **0.6483 degrees**.
- Maximum quaternion length error is **0.0000442**.
- Maximum local translation-coordinate deviation is **0.2491 source units**, before the source model's small parent scale transforms.

These are asset-level structural and numeric checks; browser appearance, lighting, animation pacing and runtime performance must also be inspected in the actual scene.
