Bab 2: Sepuluh Spesies Ikan

Bab ini membahas semua ikan di folder FishAssets/, dibuat untuk game memancing orang pertama (RealityKit, iPad/macOS). Tiap ikan diekspor jadi 4 klip animasi baku: Cruise (berenang santai berpatroli), Bite (menyambar umpan), Caught (meronta setelah tertangkap), dan Preview (idle berputar untuk tampilan koleksi). Tiap klip diekspor sepasang: file .glb dan .usdz. Selain 10 ikan inti, ada juga dua ikan tambahan di luar roster inti (Clownfish dan Blue Tang) yang dibahas juga karena foldernya memang ada di repo dan sudah diperiksa langsung.

Patokan skala: 1 unit Blender = 1 meter di dunia nyata.

Ringkasan status semua ikan

No Nama Nama ilmiah Status Catatan singkat
01 Clownfish Amphiprion ocellaris Di luar roster inti Hanya 1 animasi asli, 4 file .glb identik byte-per-byte, tidak ada .usdz sama sekali
02 Blue Tang Paracanthurus hepatus Di luar roster inti Sama seperti Clownfish: hanya 1 animasi asli, tidak ada .usdz
03 Blue Marlin Makaira nigricans Selesai 4 state lengkap glb+usdz; Caught diperbarui ulang 2026-07-21
04 Atlantic Bluefin Tuna Thunnus thynnus Selesai Rig 98-bone bawaan; sempat gelap total gara-gara bug DomeLight, sudah diperbaiki
05 Giant Trevally Caranx ignobilis MASIH RUSAK Mesh Preview masih sobek/berduri di area kepala-insang-sirip punggung; belum diperbaiki, butuh rebuild total dari sumber mentah
06 Mekong Giant Catfish Pangasianodon gigas Selesai (spesies pengganti) Model asli tidak ada yang gratis; dipakai model Pangasius (ikan patin) satu famili sebagai pengganti
07 Yellowfin Tuna Thunnus albacares Selesai Bug normal Preview sudah diperbaiki tuntas (CP43)
08 Skipjack Tuna Katsuwonus pelamis Selesai Mesh Preview paling parah kotor di antara semua ikan, sudah dibersihkan tuntas (CP47)
09 Grouper Epinephelus awoara Selesai (spesies pengganti) "Kerapu" umum, bukan spesies spesifik; mesh Preview dibersihkan tuntas (CP48)
10 Sailfish Istiophorus platypterus Selesai Skor sourcing tertinggi di seluruh proyek (89/100) β€” sudah rig dan animasi bawaan sejak awal

Catatan penting yang harus digarisbawahi: dari 10 ikan roster inti (03–10), hanya Giant Trevally (Fish05) yang masih rusak secara mesh/topologi. Jangan pernah melaporkan Giant Trevally sebagai "selesai" β€” statusnya jelas belum. Empat spesies (Trevally, Skipjack, Grouper, Yellowfin) juga masih punya bug lain yang belum diperbaiki di sumbernya: material USDZ mereka kosong (dijelaskan di bagian catatan lintas-spesies di akhir bab ini).

1. Clownfish (di luar roster inti β€” slot ikan hias terumbu)

Identitas spesies: nama umum Clownfish (ikan badut/anemonefish), nama ilmiah Amphiprion ocellaris. Tidak ada dokumen Scientific_Validation.md untuk ikan ini β€” artinya ikan ini tidak masuk jalur validasi ilmiah formal yang dipakai untuk ikan-ikan berikutnya.

Sumber model: diambil dari Sketchfab, dibuat oleh kreator fabip, UID eb4e28aecc134d259c7c80ab92377cdc. Lisensinya CC-BY (wajib mencantumkan kredit): "Clownfish by fabip on Sketchfab". Ada 9 kandidat model yang dipertimbangkan. Yang ditolak antara lain: model 29.400 tris tanpa lisensi jelas (otomatis ditolak), model kartun animasi 1.500 tris (terlalu rendah poli/gaya kartun), dua model rigged/animated bagus dari Fab.com (ditolak murni karena berbayar), dan satu model hasil AI dari Meshy.ai (ditolak karena anatominya kurang presisi). Model fabip menang dengan skor 65/100: jumlah segitiga pas (20.654 tris), file native Blender, lisensi longgar, tapi belum ada rig/animasi dan kualitas tekstur belum diketahui saat dipilih.

Riwayat pembuatan: spesifikasi asli 20.654 tris, 11.127 verts, tekstur PNG 2048Γ—2048 (4 material), tanpa rig, tanpa animasi. Diskalakan ulang dari sekitar 2 m menjadi 0,08 m (8 cm) β€” ukuran clownfish sesungguhnya. Material dibangun ulang dari campuran Glossy+Diffuse menjadi Principled BSDF (Base Color + Roughness dari gambar bawaan, Normal dari peta normal 2048Γ—2048 tersendiri, Clearcoat 0,3, Subsurface 0,1).

Rig-nya adalah armature custom 10-tulang: Root, Spine, Spine.001, Tail, Head, Dorsal_Fin, Anal_Fin, Caudal_Fin, Pectoral_Fin_L, Pectoral_Fin_R.

Bug yang ditemukan dan diperbaiki:

  • Vertex mesh awalnya berada di koordinat dunia (144, βˆ’5, 70) sementara armature ada di titik asal (origin) β€” akibatnya ikan jadi tidak terlihat sama sekali. Diperbaiki dengan memindahkan semua vertex kembali ke origin.
  • Fitur auto-weight ("Bone Heat") gagal total (error "failed to find solution") β€” diganti dengan pembobotan manual berbasis zona anatomi (falloff Gaussian dari pusat tulang; hasil akhir misalnya Head 93,8%, Spine 36,1%, Tail 3,8%, Dorsal_Fin 0,6%).
  • Pembersihan transform tanggal 2026-07-14 memverifikasi ulang ikatan rig-mesh: deformasi vertex 76–100% di semua tulang uji, 9 vertex group untuk 10 tulang (root memang tidak punya grup, ini wajar).

4 klip animasi dibuat pada 2026-07-14 (menurut Source_Log): Cruise 60 frame (renang lincah, 3 siklus goyang badan, 6 siklus kibas ekor), Bite 24 frame (menerkam/hentakan kepala/dorongan ekor), Caught 72 frame (10 siklus meronta panik dengan peluruhan eksponensial), Preview 48 frame (idle mengangguk/bergoyang). Saat itu diekspor sebagai 4 file GLB terpisah (~3,79 MB masing-masing).

Status saat ini β€” ada ketidaksesuaian antara dokumen dan file sungguhan: isi folder hanya Cruise/Clownfish_Cruise.glb, Bite/Clownfish_Bite.glb, Caught/Clownfish_Caught.glb, Preview/Clownfish_Preview.glb. Tidak ada file .usdz sama sekali untuk state apa pun. Setelah diverifikasi lewat checksum SHA-256: keempat file .glb tersebut identik byte-per-byte (hash sama, ukuran sama persis 3.972.180 byte) padahal Source_Log mendeskripsikan 4 animasi berbeda dengan jumlah frame berbeda (60/24/72/48). Ini cocok dengan klaim CLAUDE.md di root repo bahwa 3 state Clownfish lainnya adalah "duplikat identik byte" β€” dan ini sudah dikonfirmasi benar terhadap file sungguhan, bukan cuma asumsi dari dokumen. Artinya, apa pun data animasi berbeda yang dibuat pada 2026-07-14, file yang benar-benar ada di repo sekarang semuanya berisi satu klip yang sama (kemungkinan besar klip Cruise, karena hanya file itu yang waktu modifikasinya lebih baru β€” 18 Juli β€” dibanding tiga file lain yang bertanggal 14 Juli β€” cocok dengan dugaan hanya Cruise yang pernah disentuh ulang/diekspor ulang, sementara tiga file lain ditinggalkan sebagai salinan duplikat lama).

Kesimpulan status: Clownfish hanya punya satu animasi asli, tidak punya ekspor USDZ, dan berada di luar roster 10 spesies inti yang sudah selesai. Jangan digambarkan sebagai "selesai" setara dengan 10 spesies inti.

Kewajiban lisensi/atribusi: "Clownfish by fabip on Sketchfab" β€” CC-BY, wajib dicantumkan kreditnya jika dipakai di produk akhir.

2. Blue Tang (di luar roster inti β€” slot ikan hias terumbu)

Identitas spesies: nama umum Blue Tang / Regal Tang / Palette Surgeonfish / Hippo Tang, nama ilmiah Paracanthurus hepatus. Taksonomi: Actinopterygii β†’ Acanthuriformes β†’ Acanthuridae (ikan botana/surgeonfish) β†’ Paracanthurus. Ciri pengenal utama: badan oval pipih menyamping seperti "panekuk"; warna biru royal dengan pola hitam tebal berbentuk "palet"/baji yang mengelilingi bulatan biru di tiap sisi tubuh; sirip ekor cabang dua berwarna kuning cerah bergaris hitam di tepinya; duri tajam yang bisa ditarik masuk di pangkal ekor (dipakai untuk pertahanan diri). Ikan muda berwarna kuning dengan corak biru-hitam sebelum berubah jadi warna dewasa. Panjang maksimum 31 cm, umumnya 20–25 cm, berat sekitar 600 gram. Herbivora/pemakan alga, hidup di terumbu Indo-Pasifik Barat, status IUCN Least Concern (risiko rendah). Cara berenangnya labriform (didorong sirip dada), sama seperti Clownfish.

Sumber model: Sketchfab, kreator bronze82, UID d06263fcde564bbc90af26a914d18b44. Lisensi CC-BY: "BlueTang by bronze82 on Sketchfab". Ada 7 kandidat dipertimbangkan. Yang ditolak antara lain: model 12.900 tris tanpa rig, nol unduhan/nol deskripsi (kandidat 2); model dengan geometri identik tapi berlisensi CC-BY-NC alias non-komersial (kandidat 3, otomatis gugur karena lisensinya tidak cocok); model "Major" 1.100 tris (kandidat 4, jauh di bawah batas minimum 20 ribu tris); dan dua model bagus berbayar dari Mikhail Nesterov di Fab.com β€” satu dengan rig + 22 animasi, satu lagi dengan animasi berenang berkelompok β€” keduanya ditolak murni karena berbayar (kandidat 5–6). bronze82 menang dengan skor 70/100: 51.100 tris (masih dalam rentang LOD0 5 ribu–80 ribu), CC-BY, 181 unduhan/8 like sebagai bukti validasi komunitas, tapi belum ada rig/animasi dan hanya punya satu tekstur diffuse resolusi rendah 1024Γ—1024.

Riwayat pembuatan: spesifikasi asli 51.136 tris, 26.412 verts, tekstur JPEG diffuse-only 1024Γ—1024, 1 material, belum ada rig/animasi. Diskalakan ulang dari sekitar 11,9 unit Blender menjadi 0,31 m (31 cm, ukuran maksimum dewasa yang dilaporkan). Diposisikan ulang ke titik pusat. Material dibangun ulang jadi Principled BSDF: JPEG diffuse β†’ Base Color, roughness disintesis dari diffuse lewat ColorRamp (rentang 0,4–0,7), Coat Weight 0,3, Subsurface Weight 0,1.

Rig-nya sama seperti Clownfish: armature custom 10-tulang standar (Root, Spine, Spine.001, Tail, Head, Dorsal_Fin, Anal_Fin, Caudal_Fin, Pectoral_Fin_L, Pectoral_Fin_R). Pembobotan pakai metode yang sama (zona anatomi falloff Gaussian β€” auto bone-heat weighting tidak dicoba/gagal dengan cara yang sama pada ikan-ikan awal proyek ini).

Bug yang diperbaiki: pembersihan transform pada 2026-07-14 menemukan mesh badan bergeser dari armature sejauh (βˆ’2,68, 1,31, 0,65) setelah proses import β€” diperbaiki dengan mereset posisi badan ke origin dan menerapkan (apply) semua transform. Ikatan rig-mesh diverifikasi ulang setelahnya: deformasi vertex 98%+ di semua tulang uji.

4 klip animasi dibuat pada 2026-07-14: Cruise 60 frame (goyangan lembut 2 siklus, kibas ekor 4 siklus), Bite 24 frame (menerkam maju/hentakan kepala/dorongan ekor), Caught 72 frame (meronta panik dengan peluruhan eksponensial + sirip mekar), Preview 48 frame (idle mengangguk). Diekspor sebagai 4 file GLB (~3,33 MB masing-masing).

Status saat ini β€” ketidaksesuaian yang sama seperti Clownfish: isi folder hanya Cruise/BlueTang_Cruise.glb, Bite/BlueTang_Bite.glb, Caught/BlueTang_Caught.glb, Preview/BlueTang_Preview.glb. Tidak ada file .usdz. Diverifikasi lewat checksum SHA-256: keempat file .glb identik byte-per-byte (hash sama, ukuran sama persis 3.493.036 byte), lagi-lagi cocok dengan klaim "duplikat identik byte" di CLAUDE.md root untuk Blue Tang. Hanya waktu modifikasi file Cruise (18 Juli) yang berbeda dari tiga file lain (14 Juli), pola yang sama persis dengan Clownfish.

Kesimpulan status: tepat satu animasi asli, tidak ada USDZ, di luar roster 10 spesies inti yang sudah selesai.

Kewajiban lisensi/atribusi: "BlueTang by bronze82 on Sketchfab" β€” CC-BY, wajib dicantumkan kreditnya jika dipakai.

3. Blue Marlin (roster inti)

Identitas spesies: nama umum Blue Marlin / Atlantic Blue Marlin, nama ilmiah Makaira nigricans. Taksonomi: Actinopterygii β†’ Istiophoriformes β†’ Istiophoridae (ikan-ikan bertombak/billfish) β†’ Makaira. Ciri pengenal: badan silinder di bagian depan sirip anal, memipih menyamping di bagian belakang; tengkuk sangat tinggi (ciri khas pembeda); moncong panjang berbentuk tombak dengan penampang bulat; punggung biru kobalt sampai biru kehitaman, perut putih keperakan; sekitar 15 baris bintik/garis kobalt pucat di sisi tubuh; sirip punggung pertama sangat tinggi (lobus segitiga di depan, 40–45 jari sirip) yang miring tajam ke belakang; sirip ekor besar bercabang kuat dengan 2 lunas (keel) di pangkal ekor; sirip dada panjang runcing yang bisa dilipat rapat ke badan. Panjang maksimum 500 cm, umumnya 290 cm, berat maksimum 820 kg. Cara berenang sub-carangiform sampai thunniform (badan belakang kaku, dorongan kuat dari sirip ekor). Hidup di perairan tropis pelagis seluruh dunia, status IUCN Least Concern tapi ditangkap secara intensif.

Sumber model β€” perjalanan pencarian yang berliku: pencarian awal tidak menemukan model Marlin gratis yang layak pakai β€” hasil pencarian "marlin" di Sketchfab didominasi senapan merek Marlin, dan sedikit hasil ikan billfish yang ada berlisensi NoAI atau berbayar. Kesimpulan awal saat itu: "harus generate pakai AI Hunyuan3D." Setelah disapu ulang pada 2026-07-16 (CP34), ternyata kesimpulan sebelumnya adalah bug β€” pengecekan lisensi sebelumnya mengacu ke field slug yang ternyata tidak ada, dan kata kunci pencarian terlalu sempit. Pencarian yang diperbaiki dengan kata kunci "blue marlin / marlin fish / billfish / swordfish / sailfish / black/striped marlin / xiphias" menemukan beberapa model billfish CC-BY yang layak pakai.

Model yang dipilih: "Blue Marlin" oleh Gotta_go_evil_Fast, UID Sketchfab 7d5e0636ff5e4d41820b30aefc0669ba (catatan: dokumen Asset_Candidates juga mencantumkan UID lain yang tidak konsisten, 8ef4..., untuk kandidat tak terkait yang ditolak β€” UID yang benar dan dipakai untuk unduhan serta atribusi adalah 7d5e... sesuai Source_Log.md). Lisensi CC-BY 4.0 (wajib atribusi). Kandidat lain yang ditolak pada penyapuan ulang: scan pahat 57.420 tris yang bentuknya benar tapi sama sekali tanpa tekstur (oleh indriyanitini83); model AI Meshy 92.698 tris Black Marlin dan 87.914 tris Striped Marlin (keduanya melebihi batas atas LOD0). Model pemenang mendapat skor 73/100: siluet billfish yang benar (moncong, sirip punggung tinggi, ekor cabang, sirip dada), tekstur diffuse 2K, mesh game bersih 8.280 tris, tapi belum ada rig/animasi.

Riwayat pembuatan: spesifikasi asli 8.280 tris, 4.132 verts, tekstur diffuse 2K + specular-gloss 2K, tanpa rig. Hierarki empty-node bawaan hasil import Sketchfab yang dalam dibersihkan dan semua transform bawaan diterapkan. Diputar ulang 180Β° pada sumbu Z supaya kepala/moncong menghadap βˆ’Y dan ekor cabang menghadap +Y (konvensi proyek), punggung menghadap +Z. Dilakukan dengan langsung menegasikan koordinat vertex karena operator transform_apply di Blender diam-diam tidak berefek (no-op) lewat konteks eksekusi MCP. Diskalakan ulang ke total panjang 3,0 m, dipusatkan ke origin. Material disederhanakan dari campuran spec-gloss menjadi Principled BSDF bersih (JPEG diffuse β†’ Base Color, roughness 0,4, coat 0,3, subsurface 0,05); node gambar spec-gloss dibuang.

Rig-nya adalah armature custom 11-tulang: Root (+Y), Spine_00/01/02, Head (mencakup moncong+bill), Tail, Caudal_Fin, Dorsal_Fin, Anal_Fin, Pectoral_Fin_L/R. Pembobotan pakai metode inverse-distance-to-bone-segment berbasis zona (pangkat 4, 3 pengaruh teratas, dinormalisasi) β€” auto-weight bone-heat memang dicatat tidak bisa diandalkan di seluruh proyek ini. Hasil verifikasi: 0 vertex tanpa bobot, tidak sobek pada pose uji (perpindahan maksimum 0,52, rata-rata 0,04).

4 klip animasi: Cruise 48 frame (2,0 detik), Bite 24 frame (1,0 detik, 2Γ—), Caught 72 frame (3,0 detik, meronta), Preview 48 frame (2,0 detik) β€” semuanya dibuat sebagai gelombang sinus merambat dari kepala ke ekor (gaya thunniform: badan kaku, dorongan sirip ekor), amplitudo membesar ke arah ekor, berbeda fase, disetel ke jumlah siklus bulat supaya setiap state bisa diputar berulang mulus (terverifikasi celah loop = 0,0 pada keempat state lewat perbandingan titik akhir mesh yang sudah dideformasi β€” pemeriksaan yang sama yang menangkap "bug loop" pada Sailfish, jadi Marlin memang sengaja dicek dengan teliti).

Bug/keanehan yang tercatat: root node hasil ekspor GLB memakai rotasi identitas [0,0,0,1] (berbeda dari ikan lain yang memakai [-0.7071,0,0,0.7071]) karena konversi βˆ’90Β° Z-upβ†’Y-up langsung dipanggang ke data mesh, bukan ke root node, khusus untuk Marlin β€” sudah diverifikasi setara secara fungsional dengan mengimpor ulang dan mengonfirmasi orientasi dunia yang identik dengan Sailfish, jadi ini keanehan yang tidak berbahaya, bukan bug. Juga: operator transform_apply/rotate-lalu-apply diam-diam tidak berefek lewat konteks eksekusi MCP add-on ahujasid; diatasi dengan matematika vertex langsung pada data mesh untuk flip orientasi, dan temp_override eksplisit untuk operator edit/pose armature.

Kejadian belakangan (CP49, 2026-07-21): ditemukan file kerja Marlin.blend kehilangan action Bite/Caught/Preview β€” hanya Cruise yang tersisa (dikonfirmasi lewat backup .blend1, yang juga tidak punya ketiganya). File ekspor yang sudah terlanjur dirilis masih menyimpan datanya, jadi dipulihkan dengan mengimpor ulang Caught.glb yang sudah dirilis, mengonversi keyframe quaternion-nya ke Euler XYZ, dan membangun ulang action dari situ. Dua bug ditemukan dan diperbaiki selama proses pemulihan ini, keduanya temuan umum untuk proyek ini (bukan cuma soal Marlin):

  1. Bug rotasi gabungan (compound-rotation): synthesizer animasi menulis sudut yang sama ke ketiga sumbu Euler sekaligus saat sebuah tulang punya keyframe di lebih dari satu sumbu, sehingga secara visual saling meniadakan jadi nyaris tidak bergerak. Diperbaiki dengan mendeteksi sumbu dominan tiap tulang (rentang keyframe asli terbesar) dan hanya menggerakkan sumbu itu.
  2. Bug action-slot yang tidak terikat (unbound action-slot): sistem layered-action Blender 5.x mengharuskan AnimData.action_slot diikat ulang secara eksplisit ketika sebuah action dipindah dari satu objek armature ke objek lain (misalnya dari rig import sementara ke rig sungguhan) β€” kalau tidak, data keyframe mentahnya benar tapi pose hasil evaluasinya diam-diam jadi salah/lebih kecil. Diperbaiki dengan mengeset action_slot secara eksplisit setelah setiap penugasan ulang.

Setelah itu, animasi Caught baru yang lebih "ngamuk" (meronta lebih keras) dibuat dan diekspor untuk Marlin sebagai bagian dari rollout 7 spesies (lihat bagian catatan lintas-spesies di akhir bab) β€” diverifikasi tidak sobek lewat rangkaian render.

Status saat ini: keempat state terverifikasi ada di disk sebagai pasangan .glb+.usdz lengkap (Cruise/Bite/Caught/Preview). Selesai dan sudah dirilis. State Caught dianimasikan ulang (lebih keras/ganas) per 2026-07-21 dan diekspor ulang; proses pemulihan data animasi yang hilang berhasil rapi sesuai catatan CP49.

Kewajiban lisensi/atribusi: "Blue Marlin" by Gotta_go_evil_Fast β€” lisensi CC-BY 4.0 (https://sketchfab.com/3d-models/blue-marlin-7d5e0636ff5e4d41820b30aefc0669ba). Wajib atribusi.

4. Atlantic Bluefin Tuna (roster inti)

Identitas spesies: nama umum Atlantic Bluefin Tuna, dikenal juga sebagai "Toro" atau "Maguro", nama ilmiah Thunnus thynnus. Taksonomi: Actinopterygii β†’ Scombriformes β†’ Scombridae β†’ Thunnus. Ciri pengenal: badan fusiform berbentuk torpedo, penampang hampir bulat sempurna, paling dalam di dekat sirip punggung pertama; punggung biru-hitam metalik, perut putih keperakan; sirip dada sangat pendek (kurang dari 80% panjang kepala β€” ciri pembeda utama dari spesies Thunnus lain); ekor bercabang bulan sabit (lunate) yang kuat dengan 3 lunas (lunas tengah hitam pada ikan dewasa) di pangkal ekor; finlet kuning bertepi hitam berbaris dari sirip punggung/anal menuju ekor; mampu mengatur suhu tubuh di atas suhu air sekitarnya (jarang dimiliki ikan bertulang). Panjang maksimum 458 cm, umumnya 200 cm, berat maksimum 684 kg, kecepatan kejut hingga 72,5 km/jam. Perenang thunniform β€” badan depan nyaris kaku, osilasi terkonsentrasi di pangkal ekor, kibasan ekor sekitar 1 Hz. Status IUCN Endangered (terancam punah akibat penangkapan berlebih untuk sushi/sashimi).

Sumber model: 6 kandidat awal semuanya gagal memenuhi batas segitiga LOD0: dua photoscan CC0/CC-BY masing-masing sekitar 2,3 juta dan 3,3 juta tris (29–40 kali di atas batas atas 80 ribu); tiga model CC-BY jauh di bawah batas bawah 20 ribu tris (5.600–26.400 tris); satu opsi CGTrader hanya berbayar. Kesimpulan awal saat itu: "harus generate pakai AI Hunyuan3D." Kandidat 7 (pemenang, ditemukan pada penyapuan yang sama): dhjwdwd, UID Sketchfab 642c6515d893474a8fc8f129491efcac. CC-BY. Sekitar 13.840 tris (6.920 face), sudah rig (98 tulang, disebut "ExportRIG") dan sudah beranimasi (siklus renang 60 frame, "FishSwim.012"), tekstur PBR 4K lengkap (BaseColor/MetallicRoughness/Normal). Skor 85/100 β€” jauh yang terbaik di seluruh proyek pada titik itu, karena sudah punya rig+animasi profesional siap pakai.

Riwayat pembuatan: objek hasil import diganti nama supaya rapi di scene (BluefinTuna_Body, BluefinTuna_Armature). Diskalakan ke 3,0 m, dipusatkan ke origin. Rig-nya tetap memakai armature profesional bawaan 98-tulang dari sumbernya (tidak dibangun ulang) β€” ini satu-satunya ikan di roster yang memakai rig kompleks multi-tulang-per-jari-sirip bawaan, bukan rig custom 10/11-tulang standar proyek.

Bug yang ditemukan dan diperbaiki (beberapa putaran):

  1. GLB awal kegemukan (54 MB, lalu 17,9 MB setelah diperkecil) akibat tekstur 4K β€” diperkecil menjadi 2K.
  2. Hasil import Sketchfab menyisakan 20 node kosong (empty) dan satu salinan duplikat seluruh model β€” dibersihkan, disisakan satu salinan bersih; armature tersarang 5 tingkat di dalam empty-empty dengan transform yang sudah dipanggang β€” rantai parent dibersihkan, semua transform diterapkan, mesh badan disejajarkan ulang ke armature (selisihnya adalah skala 0,919 + pergeseran posisi).
  3. Action hilang: pada suatu titik 3 dari 4 action baku (Cruise/Bite/Caught, menyisakan hanya Preview) terhapus dari file .blend kerja β€” penyebab akarnya diidentifikasi sebagai Blender yang menghapus action non-aktif tanpa use_fake_user saat proses pembersihan data yatim (orphan data purge). File GLB per-state yang sudah terlanjur dirilis masih menyimpan keempat action, mengonfirmasi kehilangan data hanya terjadi di file kerja.
  4. Hanya 22 dari 98 tulang yang benar-benar dianimasikan, dengan amplitudo sekecil 0,003–0,006 radian (sekitar 0,2Β°) β€” rantai sekitar 50 tulang jari sirip punggung dan sebagian besar segmen sirip dada/anal diam kaku sementara badan bergerak, terlihat seperti "badan kaku, sirip plastik statis." Ini penyebab utama laporan bug "animasi tidak natural."
  5. Ekspor USDZ memanggang warna latar World scene yang nyaris hitam (0,051, 0,051, 0,051) menjadi sebuah DomeLight, karena convert_world_material=True adalah default exporter β€” ini membuat model tampak hampir hitam total di Reality Composer/RealityKit dan adalah penyebab sesungguhnya dari laporan bug "kulit kosong/blank" (material sebenarnya baik-baik saja; pencahayaan yang bermasalah). Ini adalah kejadian yang dirujuk di CLAUDE.md root (CP24) sebagai alasan kenapa sky_dome.usdz tidak boleh pernah menyisipkan Light prim.
  6. Setiap ekspor GLB per-state ikut membawa keempat action sekaligus karena setting default glTF export_animation_mode='ACTIONS' mengekspor semua action pada armature, bukan cuma yang aktif β€” jadi Cruise.glb tidak selalu memutar klip Cruise yang benar.

Perbaikan: keempat action dibangun ulang dari nol (Cruise 90 frame, Bite 30 frame, Caught 90 frame, Preview 60 frame) mencakup seluruh rantai tulang (tulang belakang penuh, kedua lobus ekor, kedua sirip dada Γ— 6 segmen masing-masing, kedua sirip anal, seluruh 15 rantai jari sirip punggung Γ— 3 tulang masing-masing, sirip punggung kedua/finlet, sirip punggung bawah, dan rahang), dengan amplitudo mengecil dari kepala ke ekor (gaya thunniform, sekitar 0,5Β° di kepala hingga sekitar 18Β° di ujung ekor). Keempat action baru diberi use_fake_user=True supaya bug orphan-purge tidak terulang. Ekspor USDZ diset convert_world_material=False, export_lights=False; ekspor GLB diset export_animation_mode='ACTIVE_ACTIONS'.

Regresi sobekan mesh ditemukan segera setelah perbaikan di atas: animasi hasil rebuild terlihat benar di render terpisah tapi sobek nyata di Reality Composer (jari-jari sirip punggung lepas, segmen sirip patah-patah). Penyebab akarnya: banyak vertex dekat pangkal sirip dibobot secara halus lintas beberapa rantai tulang independen sekaligus (misalnya satu vertex di pangkal sirip punggung membawa bobot pada 3 jari sirip berbeda sekaligus; pangkal sirip dada dan anal saling tumpang tindih bobot hingga 84%). Rebuild pertama memberi tiap rantai fase/ frekuensi/sumbu independen sendiri-sendiri, yang justru menarik vertex bersama itu terpisah. Perbaikannya: menyatukan fase (diturunkan dari posisi Y rest-pose tulang lewat fungsi bersama body_phase()) dan frekuensi di semua rantai, serta meredam amplitudo mendekati nol untuk sekitar 45% pertama tiap rantai sirip (area yang berbagi bobot lintas-rantai), baru membesar di segmen luar yang bobotnya bersih. Dicatat sebagai pelajaran umum: jangan pernah menganggap rantai tulang bernama berbeda pasti mekanis independen hanya karena namanya berbeda secara semantik β€” selalu cek dulu bobot vertex group yang saling tumpang tindih.

Keterbatasan tekstur yang diketahui: tekstur badan yang ada di disk resolusinya 512Γ—512 (baik di folder textures/ maupun yang dibundel di .blend), turun dari resolusi 2K yang tercatat di dokumen β€” sumber resolusi lebih tinggi aslinya sudah hilang (folder Model/ kosong) dan perlu diunduh ulang dari Sketchfab UID 642c6515d893474a8fc8f129491efcac untuk dipulihkan.

Bug normal ekspor Preview (CP43, 2026-07-20): mesh Preview Bluefin punya 16 pulau mesh terpisah dan 1.196 edge non-manifold yang menyebabkan tingkat face terbalik 5,23% saat diekspor. Sudah diperbaiki β€” customdata_custom_splitnormals_clear() lalu normals_make_consistent() menurunkannya jadi 0,26%. Diekspor ulang dan dikonfirmasi. Gejala "tekstur kosong" yang dilaporkan untuk Bluefin sudah diselidiki dan tidak bisa direproduksi di level file β€” PNG BaseColor 512Γ—512 memang tekstur yang dicat dengan benar, dan sampling UV tidak menemukan bukti bug latar abu-abu.

CP49 (2026-07-21): animasi Caught "ngamuk" baru diluncurkan (lihat catatan lintas-spesies) β€” rig 96-tulang Bluefin memang butuh pemisahan kelas tulang primer/sekunder sejak awal karena gerakan sumber aslinya terlalu halus untuk sekadar diperbesar amplitudonya.

Status saat ini: keempat state terverifikasi ada di disk sebagai pasangan .glb+.usdz. Ada juga file BluefinTuna.usdz di level akar folder spesies (file "hero" showcase, state Cruise). Selesai dan sudah dirilis; normal mesh Preview sudah diperbaiki dan dikonfirmasi (satu dari hanya 2 spesies yang tuntas diperbaiki di CP43, yang satu lagi Yellowfin); Caught dianimasikan ulang 2026-07-21.

Kewajiban lisensi/atribusi: CC-BY (dhjwdwd, UID Sketchfab 642c6515d893474a8fc8f129491efcac) β€” wajib atribusi; teks kredit persis harus diambil dari tabel sumber Source_Log.md untuk layar kredit game.

5. Giant Trevally (roster inti) β€” MASIH RUSAK, jangan dirilis apa adanya

Identitas spesies: nama umum Giant Trevally / Giant Kingfish, dikenal juga sebagai "Ulua", nama ilmiah Caranx ignobilis. Taksonomi: Actinopterygii β†’ Carangiformes β†’ Carangidae β†’ Caranx. Ciri pengenal: badan oval, memipih sedang; profil kepala curam, nyaris lurus (ciri diagnostik); dimorfisme seksual kuat β€” ikan muda/betina dewasa berwarna abu-abu keperakan, jantan dewasa gelap sampai hitam legam; garis-garis pucat tipis + bintik hitam kecil di tubuh bagian atas; tidak ada bintik hitam di tutup insang (pembeda dari trevally jenis lain); sirip dada berbentuk sabit (falcate) lebih panjang dari kepala; ekor bercabang kuat; lengkungan garis rusuk (lateral line) yang jelas dengan 26–38 sisik keras (scutes). Panjang maksimum 170 cm (terbesar di genus Caranx), berat maksimum 80 kg. Perenang carangiform (lenturan badan belakang, dorongan ekor bercabang). Status IUCN Least Concern.

Sumber model: Sketchfab, kreator ffishAsia-and-floraZia, UID e6446df50ba746ed8ce8a3dd66b3b8e8 ("CC0 Giant Trevally"). Lisensi CC0 Public Domain β€” tidak wajib atribusi. Hanya 2 kandidat ditemukan; alternatif CGTrader berbayar langsung ditolak. Pemenang mendapat skor 65/100: photoscan spesies akurat secara ilmiah, lisensi sebaik mungkin, tapi sekitar 966.446 tris (12 kali di atas batas maksimum LOD0) membutuhkan retopologi berat, dan belum ada rig/animasi.

Riwayat pembuatan β€” dua kali percobaan build, yang pertama rusak:

Build pertama (2026-07-13): menggabungkan dua bagian mesh, didesimasi dua tahap (192 ribu→40 ribu→20 ribu poligon) langsung pada geometri photoscan mentah yang belum dilas (unwelded). Dirig dengan armature standar 10-tulang (bobot berbasis zona, auto-weight gagal seperti biasa). Dibuat 4 state animasi. Diekspor pada ukuran 17,7 MB (kegemukan, tekstur 4K).

RUSAK β€” ditemukan 2026-07-15 (CP27/CP28): saat merender GLB asli tanpa modifikasi dan memeriksa viewport .blend langsung, terlihat mesh badan hancur menjadi ribuan segitiga terpisah bahkan saat diam, dengan armature dinonaktifkan β€” ini cacat geometri dasar, bukan masalah rigging/skinning, dan tidak bisa diperbaiki hanya dengan mengelas ulang mesh yang sudah dirilis. Penyebab akarnya: proses decimate awal (rasio 0,21) diterapkan pada geometri triangle-soup photoscan mentah yang belum pernah dilas (merge-by-distance) lebih dulu, dan pipeline saat itu belum memiliki gerbang pemeriksaan rasio boundary-edge. Ini jenis cacat yang sama yang dihindari secara independen oleh rebuild Yellowfin (Fish07) dengan cara mengelas mesh terlebih dahulu.

Rebuild (2026-07-16, CP30): sumber CC0 diunduh ulang segar, tile-tile digabungkan, satu tile kartu kalibrasi warna yang nyasar dihapus, lalu dilas dengan merge-by-distance dari 428 ribu menjadi 241 ribu verts, menurunkan rasio boundary-edge dari 0,366 menjadi 0,0 (terhubung penuh) β€” gerbang konektivitas ditambahkan setelahnya untuk memblokir decimation di masa depan kecuali rasio boundary di bawah 15%. Didesimasi (mode COLLAPSE) dari 483 ribu menjadi 28.000 tris, tetap terhubung (boundary 0,003). Diorientasikan lewat penjajaran sumbu utama PCA (panjang +Y, punggung gelap +Z, tidak perlu dibalik), diskalakan ulang ke 1,2 m. Rig baru 10-tulang + Jaw, bobot berbasis zona (semua vertex tercakup). 4 state animasi baru (Cruise 90 frame, Bite 30 frame + rahang, Caught 90 frame, Preview 60 frame), gelombang merambat kepala ke ekor, diverifikasi tidak sobek termasuk pada puncak meronta di Caught. Tekstur diperkecil ke 2K; diekspor 4 GLB (~3,3 MB, turun dari 16,94 MB) + 4 USDZ (~2,0 MB). File GiantTrevally.blend hasil rebuild menggantikan file kerja yang rusak. Rebuild ini benar-benar memperbaiki mesh dasar yang hancur.

Cacat kedua yang terpisah muncul belakangan (CP43/CP46, 2026-07-20/21) β€” khusus ekspor Preview: sesi dari sisi tim aplikasi menemukan cacat orientasi/tekstur/normal pada ekspor Preview 5 spesies (memakai Mekong Catfish sebagai referensi yang sudah diketahui baik). Khusus untuk Giant Trevally:

  • CP43 menemukan has_custom_normals=True (sisa data split-normal bawaan photoscan) yang menimpa arah hadap face, tapi percobaan perbaikan pertama (bersihkan + hitung ulang normal) justru membuat keadaan lebih buruk (0,78%β†’1,41% face terbalik) dan dibatalkan β€” cacat sesungguhnya pada Trevally ternyata geometri duplikat yang tumpang tindih di sambungan non-manifold, bukan masalah arah hadap yang bisa dibalik, jadi rekalkulasi normal memang tidak bisa memperbaikinya (dikonfirmasi dua kali, CP43 dan CP46).
  • CP46 melakukan pembersihan di tempat (menghapus 39 segitiga debris terisolasi + 30 face interior lewat fungsi select_interior_faces() milik Blender), menurunkan edge non-2-manifold dari 165 ke 101, tapi screenshot viewport Blender milik pengguna sendiri setelahnya menunjukkan mesh masih terlihat berduri/sobek di area kepala/insang/sirip punggung β€” cacat yang secara materi jauh lebih besar daripada yang bisa dideteksi tes edge/face lokal pada pass pembersihan itu, lebih mirip dengan sobekan kelas CP30 yang asli ketimbang debris halus. Keputusan pengguna: lewati (skip) Giant Trevally, lanjut ke spesies lain. Butuh rebuild total weld-before-decimate dari scan sumber mentah (Model/gltf/scene.gltf, masih ada), bukan sekadar tambalan lokal lagi.
  • CP49 (2026-07-21) meluncurkan animasi Caught "ngamuk" baru ke Trevally bersama 6 spesies lain β€” animasinya sendiri hasilnya bersih, tapi secara eksplisit mewarisi cacat mesh CP46 yang belum terselesaikan, karena pass itu hanya menyentuh rigging/animasi, bukan topologi.
  • Juga dikonfirmasi masih ada (CP46), di luar cakupan untuk diperbaiki di situ: material .usdz hasil ekspor Trevally kosong (def Material tanpa jaringan shader sama sekali) β€” kelas bug yang sama dengan bug shader-drop CP38 yang memengaruhi semua 4 spesies "pola atlas" (Trevally, Skipjack, Grouper, Yellowfin). Sisi aplikasi sudah punya solusi sementara (membangun ulang material dari tekstur bawaan file .glb saudaranya).

Status saat ini β€” MASIH RUSAK: keempat state terverifikasi ada di disk sebagai pasangan .glb+.usdz, plus ada file sisa GiantTrevally_REBUILD.blend1 di folder spesies dari proses rebuild CP30. Dikonfirmasi tegas masih rusak per checkpoint terakhir (CP46/CP49, 2026-07-21): mesh Preview punya cacat sobek/berduri nyata dan terlihat jelas di area kepala/insang/sirip punggung yang belum diperbaiki β€” jangan laporkan Giant Trevally sebagai "selesai" sejajar dengan spesies roster inti lainnya. Ikan ini butuh rebuild total dari sumber mentah, yang untuk sekarang ditunda atas permintaan pengguna. Material USDZ-nya juga kosong di semua state (bug shader-drop), sudah disiasati dari sisi aplikasi tapi belum diperbaiki dari sumbernya.

Kewajiban lisensi/atribusi: CC0 Public Domain (ffishAsia-and-floraZia) β€” tidak wajib atribusi.

6. Mekong Giant Catfish (roster inti, via spesies pengganti satu famili)

Identitas spesies: nama umum Mekong Giant Catfish ("Trey Reach" dalam bahasa Khmer, "Pla Buek" dalam bahasa Thai), nama ilmiah Pangasianodon gigas. Taksonomi: Actinopterygii β†’ Siluriformes β†’ Pangasiidae ("lele hiu"/shark catfishes) β†’ Pangasianodon. Ciri pengenal: badan memanjang, ramping, mirip hiu; kepala lebar pipih, penampang hampir bulat; tanpa sisik, punggung abu-abu sampai abu-abu kebiruan, perut putih keperakan pucat, tanpa garis atau bintik; sirip punggung kecil berduri 2, sirip adiposa panjang, sirip anal sangat panjang (35 jari sirip); sirip ekor besar bercabang dalam; sungut mengecil/rudimenter pada ikan dewasa (tidak lazim untuk ikan lele); benar-benar tanpa gigi pada ikan dewasa (nama genusnya secara harfiah berarti "tanpa gigi"); mata terletak tidak biasa rendah (di bawah sudut mulut). Salah satu ikan air tawar yang tumbuh tercepat dan terbesar (spesimen 293 kg pernah dikonfirmasi, ikan air tawar terbesar yang pernah ditangkap). Hanya hidup di cekungan Sungai Mekong (China/Thailand/Laos/ Kamboja/Vietnam). Status IUCN Critically Endangered (kritis terancam punah).

Sumber model β€” tidak ada model spesies asli yang gratis: karena statusnya kritis terancam punah, ketersediaan aset 3D-nya nyaris tidak ada; satu-satunya kandidat yang ditemukan hanya dua model CGTrader berbayar ($129–$179). Kesimpulan awal saat itu: "harus generate pakai AI Hunyuan3D."

Disapu ulang pada 2026-07-16 (CP35): daripada mencari nama spesies persis, pencarian diperluas ke level famili (Pangasiidae) dan kerabat dekatnya "Pangasius"/"ikan patin," yang ternyata punya model CC-BY gratis dengan rencana tubuh diagnostik yang sama (ramping, sirip punggung segitiga tinggi, ekor bercabang dalam, tanpa sisik, bersungut).

Model yang dipilih: "Ikan Patin" (Pangasius), Sketchfab (hasil generasi Meshy AI), UID d9e7f483b33c4f1cbd74a5eed9b97f8f. CC-BY 4.0 (wajib atribusi). Sekitar 118.096 tris (2 bagian: 106 ribu badan + 12 ribu sirip), PBR 2K lengkap (BaseColor + MetallicRoughness + Normal), belum ada rig. Alternatif yang ditolak: Wels catfish dan Flathead Catfish (keduanya sekitar 40 ribu tris, CC-BY, tapi rencana tubuh salah β€” kepala lebar datar dengan sungut panjang menonjol, famili berbeda); Amur Catfish CC0 dari ffishAsia (juga rencana tubuh salah, dan 0,8–2,8 juta tris). Skor 73/100 β€” Ikan Patin secara eksplisit dicatat sebagai satu-satunya kandidat dari famili yang benar (Pangasiidae), itu sebabnya ia mengalahkan alternatif lain yang anatominya salah meski secara umum bagus, walaupun akurasi anatomi adalah kriteria skor dengan bobot tertinggi.

Alasan substitusi spesies, dinyatakan tegas di Source_Log.md: aset yang dirilis adalah Pangasius sebagai pengganti Pangasianodon gigas yang sebenarnya, dijustifikasi lewat kecocokan rencana tubuh satu famili; substitusi ini harus diungkapkan kalau ensiklopedia ikan dalam game mengklaim akurasi ilmiah.

Riwayat pembuatan: 2 bagian mesh digabung jadi satu objek; hierarki empty bawaan Sketchfab dibersihkan dan transform diterapkan. 3 UV map duplikat berlebih dibuang (artefak import glTF), disisakan UVMap utama. Dilas lebih dulu (merge-by-distance, ambang 0,0008): 73.473 β†’ 59.050 verts, edge boundary 25.705 β†’ 8 β€” mesh hasil AI ini punya vertex duplikat dan sambungan bagian yang terbuka. Diorientasikan kepala βˆ’Y / ekor +Y / punggung +Z (sudah benar setelah apply transform, tidak perlu dibalik); diskalakan ulang ke 2,0 m; dipusatkan. Didesimasi (collapse) dari 118.096 menjadi 17.950 tris β€” diverifikasi rasio boundary 0,0003, 1 pulau terhubung, tanpa fragmentasi (mode kegagalan persis yang merusak Giant Trevally β€” dihindari di sini khususnya berkat langkah weld lebih dulu). Material PBR metallic-roughness dipertahankan apa adanya (metallic 0 β€” benar untuk kulit lele yang dielektrik).

Rig-nya 11-tulang: Root (+Y), Spine_00/01/02, Head, Tail, Caudal_Fin, Dorsal_Fin, Anal_Fin, Pectoral_Fin_L/R. Bobot inverse-distance berbasis zona (pangkat 4, 3 pengaruh teratas, dinormalisasi), 0 vertex tanpa bobot.

4 state animasi bergaya subcarangiform (amplitudo gelombang badan lebih besar daripada tuna β€” 0,35 di pangkal badan depan berbanding 0,12 milik Marlin β€” dan tempo lebih lambat, karena catfish adalah perenang bertubuh lentur, bukan thunniform kaku): Cruise 48 frame, Bite 24 frame, Caught 72 frame meronta, Preview 48 frame β€” semuanya loop mulus (selisih titik akhir 0,0).

Bug yang diperbaiki:

  • Kehilangan action yatim: proses animasi pertama membuat keempat action tapi mengembalikan action aktif armature ke Cruise sebelum disimpan, sehingga Bite/Caught/Preview (0 pengguna saat disimpan) terhapus sebagai data yatim. Diperbaiki dengan membuat ulang memakai use_fake_user=True.
  • Macetnya loop verifikasi: loop evaluasi mesh penuh naif per-frame (perbandingan mesh-ke-mesh sekitar 64 frame Γ— 4 state) membuat add-on MCP single-thread macet. Diganti dengan pemeriksaan titik-akhir fcurve pose-bone yang ringan (tanpa perlu evaluasi mesh) β€” tetap membuktikan integritas loop (selisih 0,0) tanpa render berat.
  • Sebuah bendera "Head.rotation amplitudo ~2,0" dari hasil parse GLB ternyata cuma artefak representasi quaternion dari tulang kepala yang menghadap βˆ’Y, bukan gerakan sungguhan β€” dikonfirmasi lewat rangkaian render (kepala hanya bergoyang lembut).

Animasi Caught dibuat ulang (CP44/CP45, 2026-07-20): sesuai permintaan handoff tim aplikasi (APP_TEAM_HANDOFF_CAUGHT_STRUGGLE.md, sudah dihapus setelah selesai), klip Caught dibangun ulang di tempat dengan struktur baru yang lebih ganas: "meronta β†’ satu puncak lengkungan penuh badan yang koheren β†’ mereda". Model/rig sama, hanya animasinya yang berubah. Durasi baru 3,75 detik (90 frame @ 24fps), naik dari 3,0 detik (72 frame) sebelumnya. Momen paling dramatis (lengkungan penuh badan, sekitar 115Β° kelengkungan total setelah disetel turun dari percobaan awal yang terlalu berlebihan sekitar 230Β° "hidung nyaris menyentuh ekor" yang tertangkap lewat render cek tampak atas) jatuh di frame 44, sekitar 1,83 detik (sekitar 49% dari durasi klip) β€” sisi aplikasi perlu menyetel ulang konstanta waktu cutscene tangkapan (catchCutsceneRiseDuration/FreezeDuration/ SettleDuration, kecepatan animasi, selubung slow-motion) supaya cocok dengan timing baru ini, bukan mengasumsikan timing klip 3,0 detik lama masih pas. Diverifikasi tidak sobek di setiap sendi termasuk puncak frame-44 lewat render sapuan tampak lebar + close-up + tampak atas; diekspor dan dikonfirmasi lewat usdchecker (berhasil/Success) dan perbandingan langsung bindTransforms/restTransforms (sumbu rig tidak berubah).

Status saat ini: keempat state terverifikasi ada di disk sebagai pasangan .glb+.usdz. Selesai dan sudah dirilis; dipakai di sepanjang proyek sebagai referensi yang sudah diketahui baik (known-good) untuk cacat ekspor Preview di spesies lain (CP43) β€” artinya ekspor Preview Mekong Catfish sendiri tidak punya masalah yang diketahui.

Kewajiban lisensi/atribusi: "Ikan Patin" (Sketchfab, UID d9e7f483…) β€” lisensi CC-BY 4.0. Wajib atribusi. Wajib juga mengungkapkan substitusi Pangasius/Mekong-giant-catfish kalau disajikan sebagai spesimen yang akurat secara ilmiah.

7. Yellowfin Tuna (roster inti)

Identitas spesies: nama umum Yellowfin Tuna ("Madidihang"/"Tuna Sirip Kuning" dalam bahasa Indonesia), nama ilmiah Thunnus albacares. Taksonomi: Scombriformes β†’ Scombridae β†’ Thunnus. Ciri pengenal: badan memanjang, fusiform, agak pipih menyamping; dua sirip punggung dengan celah sempit di antaranya; sirip punggung kedua dan sirip anal jelas berbentuk sabit (falcate), pada ikan dewasa besar bisa melebihi 20% panjang cabang (fork length) β€” ini siluet khas spesies ini; 8–10 finlet di belakang sirip punggung kedua dan 7–10 di belakang sirip anal, berwarna kuning cerah bertepi hitam/gelap (ciri lapangan utama "yellowfin"); punggung biru metalik gelap memudar ke perak, dengan sekitar 20 garis vertikal samar di sisi tubuh. Panjang maksimum 239 cm FL, berat maksimum sekitar 200 kg. Dipilih sebagai tuna komersial/pancing olahraga andalan Indonesia (menurut Checkpoint 26 proyek ini). Perenang thunniform β€” badan nyaris kaku, dorongan hampir seluruhnya dari sirip ekor bulan sabit yang kaku, lekukan badan minimal (jauh lebih kaku dibanding Clownfish/Blue Tang yang labriform).

Sumber model: Sketchfab, kreator ffish.asia/floraZia.com, UID d4eeea976932414d91fc786ce6cec547 ("CC0 キハダ Yellowfin Tuna"). Lisensi CC0 Public Domain β€” tidak wajib atribusi. Kandidat: photoscan CC0 pemenang (1.387.219 tris, butuh decimation berat) berbanding model bergaya kartun CC-BY 2.851 tris (ditolak β€” di bawah batas bawah LOD0 5 ribu, terlalu bergaya kartun) dan beberapa model generik "tuna"/"animated tuna" lainnya dengan lisensi belum terverifikasi (disimpan sebagai cadangan yang tidak dipakai). Skor 74/100 β€” photogrametri sungguhan dari spesimen nyata memberi proporsi/sirip/finlet yang tepat dan lisensi sebaik mungkin, dengan konsekuensi butuh proses weld+decimate yang berat. Dicatat secara eksplisit sebagai "keluarga sumber CC0 tepercaya yang sama dengan Fish05 Giant Trevally" (ffish.asia).

Riwayat pembuatan: 20 tile photoscan digabung jadi satu badan; kartu kalibrasi warna photogrametri yang mengambang (objek/material terpisah) dihapus; empty bawaan import Sketchfab dibuang. Pengelasan (weld) β€” kali ini dilakukan dengan benar sejak awal: scan mentahnya adalah triangle-soup topologis (34% edge boundary). Merge-by-distance mengelas dari 1.174.209 menjadi sekitar 694.000 verts, membawa rasio boundary ke 0,0 (terhubung penuh). Ini secara eksplisit dicatat sebagai langkah yang tidak pernah dilakukan pada build asli (yang rusak) Giant Trevally β€” gerbang konektivitas (memblokir decimation di atas 15% boundary) diperkenalkan mulai dari ikan ini seterusnya. Didesimasi (collapse) dari 1.387.206 menjadi 28.000 tris (batas atas LOD0), tetap terhubung (boundary 0,007 β€” cuma di bukaan mulut/insang, masih dapat diterima).

Bug orientasi ditemukan dan diperbaiki: scan-nya punya rotasi kusut/belum diterapkan (lokal ≠ dunia), yang menyebabkan percobaan rig awal duduk miring diagonal. Diperbaiki dengan penjajaran sumbu utama PCA (panjang→+Y, tinggi→+Z, lebar→+X, kepala di origin), lalu dibalik 180° pada sumbu Y (mesh + tulang bersamaan, ikatan bobot tetap terjaga) supaya punggung gelap menghadap +Z. Diskalakan ulang ke 2,0 m.

Rig-nya armature standar 10-tulang + Jaw. Auto-weight bone-heat menghasilkan grup kosong (kegagalan yang konsisten di seluruh proyek ini) β€” dipakai bobot berbasis zona (blend rantai tulang belakang yang halus + sirip yang meruncing dari akar) sebagai gantinya, dengan penempatan tulang terdeteksi otomatis dari garis tengah + kelompok sirip.

4 state animasi lewat gelombang merambat kepala-ke-ekor (thunniform): Cruise 90 frame, Bite 30 frame (+rahang), Caught 90 frame, Preview 60 frame. Diverifikasi tidak sobek dengan rangkaian render ortografik pada puncak amplitudo. 3 tekstur BaseColor photoscan diperkecil dari 4K ke 2K (GLB turun dari 28 MB jadi 4,2 MB). Diekspor 4 GLB (~4,2 MB) + 4 USDZ (~1,9 MB), Y-up, ACTIVE_ACTIONS; validasi impor ulang mengonfirmasi mesh + 3 material bertekstur + 33 channel animasi + 11 joint skin utuh.

Keterbatasan yang diketahui (didokumentasikan, tidak diperbaiki): karena ini scan ikan mati, rest pose-nya punya badan yang sedikit kendur dan mulut sedikit terbuka yang harus "dilewati" oleh animasi (rahang menutup saat idle); sirip masih menyisakan ketidakrataan bekas photoscan di tepinya.

Bug normal ekspor Preview (CP43): punya satu pulau mesh utama dengan data has_custom_normals basi yang menyebabkan tingkat face terbalik 12,19%. Sudah diperbaiki β€” bersihkan + hitung ulang menurunkannya jadi 0,64%, satu dari hanya 2 spesies (bersama Bluefin) yang tuntas terselesaikan pada pass itu.

CP49: menerima rollout animasi Caught "ngamuk" baru β€” hasil bersih di percobaan pertama, dan di sinilah bug arah-referensi tulang kepala tim animasi sebenarnya tertangkap (tulang Head Yellowfin berada di posisi Y minimum, berbeda dari Bluefin yang berada di Y maksimum β€” synthesizer sebelumnya salah mengasumsikan konvensi yang konsisten di semua rig).

Status saat ini: keempat state terverifikasi ada di disk sebagai pasangan .glb+.usdz. Selesai dan sudah dirilis; normal mesh Preview dikonfirmasi sudah diperbaiki (CP43); Caught dianimasikan ulang 2026-07-21 (CP49), hasil bersih, tidak ada cacat tersisa yang diketahui.

Kewajiban lisensi/atribusi: CC0 Public Domain (ffish.asia/floraZia.com) β€” tidak wajib atribusi.

8. Skipjack Tuna (roster inti)

Identitas spesies: nama umum Skipjack Tuna ("Cakalang" dalam bahasa Indonesia), nama ilmiah Katsuwonus pelamis. Taksonomi: Scombriformes β†’ Scombridae β†’ Katsuwonus. Ciri pengenal: badan kekar, fusiform, bulat β€” lebih kecil dan gempal dibanding yellowfin; punggung biru keunguan gelap sampai hitam, sisi bawah dan perut putih keperakan; ciri khas utama: 4–6 garis gelap tebal memanjang di sisi bawah tubuh β€” unik di antara tuna (kebanyakan tuna lain punya garis vertikal atau tidak bergaris sama sekali), terlihat jelas di tekstur hasil scan; tidak ada warna kuning mencolok, finlet berwarna suram. Panjang maksimum sekitar 110 cm FL, umumnya sekitar 80 cm FL. Salah satu perikanan tuna terbesar Indonesia (diolah kaleng/diasap sebagai "cakalang fufu"). Perenang thunniform berkecepatan tinggi, profil renang sama seperti Yellowfin β€” badan kaku, digerakkan ekor, lekukan minimal.

Sumber model: Sketchfab, kreator ffish.asia/floraZia.com, UID 9431157b2fce4ea9a72d9cfe3ce37a6d ("CC0 カツγ‚ͺ Skipjack Tuna"). Lisensi CC0 Public Domain β€” tidak wajib atribusi. Hanya satu model dengan spesies yang benar muncul lewat semua kata kunci pencarian ("skipjack tuna", "katsuwonus", "bonito", "cakalang") β€” model kapal selam USS Skipjack adalah hasil pencarian utama lainnya (bukan ikan, dibuang). Skor 74/100 β€” sumber keluarga ffishAsia tepercaya yang sama dengan Trevally dan Yellowfin, scan spesimen sungguhan dengan garis-garis perut diagnostik yang utuh.

Riwayat pembuatan: pipeline weld-first standar (yang sudah terbukti pada rebuild Fish05/Fish07): tile digabung, tile kartu warna dihapus. Pengelasan: rasio boundary 0,318 β†’ 0,0, verts 1,26 juta β†’ 618 ribu. Decimate: COLLAPSE dari 1.260.666 menjadi 28.000 tris, tetap terhubung (boundary 0,003). Orientasi/skala: penjajaran PCA (panjang +Y, punggung gelap +Z, tegak β€” tidak perlu dibalik); diskalakan ulang ke 0,9 m.

Rig-nya standar 10-tulang + Jaw, penempatan terdeteksi otomatis berdasar anatomi, bobot berbasis zona (semua vertex tercakup). 4 state animasi (Cruise 90 frame, Bite 30 frame + rahang, Caught 90 frame, Preview 60 frame), gelombang merambat thunniform; diverifikasi tidak sobek pada puncak meronta di Caught. Tekstur diperkecil ke 2K; diekspor 4 GLB (~4,1 MB) + 4 USDZ (~1,9 MB).

Keterbatasan yang diketahui (didokumentasikan, tidak diperbaiki): scan ikan mati, rest pose sedikit kendur; sirip masih menyisakan ketidakrataan bekas photoscan di tepinya β€” sama kelasnya dengan keterbatasan Yellowfin.

Cacat ekspor Preview (CP43/CP47) β€” kontaminasi terparah dari semua spesies yang diperiksa: 348 pulau debris dan 2.923 edge non-manifold (2.923 di antaranya "overdense", artinya dipakai bersama oleh 3+ face). Percobaan perbaikan pertama (bersihkan+hitung ulang normal) justru membuat keadaan lebih buruk (1,83%β†’10,30% terbalik) dan dibatalkan tanpa pernah menyentuh file sungguhan. CP47 (2026-07-21) memperbaikinya dengan benar: pertama dicek dulu apakah ada fragmentasi skala-besar gaya Trevally (tidak ditemukan β€” panjang edge maksimum cuma 4,8Γ— median, hanya 2 pulau mesh, satu badan sungguhan + satu segitiga debris nyasar) dan dikonfirmasi lewat render bertekstur asli bahwa bentuknya terlihat bersih dan anatominya benar (tidak seperti siluet Trevally yang jelas sobek) sebelum melanjutkan. Segitiga debris tunggal dihapus, lalu select_interior_faces() dijalankan sampai konvergen β€” menghapus 3.180 face interior (11,4% dari mesh) hanya di pass pertama saja. Hasil akhir: edge non-2-manifold turun dari 3.194 menjadi 798 (semuanya di kategori "sambungan 4-face" yang lebih ringan). Diverifikasi dengan tes 5-sudut material-datar/latar-magenta-terang/backface-culling β€” solid penuh di setiap sudut, belajar dari kejadian alarm-palsu sebelumnya pada Trevally (CP46) untuk tidak percaya pada render satu sudut saja. Laporan pengguna soal "tekstur kosong/putih" di area kepala/hidung diselidiki dan ternyata alarm-palsu akibat pencahayaan viewport, bukan cacat sungguhan. Diekspor dan dikonfirmasi lewat usdchecker (berhasil/Success) dan doubleSided=1.

CP49: menerima animasi Caught "ngamuk" baru β€” hasil bersih, memakai gain yang sama persis dengan Yellowfin karena Skipjack berbagi data animasi Caught sumber yang identik dengan Yellowfin (jumlah t_peak/energi/fcurve persis sama β€” mengonfirmasi kedua spesies ini dibangun dari template animasi yang disalin).

Status saat ini: keempat state terverifikasi ada di disk sebagai pasangan .glb+.usdz. Selesai dan sudah dirilis. Mesh Preview sudah dibersihkan dan dikonfirmasi solid secara visual (CP47) β€” tingkat keyakinan yang sama dengan Yellowfin/Bluefin, walau belum dikonfirmasi langsung di perangkat sungguhan (baru diverifikasi di renderer EEVEE Blender sendiri, sesuai catatan keterbatasan jujur dari sesi tersebut). Caught dianimasikan ulang 2026-07-21. Masih ada isu yang sama dengan Trevally/Grouper/Yellowfin: material USDZ hasil ekspor kosong untuk kelas spesies "pola atlas" ini (bug shader-drop kelas CP38/CP43), sudah disiasati dari sisi aplikasi.

Kewajiban lisensi/atribusi: CC0 Public Domain (ffish.asia/floraZia.com) β€” tidak wajib atribusi.

9. Grouper (roster inti, via spesies pengganti yang mewakili kategori umum)

Identitas spesies: nama umum Yellow Grouper (dipakai sebagai pengganti "Kerapu," kategori pasar ikan kerapu Indonesia secara umum), nama ilmiah Epinephelus awoara. Taksonomi: Perciformes β†’ Serranidae (kerapu & ikan bass laut) β†’ Epinephelus. Ciri pengenal: badan gempal, dalam, kepala besar dan mulut lebar (predator penerkam/ambush predator); badan coklat-oranye berbintik-bintik dengan bintik kuning/oranye padat dan beberapa garis vertikal gelap samar; perut pucat; sirip punggung berduri panjang; ekor bulat (tidak bercabang). Panjang maksimum sekitar 60 cm. Ikan pangan/akuakultur unggulan Indonesia dan tangkapan terumbu yang ikonik. Perilaku berenangnya secara eksplisit berbeda dari semua tuna di roster: BUKAN thunniform β€” predator penerkam bentik lambat di terumbu yang memakai lekukan badan amplitudo-rendah lembut + manuver sirip dada saat berenang santai, dengan terkaman suction-feeding mulut lebar mendadak saat menyerang.

Sumber model: Sketchfab, kreator ffish.asia/floraZia.com, UID 17f6e5eb3efa4c969d3857881b35a62f ("CC0 γ‚’γ‚ͺハタ Yellow Grouper"). Lisensi CC0 Public Domain β€” tidak wajib atribusi. Dipilih dibanding 3 model kerapu CC0 ffishAsia lain yang tersedia (E. septemfasciatus "Bar Cod", E. akaara "Hong Kong Grouper", Cephalopholis igarashiensis "Neptune Grouper" β€” semuanya 1,2 juta–1,55 juta tris) khusus karena Yellow Grouper punya jumlah segitiga mentah paling rendah dari kelompok itu (933.751), berarti risiko decimation paling kecil; keempatnya adalah keluarga sumber tepercaya yang sama. Dua kandidat lisensi-belum-terverifikasi/bergaya kartun ditolak langsung. Skor 75/100 β€” tertinggi dari semua ikan roster inti di Asset_Candidates.

Riwayat pembuatan: pipeline weld-first standar (yang sudah dibangun lewat rebuild Fish05/Fish07/Fish08), dengan animasi yang disetel khusus untuk ikan terumbu sebagai perbedaan utama dari spesies tuna: tile digabung, tile kartu warna dihapus. Pengelasan: rasio boundary 0,381 β†’ 0,0, verts 934 ribu β†’ 465 ribu. Decimate: COLLAPSE dari 933.751 menjadi 28.000 tris, tetap terhubung (boundary 0,003). Orientasi/skala: penjajaran PCA (panjang +Y, punggung gelap +Z, tegak β€” tidak perlu dibalik); diskalakan ulang ke 0,6 m β€” paling kecil dari 10 ikan inti.

Rig-nya standar 10-tulang + Jaw, terdeteksi otomatis berdasar anatomi, bobot zona (rahang dibobot secara eksplisit untuk gerakan terkaman suction-feeding). 4 state animasi, disetel dengan amplitudo lebih rendah dan tempo lebih lambat dibanding tuna (karena Grouper bukan thunniform) ditambah bukaan rahang menghisap besar pada state Bite: Cruise 90 frame, Bite 30 frame, Caught 90 frame, Preview 60 frame. Diverifikasi tidak sobek (puncak meronta di Caught) dan dikonfirmasi bukaan rahangnya terbaca benar pada Bite. Tekstur diperkecil ke 2K; diekspor 4 GLB (~3,8 MB) + 4 USDZ (~2,0 MB); keempat GLB per-state diverifikasi benar-benar berbeda lewat checksum yang berbeda (langkah verifikasi langsung yang khusus disebutkan untuk spesies ini).

Cacat ekspor Preview (CP43/CP48): 249 pulau debris + 1.426 edge non-manifold overdense; percobaan perbaikan pertama (bersihkan+hitung ulang normal, diuji hanya di salinan scratch, tidak pernah ditulis ke file sungguhan) justru memperburuk keadaan (1,73%β†’5,52%) dan memang tidak pernah diterapkan ke file yang dirilis. CP48 (2026-07-21) memperbaikinya dengan benar: dicek dulu fragmentasi gaya Trevally (tidak ada β€” panjang edge maksimum 4,17Γ— median; 321 pulau tapi pulau terbesar mencakup 98,7% dari mesh) dan dikonfirmasi lewat render bertekstur asli bahwa bentuknya bersih (pola belang benar, duri punggung utuh, tidak ada siluet bergerigi). Semua pulau terputus di bawah 20 face dihapus (364 face di sekitar 320 pulau debris kecil) dalam satu pass, lalu select_interior_faces() dijalankan sampai konvergen (1.023 face interior dihapus). Hasil akhir: edge non-2-manifold dari 2.511 menjadi 479 (semuanya di kategori 4-face yang lebih ringan). Diverifikasi bersih dengan tes 5-sudut flat-material/magenta yang sama seperti Skipjack. Diekspor dan dikonfirmasi lewat usdchecker (berhasil/Success) dan doubleSided=1.

CP49: menerima animasi Caught "ngamuk" baru β€” dideskripsikan sebagai hasil paling dramatis dari semua 7 spesies yang dianimasikan ulang (rahang terbuka lebar, duri punggung mekar penuh), memang sesuai untuk predator penerkam terumbu, bukan kebetulan dari metode generik. Grouper punya data animasi Caught sumber sendiri yang berbeda (t_peak=16 berbanding 30 dan energi berbeda dari template tuna), tidak seperti Skipjack/Yellowfin yang berbagi template hasil salinan.

Status saat ini: keempat state terverifikasi ada di disk sebagai pasangan .glb+.usdz. Selesai dan sudah dirilis. Mesh Preview sudah dibersihkan dan dikonfirmasi solid secara visual (CP48) β€” ini menuntaskan upaya pembersihan cacat Preview 3 spesies yang dimulai sejak CP43 (Bluefin/Yellowfin diperbaiki langsung di CP43; Skipjack/Grouper dibersihkan dan dikonfirmasi di CP47/CP48; hanya Trevally yang masih rusak). Belum dikonfirmasi langsung di perangkat sungguhan. Caught dianimasikan ulang 2026-07-21 dengan hasil paling dramatis dari seluruh rollout. Berbagi bug material USDZ kosong "pola atlas" yang sama dengan Trevally/Skipjack/Yellowfin (solusi sementara sisi aplikasi sudah ada, belum diperbaiki di sumbernya).

Kewajiban lisensi/atribusi: CC0 Public Domain (ffish.asia/floraZia.com) β€” tidak wajib atribusi.

10. Sailfish (roster inti, mengisi slot "billfish/Marlin kedua")

Identitas spesies: nama umum Sailfish ("Ikan Layaran" dalam bahasa Indonesia), nama ilmiah Istiophorus platypterus (Sailfish Indo-Pasifik). Taksonomi: Istiophoriformes β†’ Istiophoridae (ikan billfish β€” famili yang sama dengan Marlin). Ciri pengenal: badan memanjang, ramping; moncong panjang seperti tombak (rostrum); "layar" sirip punggung raksasa yang bisa ditarik masuk (ciri utamanya); punggung biru gelap/hitam, perut putih keperakan, garis-garis vertikal biru mengkilap; layarnya sendiri berwarna biru gelap-hitam, sering berbintik. Panjang maksimum sekitar 3,5 m. Salah satu tangkapan ikan besar olahraga paling ikonik di Indonesia.

Sumber model: spesies ini sengaja dicari untuk mengisi slot billfish kedua setelah pencarian Marlin asli terus-menerus gagal (lihat bagian Fish03) β€” pencarian segar mengonfirmasi tidak ada model Marlin sejati (Makaira) berlisensi gratis/CC yang benar-benar berupa game asset di mana pun, yang ada hanya scan fosil paleontologi (100 ribu–323 ribu tris, secara eksplisit ditolak sebagai "bukan ikan untuk game") dan hasil pencarian salah sasaran merek senjata api ("Marlin" juga merek senapan).

Model yang dipilih: "Sailfish" oleh Mateus Schwaab, UID Sketchfab 5c7b14e21fba4eefad77c84edccfc9d2. Lisensi CC-BY (wajib atribusi). 4.677 tris, sudah punya rig (17 tulang) dan sudah beranimasi dengan 3 klip (Swim, SwimFast, Bite), tekstur PBR lengkap (baseColor/metallicRoughness/normal). Alternatif yang ditolak: "Makhaira" (bentuk marlin bergaya, CC-BY, tapi belum ada rig, 5.382 tris); Swordfish (CC-BY, 34.940 tris, melebihi LOD0, belum ada rig). Skor 89/100 β€” skor tertinggi dari seluruh kandidat di seluruh proyek β€” khususnya karena ini kasus langka model siap-pakai game yang rendah-poli, bersih, CC-BY, dan sudah dirig dan dianimasikan sebelumnya, sehingga menghindari hampir seluruh pipeline weld/decimate/rig/animate yang dibutuhkan ikan-ikan bersumber photoscan.

Substitusi spesies ini disetujui secara eksplisit oleh pengguna pada 2026-07-16 (didokumentasikan langsung di Scientific_Validation.md dan Source_Log.md) β€” Marlin (Fish03) sendiri juga baru berhasil dibuka jalannya di hari yang sama lewat temuan CC-BY-nya sendiri (lihat Fish03), jadi Sailfish ini bukan pengganti Marlin, melainkan spesies tambahan tersendiri yang melengkapi kehadiran billfish di roster.

Riwayat pembuatan: ini bukan pipeline photoscan β€” karena sumbernya sudah berupa model game bersih yang sudah dirig, hanya butuh pembersihan + retargeting, tanpa perlu weld/decimate/rig-dari-nol:

  • Mesh bersih 4,7 ribu tris diimpor (tidak perlu weld/decimate).
  • Model mentahnya berukuran sekitar 967 unit Blender dengan panjang menghadap sumbu Z dan layar menghadap sumbu Y. Diskalakan ulang ke 2,72 m dan diorientasikan ulang ke konvensi proyek (panjang +Y, layar/punggung +Z, tegak) lewat transform objek armature (mesh mengikuti sebagai child), dipanggang saat ekspor.
  • Pemetaan state memakai ulang 3 animasi bawaan model alih-alih membuat animasi baru: Cruise ← Swim (60 frame); Bite ← Bite (40 frame); Caught ← SwimFast (40 frame β€” renang cepat gelisah dipakai ulang supaya terbaca sebagai meronta); Preview ← Swim diperlambat kecepatannya sekitar 0,5Γ— (120 frame, sesuai spesifikasi proyek untuk state Preview berupa turntable idle lambat).
  • Diekspor 4 GLB (~1,0 MB) + 4 USDZ (~1,1 MB); keempat GLB diverifikasi benar-benar berbeda lewat checksum, masing-masing membawa animasinya sendiri (51 channel) + skin + tekstur baseColor.

Animasi ulang Caught CP49 (2026-07-21): sama seperti Marlin, file kerja .blend Sailfish hanya menyisakan action Cruise β€” Bite/Caught/Preview hilang dari file kerja (hanya pernah ada di file yang sudah diekspor). Dipulihkan dengan mengimpor ulang Caught.glb yang sudah dirilis, mengonversi keyframe quaternion ke Euler XYZ, dan membangun ulang di atasnya. Konvensi penamaan tulang Sailfish yang sama sekali berbeda (Body1_01..Body5_08, CaudalFin_09, Sail1_010..Sail4_013 β€” tidak ada penamaan "Spine"/"Fin" seperti rig lain) mengharuskan daftar kata kunci klasifikasi animasi diperluas untuk mengenali Body (rantai primer) dan Sail (kelas sirip sekunder) sebagai kata kunci baru. Hasilnya dilaporkan sebagai yang paling bagus dari semua 7 spesies yang dianimasikan ulang β€” moncong, ekor, dan layar semuanya terbaca bersih tanpa sobekan. Juga mengalami bug "action-slot tidak terikat" yang sama seperti dijelaskan di bagian Marlin (diperbaiki dengan cara yang sama).

Titik lemah yang tercatat di memori proyek (tidak dinyatakan langsung di dokumen yang dibaca di sini): catatan sesi pengguna sendiri mendeskripsikan state Caught Sailfish sebagai "lemah" sebelum animasi ulang CP49 β€” rollout CP49 di atas kemungkinan besar adalah perbaikannya, tapi ini tidak bisa diverifikasi secara independen terhadap render sebelum-CP49 karena hanya kondisi .blend/ekspor saat ini yang diperiksa.

Status saat ini: keempat state terverifikasi ada di disk sebagai pasangan .glb+.usdz. Selesai dan sudah dirilis. Caught dianimasikan ulang 2026-07-21 dengan hasil paling baik dari rollout 7 spesies. Tidak ada cacat mesh/topologi tersisa yang didokumentasikan untuk spesies ini (berbeda dari Trevally/Skipjack/Grouper/Yellowfin, Sailfish tidak ikut diselidiki dalam investigasi cacat ekspor Preview berbasis photoscan karena memang bukan aset photoscan).

Kewajiban lisensi/atribusi: "Sailfish" oleh Mateus Schwaab, lisensi CC-BY, via Sketchfab (https://sketchfab.com/3d-models/5c7b14e21fba4eefad77c84edccfc9d2). Kredit ini WAJIB muncul di layar kredit game / atribusi aset di mana pun model ini dipakai.

Catatan lintas-spesies (konteks umum untuk buku ini, tidak spesifik ke satu ikan)

Pola pipeline build yang berulang di 8 ikan inti bersumber photoscan (Trevally, Bluefin, Yellowfin, Skipjack, Grouper, dan agak berbeda pada Catfish): photoscan mentah dari Sketchfab berupa triangle-soup dengan rasio boundary-edge tinggi. Aturan proyek yang didapat lewat pengalaman pahit, dibuat setelah build pertama Giant Trevally hancur: selalu lakukan weld (merge-by-distance) sebelum decimate, dan pastikan rasio boundary-edge tetap di bawah 15% setelah decimate. Setiap ikan yang dibangun atau dibangun ulang setelah perbaikan Trevally di CP30 secara eksplisit mengikuti urutan ini dan melaporkan rasio boundary sebelum/sesudah sebagai langkah verifikasi.

Pola rigging yang berulang: algoritma pembobotan otomatis "Bone Heat" Blender gagal menemukan solusi pada hampir setiap ikan di proyek ini. Solusi cadangan standar yang dipakai di mana-mana adalah pembobotan manual berbasis zona / inverse-distance dari posisi rest tiap tulang, dengan hasil dicek untuk memastikan 0 vertex tanpa bobot dan deformasi tidak sobek pada pose uji.

Rollout animasi Caught "ngamuk" (CP44/45/49, 2026-07-20/21): Mekong Catfish mendapat animasi Caught baru yang lebih ganas dengan 3 fase (meronta→puncak lengkung koheren→mereda) lebih dulu, atas permintaan tim aplikasi terkait cutscene "tangkapan" slow-motion. Ini kemudian digeneralisasi jadi teknik yang bisa dipakai ulang lintas-rig (mengklasifikasikan otomatis tulang tiap rig ke kategori primer/sirip/wajah/lainnya berdasar kecocokan substring-nama) dan diluncurkan ke 6 spesies lengkap lainnya (Bluefin, Yellowfin, Skipjack, Trevally, Grouper, Marlin, Sailfish) — Clownfish/Blue Tang dikecualikan karena di luar roster inti. Dua bug halus ditemukan dan diperbaiki baru di tengah rollout ini (bug rotasi gabungan 3-sumbu pada Marlin, dan bug pengikatan ulang action-slot Blender 5.x pada Marlin dan Sailfish) — patut ditandai di buku ini sebagai contoh peringatan tentang bug yang tetap tersembunyi selama 5 spesies sebelum akhirnya terungkap oleh rig ke-6/ke-7. Skrip animasi yang bisa dipakai ulang (ngamuk_lib2.py) hanya ada di scratchpad sesi, tidak pernah di-commit ke repo.

Investigasi cacat ekspor Preview (CP43/46/47/48, 2026-07-20/21): sesi dari sisi aplikasi menemukan cacat normal/orientasi/tekstur pada ekspor Preview/ milik 5 spesies (Bluefin, Yellowfin, Skipjack, Grouper, Giant Trevally), memakai Mekong Catfish sebagai referensi yang sudah diketahui baik. Hasilnya: Bluefin dan Yellowfin diperbaiki bersih dan langsung (CP43); Skipjack dan Grouper butuh pass pembersihan interior-face/debris yang lebih berat dan berhasil diperbaiki serta dikonfirmasi solid secara visual (CP47/CP48); hanya Giant Trevally yang tetap benar-benar rusak dan secara eksplisit dilewati atas instruksi pengguna, butuh rebuild total, bukan sekadar tambalan. Tidak ada satu pun dari perbaikan ini yang sudah dikonfirmasi di perangkat sungguhan β€” semua verifikasi dilakukan hanya di dalam renderer Blender sendiri.

Bug shader terpisah yang belum diperbaiki, memengaruhi material USDZ hasil ekspor Trevally, Skipjack, Grouper, dan Yellowfin secara khusus: keempat spesies ini memakai pola material multi-material "UV-atlas", dan material .usdz hasil ekspornya keluar kosong (def Material tanpa jaringan shader) β€” kelas bug material-drop exporter Blender-USD yang sama yang didokumentasikan di CLAUDE.md root Β§7 (CP38). Sisi aplikasi sudah punya solusi sementara (membangun ulang material dari tekstur bawaan .glb saudaranya) tapi bug ekspor .usdz yang mendasarinya sendiri belum diperbaiki di repo ini.