Bab 1: Aturan & Rencana Pembangunan Aset
Bab ini merangkum lima dokumen sumber dari repo /Users/radityaaydin/repos/new-blender-project/. Repo ini berisi aturan dan rencana kerja untuk membuat aset 3D (10 ekor ikan, lingkungan danau, dan joran pancing) untuk sebuah game memancing sudut pandang orang pertama, dibangun dengan Blender lalu diekspor ke GLB/USDZ. Semua angka, nama file, dan istilah teknis dipertahankan persis seperti sumber aslinya.
1.1 Ringkasan Repo β CLAUDE.md
CLAUDE.md ada di root repo. Isinya jadi titik masuk (entry point) untuk siapa pun β manusia atau agen AI β yang perlu paham repo ini secara cepat. Ini penting terutama untuk agen yang bekerja di repo aplikasi terpisah, supaya mereka tahu cara memakai aset-aset ini dengan benar. Isinya menjelaskan: konsep game, aset mana yang bisa bergerak (animasi) dan mana yang tidak, lokasi file, status pembangunan saat ini, kewajiban lisensi, tugas yang masih tersisa untuk tim aplikasi, dan sebuah peringatan penting soal bug ekspor Blender yang berulang.
Repo ini hanya membuat aset 3D saja β 10 ikan + lingkungan danau + joran pancing β untuk game memancing orang-pertama yang dibangun di Apple RealityKit. Repo ini tidak berisi aplikasi game itu sendiri.
Repo aplikasi terkait
Repo aplikasi ada di ~/repos/c4/CtSPoC, dengan workspace CtSPoC.xcworkspace, dan dua aplikasi: World (renderer RealityKit) dan Rod (kontroler gerak di iPhone). Repo aplikasi menyimpan salinan sendiri dari setiap file FishAssets/Environment/*.usdz di dalam World/World/Assets/Environment/.
Aturan penting: setiap aset yang diekspor ulang di repo ini wajib disalin ulang ke repo aplikasi, begitu juga sebaliknya. Kedua salinan harus identik byte-per-byte, dicek pakai shasum di kedua sisi. Contoh kasus nyata aturan ini ada di CHECKPOINT.md CP42 (sebuah prim DomeLight nyasar yang ditemukan lewat hasil render di aplikasi, lalu diperbaiki di kedua repo sekaligus).
Konsep game (Β§0)
- Memancing orang-pertama di danau ikan trofi buatan β dalam, buatan manusia/eksotis, sehingga masuk akal spesies laut lepas dan air tawar hidup di satu badan air yang sama.
- Pemain berdiri di dermaga kayu, tinggi mata 1,6 m.
- BUKAN AR β kamera perangkat tidak pernah dipakai; RealityKit merender dunia 3D yang sepenuhnya virtual.
- Input: lempar dengan gerakan flick (flick-to-cast); kemiringan HP mengendalikan lengkungan joran + ketegangan senar saat bertarung dengan ikan.
- Pencahayaan: skybox golden-hour yang di-bake + satu lampu directional statis. Tidak ada sistem siang-malam, tidak ada estimasi cahaya ARKit.
- Alur per ikan: Cruise (berpatroli) β Bite (menyambar umpan) β Caught (meronta β tenang β dipamerkan) β Preview (berputar di turntable, untuk UI koleksi/album).
Β§1 β Model animasi (tabel paling penting)
Tidak semua jenis aset bergerak dengan cara yang sama. Ini tabelnya:
| Kelas aset | Punya animasi baked? | Cara bergeraknya |
|---|---|---|
| Ikan (10 spesies) | Ya β 4 klip baked per ikan | Mainkan langsung Cruise/Bite/Caught/Preview; tiap state adalah file ekspor sendiri |
Joran (rod_main.usdz) | Tidak β hanya skeleton, pose diam (rest pose) | Kode aplikasi harus memutar bone secara live dari input kemiringan HP, tiap frame; tidak ada klip untuk "diputar" |
Senar (rod_line.usdz) | Tidak β hanya skeleton, rig terpisah sendiri | Aplikasi mengatur ketegangan secara independen dari lengkungan joran |
Air (water_surface.usdz) | Tidak ada animasi, tidak ada shader β hanya mesh statis + material placeholder | Riak/normal-scroll/refraksi belum dibuat β ini tugas shader RealityKit terpisah; aset ini dikirim sebagai geometri siap-shader saja (grid quad 1,33 m untuk membawa displacement riak) |
| Dermaga, terrain, langit, dan aset sekunder lain (batu/pohon/tumbuhan) | Tidak | Sepenuhnya dekorasi statis (set-dressing). Tidak direncanakan untuk animasi |
Catatan khusus per aset
- Langit (
sky_dome.usdz): kubah ber-shader Emission unlit; menampilkan gambar golden-hour yang sudah di-bake terlepas dari pencahayaan scene; sengaja tidak punya prim Light/DomeLight. "Lampu directional statis" harus ditambahkan terpisah di kode RealityKit: elevasi ~15Β°, azimuth 135Β°, warna hangat 3200β4000K (aturan lengkap ada di AGENTS.md Β§4.6). Alasan pemisahan ini: pernah ada bug nyata di mana sebuah prim Light ikut ter-bake ke USDZ β sebuah World default yang gelap ikut ter-embed jadi DomeLight dan membuat model ikan jadi nyaris hitam total di Reality Composer (lihat CHECKPOINT.md CP24). Jangan menaruh lampu di dalam aset kubah langit lagi. - Joran: rantai bone
Root β Handle β Rod_01 β Rod_02 β Rod_03 β Tipdi dalamrod_main.usdz.Handlebersifat kaku (mencakup pegangan + reel β jangan dibengkokkan). Putar rotasiRod_01sampaiTip(amplitudo makin besar ke arahTip) berdasarkan besaran kemiringan HP. Detail geometri rig (handle di titik origin dunia, ujung/tip di lokal Y=+2,2 m, rest pose) ada diFishAssets/Environment/Documentation/Source_Log.mdbagian Asset 4. - Senar:
rod_line.usdzpunya rig 6-bone sendiri yang terpisah:Root β Anchor β Line_01 β Line_02 β Line_03 β Line_04, independen dari rig joran, supaya ketegangan bisa dianimasikan tanpa terikat pada lengkungan joran. Titik penyambungan (penting): origin lokal senar (0,0,0) harus berada di ekor (tail) boneTipmilikrod_main, bukan kepalanya (head) β koordinat dunia (0, 2,2, 0) pada rest pose, bukan (0, 1,95, 0). Salah menukar head vs tail ini benar-benar pernah terjadi dan baru ketahuan saat verifikasi (lihat Source_Log Asset 5) β akibatnya senar diam-diam terpasang 0,25 m lebih pendek dari ujung joran yang sebenarnya. - Air: tidak ada gerakan bawaan β material animated-normal/riak/refraksi/depth-fade harus dibuat di RealityKit. UV mesh sudah di-skala sedemikian rupa sehingga 1 ubin (tile) UV = 2,04 m β sesuaikan tiling riak berdasarkan angka ini.
Β§2 β Struktur folder
FishAssets/
βββ Fish0N_Species/β¦/{Cruise,Bite,Caught,Preview}/Species_State.{glb,usdz} (10 ikan, selesai)
βββ Environment/
βββ dock_main.usdz (selesai, hero 2K)
βββ water_surface.usdz (selesai, statis)
βββ terrain_underwater.usdz (selesai)
βββ rod_main.usdz (selesai, hero 2K, hanya rig)
βββ rod_line.usdz (selesai, hanya rig, independen dari joran)
βββ sky_dome.usdz (selesai, unlit, tanpa lampu baked, panorama 4K)
βββ terrain_horizon_ring.usdz (selesai, cincin transisi bukit+pepohonan)
βββ rock_shoreline_01/02/03.usdz (selesai, 3 batu berbeda)
βββ foliage_grass_01.usdz (selesai, alpha-cutout)
βββ foliage_reed_01.usdz (selesai, alpha-cutout)
βββ tree_01/02/03.usdz (selesai β cemara/pohon daun lebar/palem)
βββ prop_bucket_01.usdz (selesai)
βββ prop_tacklebox_01.usdz (selesai)
βββ prop_rope_01.usdz (selesai)
βββ Documentation/
βββ Asset_Candidates.md (keputusan sourcing, skor, kandidat yang ditolak)
βββ Source_Log.md (asal-usul, semua modifikasi, semua log perbaikan)
Dokumen lain: FishAssets/AGENTS.md (kumpulan aturan lengkap), FishAssets/BUILD_PLAN_ENV.md (rencana lingkungan + tabel progres), FishAssets/BUILD_PLAN.md (rencana ikan), FishAssets/CHECKPOINT.md (log pembangunan kronologis, entri terbaru ada di paling bawah).
Β§3 β Status terkini (per 2026-07-17 menurut file ini)
- Ikan: 8/10 sudah lengkap sepenuhnya (4 state baked, GLB+USDZ masing-masing) β Bluefin, Yellowfin, Skipjack, Giant Trevally, Grouper, Marlin, Sailfish, Mekong Catfish. Clownfish + Blue Tang hanya punya satu animasi asli (3 "state" lainnya cuma duplikat identik byte-per-byte, tanpa USDZ) β di luar roster inti.
- Lingkungan: 18/18 selesai β 6 aset esensial (dermaga, air, terrain, joran, senar, langit) + 11 aset sekunder (3 batu, rumput, tanaman reed, 3 pohon, 3 properti dermaga) + 1 aset penghalus (
terrain_horizon_ring, ditambahkan setelah review "terlihat seperti kardus", lihat Β§7). Pembangunan lingkungan sudah selesai penuh, tidak ada yang terblokir.
Β§4 β Fakta skala & konvensi
- 1 unit Blender = 1 meter, skala dunia nyata di seluruh proyek.
- Ikan berkisar dari 0,6 m (Grouper) sampai 3,0 m (Marlin).
- Badan air ~80 Γ 60 m, kedalaman basin sampai β11 m; dek dermaga di +0,80 m di atas garis air z=0; tiang dermaga menembus sampai β0,67 m (sengaja dibuat rak dangkal supaya tiang dermaga menancap ke terrain β lihat Source_Log Asset 3).
- Semua aset lingkungan pakai penamaan snake_case (
dock_main.usdz); ini menggantikan PascalCase yang dipakai sebelumnya untuk ekspor ikan (Marlin_Cruise.glb) β file ikan tidak ikut diganti nama (item terbuka, dicatat di BUILD_PLAN_ENV.md Β§7). - Setiap aset adalah file USDZ terpisah β bukan satu scene gabungan β supaya aplikasi bisa mengatur posisi/skala/animasi masing-masing secara independen.
Β§5 β Lisensi
Beberapa aset yang di-sourcing berlisensi CC-BY (wajib mencantumkan atribusi), bukan CC0. Teks atribusi yang wajib dicantumkan ada di Source_Log.md masing-masing aset (untuk Environment, atau tiap ikan). Ini secara eksplisit disebut sebagai syarat kepatuhan lisensi, bukan sekadar bonus.
Β§6 β TODO eksplisit untuk sisi aplikasi (BELUM dikerjakan di repo ini)
- Shader air β normal animasi, riak, refraksi, depth fade. Sudah ditandai, belum dibuat.
- Kontrol rig joran + senar berbasis kemiringan HP β putar bone joran secara live tiap frame dari kemiringan perangkat; atur ketegangan senar independen dari lengkungan joran; sambungkan senar di ekor (tail) bone Tip joran, bukan kepalanya (head).
- Layar kredit/atribusi β ambil teks atribusi dari setiap
Source_Log.md. Catatan: HDRI miliksky_dome.usdz(evening_road_01_puresky, dari Poly Haven) dan tekstur pasir milikterrain_underwater(damp_sand, dari Poly Haven) keduanya CC0 β tidak perlu atribusi. Setiap aset batu/pohon/properti/dermaga/joran berlisensi CC-BY β atribusi wajib untuk itu. - Tambahkan
DirectionalLightRealityKit sesuai AGENTS Β§4.6 (elevasi ~15Β°, azimuth 135Β°, warna hangat 3200β4000K) βsky_dome.usdzsengaja dikirim tanpa sumber cahaya sendiri. Pertimbangkan juga memakai HDRI yang sama (evening_road_01_puresky) sebagai sumber IBL/pencahayaan-lingkungan supaya warna ambient objek foreground cocok dengan langit β ini yang memperbaiki kesan "kardus" saat verifikasi render (lihat Β§7).
Β§7 β Peringatan kritis soal ekspor USD Blender
Exporter USD Blender punya tabel terjemahan shader yang sempit. Yang bisa ditangani secara konsisten hanya:
- Nilai
default_valueflat pada Principled BSDF (contoh: warna tan polos milikrod_line), dan - Sambungan langsung
Image Texture β Base Color/Image Texture β Normal Map β Normal.
Selain dua pola itu, exporter tidak bisa diandalkan β sebuah node shader Emission mandiri, dan sebuah node graph prosedural (Geometry/Math/ColorRamp yang mengendalikan Base Color), keduanya pernah dicoba dan diam-diam diekspor jadi material kosong atau abu-abu default, tanpa error ekspor sama sekali, dan tetap lolos usdchecker. Ini bukan hipotesis β sky_dome.usdz pernah terkirim tanpa data shader sama sekali selama dua siklus ekspor ulang sebelum ketahuan; gradien warna yang dimaksudkan untuk terrain_horizon_ring diam-diam berubah jadi abu-abu flat (0.8,0.8,0.8). Cerita lengkap ada di CHECKPOINT.md CP38.
Prosedur wajib saat ekspor ulang: sederhanakan setiap material ke dua pola yang didukung di atas sebelum ekspor, lalu cek ulang dengan:
unzip -o file.usdz -d /tmp/check && usdcat /tmp/check/*.usdc | grep -A2 "diffuseColor\|def Shader"
usdchecker yang lolos secara eksplisit disebut tidak cukup β itu hanya memvalidasi kesesuaian skema, bukan apakah warna/tekstur yang dimaksud benar-benar masuk ke dalam file.
Item terbuka / TODO / keterbatasan (dari CLAUDE.md)
- Shader air belum dibuat (TODO eksplisit sisi aplikasi).
- Kontrol rig joran/senar berbasis kemiringan belum dibuat (TODO sisi aplikasi).
- Layar kredit/atribusi belum dibuat (TODO sisi aplikasi).
DirectionalLightRealityKit belum ditambahkan (TODO sisi aplikasi).- File ikan masih pakai penamaan lama PascalCase, belum dimigrasi ke snake_case (dicatat, belum mendesak).
- Clownfish + Blue Tang belum lengkap (hanya 1 dari 4 state animasi yang asli) tapi memang sudah di luar cakupan roster inti.
- Peringatan umum: setiap ekspor ulang Blender di masa depan wajib dicek manual dengan
usdcat/grep karena validator yang lolos bisa menyembunyikan material yang diam-diam rusak.
1.2 Buku Aturan Utama β FishAssets/AGENTS.md (583 baris)
Ini adalah rulebook utama untuk seluruh pipeline aset β dokumen paling detail dan paling sering direvisi/dianotasi. Isinya mencakup: kewajiban dokumentasi, spesifikasi per jenis aset (lingkungan, joran, ikan), daftar spesies historis, aturan sourcing/lisensi, semua spesifikasi teknis (budget geometri, tingkatan tekstur, rigging, animasi, aturan sistem koordinat), rubrik penilaian, pipeline 13-fase untuk ikan, struktur file/folder, kode setup material PBR, pengaturan ekspor, alur kerja git, dan daftar "pelajaran yang dipetik" dari bug-bug yang pernah terjadi. Banyak bagian memiliki anotasi "SUPERSEDED" (digantikan) yang menunjukkan proyek ini pernah berbelok arah secara signifikan di tengah jalan β dari aplikasi kolam AR menjadi scene danau virtual non-AR, dan dari daftar spesies sembarangan menjadi roster ikan tangkapan besar khas Indonesia yang sudah dikonfirmasi.
Β§0 β Aturan Wajib Update Dokumentasi
Tidak ada tugas aset yang dianggap "selesai" sampai semua dokumen di-update. Tabel yang harus diperbarui setiap selesai membuat satu aset ikan:
| Dokumen | Yang harus diperbarui |
|---|---|
| CHECKPOINT.md | Checkpoint berstempel waktu per fase yang selesai; perbarui tabel progres |
| Documentation/Asset_Candidates.md | Semua kandidat yang dievaluasi, penilaian skor, pilihan akhir, status pipeline |
| Documentation/Source_Log.md | Asal-usul, metode download, semua modifikasi + alasannya, log perbaikan |
| Documentation/Scientific_Validation.md | Data spesies, taksonomi, karakteristik fisik (jika dibuat) |
| AGENTS.md | Hanya jika ada aturan/pelajaran baru yang ditemukan |
Checklist verifikasi sebelum dianggap selesai: CHECKPOINT.md punya entri untuk setiap fase di sesi ini; status pipeline di Asset_Candidates.md diperbarui; Source_Log.md mencatat semua modifikasi berstempel waktu; semua file .md sudah di-commit+push ke git@github.com:K-ere-Horee/blender-assets.git; file GLB + Blend sudah diekspor/disimpan; tidak ada dokumen yatim atau file yang hilang. "Kalau dokumen belum diperbarui, tugasnya belum selesai."
Β§1 β Jenis Aset & Persyaratan
Β§1.1 Lingkungan β Scene Kolam Imersif
Ditandai SUPERSEDED (CP36, 2026-07-16): spesifikasi awal (bidang datar yang responsif terhadap permukaan AR yang terdeteksi, 3 ukuran Small/Medium/Large, format GLB) berasumsi memakai AR passthrough; padahal game ini BUKAN AR β ini scene 3D orang-pertama yang sepenuhnya virtual (mode non-AR RealityKit). Jadi: tidak ada deteksi bidang, tidak ada penyesuaian permukaan saat runtime, tidak ada 3 varian ukuran, dan wajib ada langit yang benar-benar dirender. Tabel spesifikasi yang berlaku sekarang:
| Properti | Persyaratan |
|---|---|
| Cakupan | SATU scene yang sepenuhnya imersif: kolam + garis pantai + terrain + tumbuhan + langit |
| Sudut pandang | Orang pertama, pemain berada di garis pantai sedang memancing |
| Kolam | Satu permukaan air, geometri siap-shader, animasi riak halus; tanpa varian ukuran, tanpa penyesuaian runtime |
| Langit | Skybox/kubah yang dirender (langit+awan); scene ini JADI latar belakangnya; juga dipakai sebagai sumber IBL |
| Waktu | Golden hour (lihat Β§4.6) |
| Komposisi | Alami, tidak terlalu padat; tumbuhan membingkai pandangan tanpa mengurungnya |
| Ekspor | USDZ saja, satu file per aset |
Β§1.2 Joran Pancing (aset hero orang-pertama)
Ditandai EXPANDED (CP36) β aset yang paling dekat dengan kamera, jadi kualitasnya harus paling tinggi.
| Properti | Persyaratan |
|---|---|
| Jenis | Mesh joran + reel + armature, framing orang-pertama |
| Jumlah | 1 joran (rod_main.usdz) + senar sebagai aset terpisah (rod_line.usdz) |
| Rig | Rantai bone sepanjang batang joran: Handle β Rod_01 β Rod_02 β Rod_03 β Tip (cukup segmen untuk lengkungan parabola yang meyakinkan) |
| Input | Rig bisa digerakkan dari kemiringan perangkat lewat kode β lengkungan diekspos sebagai rotasi bone, bukan cuma klip yang di-bake |
| Animasi | State cast (lempar), reel (gulung), fight/tension (bertarung/tegang), dan idle |
| Senar | Elemen rig terpisah, rantai bone sendiri (atau kurva), bisa dianimasikan independen |
| Reel | Dimodelkan detail dan terlihat (spool, handle, bail); handle bisa diputar lewat kode |
| Tekstur | 2K (tingkatan hero, Β§4.2) |
| Ekspor | USDZ dengan armature + animasi |
Β§1.3 Ikan (per Spesies)
4 state animasi wajib:
| State | Deskripsi | Animasi | Kecepatan |
|---|---|---|---|
| Cruise | Siluet berenang β menandakan keberadaan ikan | Loop berenang terus-menerus | 1Γ |
| Bite | Animasi saat umpan disambar | Sambaran agresif + berbalik | 2Γ kecepatan cruise |
| Caught | Transisi tertangkap β normal β dipamerkan | Meronta β tenang β dipajang | Variabel |
| Preview | Tampilan statis/turntable | Idle + berputar pelan | 0,5Γ |
Persyaratan ekspor per state ikan:
| State | File ekspor | Animasi | Catatan |
|---|---|---|---|
| Cruise | FishXX_Species/Cruise/Species_Cruise.glb | Siklus renang 48 frame | Animasi utama |
| Bite | FishXX_Species/Bite/Species_Bite.glb | Sambaran 24 frame | 2Γ kecepatan cruise |
| Caught | FishXX_Species/Caught/Species_Caught.glb | Transisi 72 frame | Meronta + dipajang |
| Preview | FishXX_Species/Preview/Species_Preview.glb | Idle 48 frame | Untuk tampilan UI |
Β§2 β Urutan Spesies
Aturannya: selesaikan satu ikan sepenuhnya sebelum mulai ikan berikutnya. Ditandai SUPERSEDED (CP28, 2026-07-15) β daftar awal digantikan oleh set "tangkapan besar Indonesia" (lihat BUILD_PLAN.md/CHECKPOINT.md untuk urutan yang berlaku). Target aktif per catatan tersebut: Bluefin Tuna (Fish04, selesai), Yellowfin Tuna (Fish07, selesai), Giant Trevally (Fish05, rusak/perlu dibangun ulang), Skipjack Tuna (Fish08, tertunda), Grouper (Fish09, tertunda), Marlin (Fish03, saat itu terblokir). Clownfish/Blue Tang/Mekong Giant Catfish sudah selesai tapi di luar set ini.
Roster awal (disimpan untuk sejarah):
| # | Spesies (nama ilmiah) | Nama umum | Ukuran dunia nyata |
|---|---|---|---|
| 1 | Amphiprion ocellaris | Clownfish | 0,08 m |
| 2 | Paracanthurus hepatus | Blue Tang | 0,31 m |
| 3 | Scleropages formosus | Asian Arowana | 0,60 m |
| 4 | Sphyraena barracuda | Great Barracuda | 1,00 m |
| 5 | Thunnus thynnus | Bluefin Tuna | 3,00 m |
Β§3 β Strategi Perolehan Aset
Prioritas utama: cari aset gratis + legal terbaik; membuat dari nol hanya jika pencarian menyeluruh sudah gagal.
Β§3.1 Urutan Pencarian Sumber
- Sketchfab (utama, variasi model CC gratis terbanyak)
- Poly Haven (CC0, pilihan ikan terbatas)
- Smithsonian Open Access (historis/seni, tidak ada ikan ditemukan)
- BlendSwap (model komunitas berbasis Blender)
- CGTrader Free (filter gratis+lisensi)
- Internet Archive (koleksi 3D)
- Repo GitHub
- Repo akademik (dataset riset)
- Hunyuan3D / Hyper3D Rodin β pilihan terakhir saja
Β§3.2 Persyaratan Pencarian
Minimal 5 kali percobaan pencarian per sumber sebelum pindah ke sumber lain; dokumentasikan setiap kandidat (diterima maupun ditolak); catat kegagalan pencarian di Source_Log.md.
Β§3.3 Persyaratan Lisensi
| Status | Jenis lisensi |
|---|---|
| Diterima | CC0, Public Domain, CC-BY |
| Ditolak | CC-BY-NC, CC-BY-ND, Tidak diketahui, Berhak cipta terbatas, Info lisensi tidak ada |
Β§4 β Spesifikasi Teknis
Arahan gaya: gaya game semi-realistis β proporsi realistis, detail disederhanakan, seperti simulator memancing; geometri bersih dan efisien untuk engine.
Β§4.1 Geometri (budget ikan/hero)
| LOD | Rentang segitiga (tris) | Kegunaan |
|---|---|---|
| LOD0 | 5.000β30.000 | Tampilan utama, jarak dekat |
| LOD1 | 2.000β5.000 | Jarak menengah |
| LOD2 | <2.000 | Jarak jauh/latar belakang (opsional) |
Catatan (CP36): Β§4.1 hanya berlaku untuk ikan/hero, tidak berlaku untuk properti lingkungan (kerikil tidak butuh 5 ribu tris) β pakai Β§4.1b sebagai gantinya.
Β§4.1b Geometri β Lingkungan (CP36)
Filosofinya: poli rendah-sampai-menengah + normal map, jangan pernah high-poly; pakai ulang/instance beberapa model daripada membuat banyak model unik (jumlah draw call lebih penting daripada jumlah tris di iPad).
| Kelas aset | Budget tris | Catatan |
|---|---|---|
| Joran pancing (hero) | 8.000β15.000 | Termasuk detail reel |
| Senar pancing | <500 | Rantai bone/tabung |
| Permukaan air kolam | 2.000β6.000 | Cukup ter-subdivide untuk riak berbasis vertex |
| Terrain/dasar kolam bawah air | 3.000β8.000 | Sculpt β normal-mapped |
| Terrain garis pantai | 5.000β12.000 | Termasuk transisi lumpur/tanahβrumput |
| Batu hero (dekat/foreground) | 800β2.000 | Normal-mapped |
| Batu/kerikil latar belakang | 100β500 | Di-instance |
| Pohon | 1.500β4.000 | Mesh batang + daun kartu/atlas |
| Rumpun tumbuhan/rumput/reed | 100β600 | Kartu alpha, di-instance |
| Kayu tumbang | 400β1.200 | β |
| Tanaman air | 150β500 | Kartu alpha |
| Kubah langit | <500 | Kubah bertekstur (Β§4.6) |
Target scene: total scene yang sudah dirakit β²150 ribu tris dan β²60 draw call di iPad, dicapai lewat instancing.
Β§4.2 Tekstur
| Prioritas | Resolusi | Map yang wajib ada |
|---|---|---|
| Disukai | 2K (2048Γ2048) | BaseColor + Normal + Roughness |
| Bisa diterima | 1K (1024Γ1024) | BaseColor + Roughness |
| Minimum | 512Γ512 | BaseColor saja (warna flat) |
Β§4.2b Tingkatan tekstur β Lingkungan (CP36)
| Tingkat | Aset | Resolusi |
|---|---|---|
| Hero | Joran+reel, batu foreground/dekat, air | Maks 2K |
| Latar belakang | Pohon, batu jauh, tumbuhan, terrain, langit | 1K |
| Kecil/instanced | Kerikil, kartu rumput | 512 |
Semua material lingkungan wajib PBR penuh: BaseColor + Normal + Roughness + Metallic (metallic=0 untuk semua permukaan alami β batu/kayu/air/tumbuhan bersifat dielektrik; hanya perangkat keras joran/reel yang boleh metallic).
Β§4.6 Konvensi Pencahayaan (CP36) β wajib, supaya semua aset serasi
Setiap aset lingkungan harus dibuat/dipratinjau di bawah satu setup pencahayaan yang sama, kalau tidak, hasilnya tidak akan cocok saat dirakit:
| Properti | Nilai |
|---|---|
| Waktu | Golden hour (pagi awal/sore akhir) |
| Elevasi matahari | ~15Β° di atas horizon |
| Azimuth matahari | 135Β° (belakang-kiri pemain, supaya air memantulkan specular ke arah kamera) |
| Warna matahari | Hangat, ~3200β4000K |
| IBL/ambient | Satu HDRI yang dipakai bersama (Poly Haven CC0, langit golden-hour) β dipakai untuk tekstur kubah langit maupun IBL supaya langit dan pencahayaan serasi |
| Manajemen warna | AgX (default proyek) |
| Palet | Alami, tenang, hangat-desaturasi; tanpa saturasi mencolok |
HDRI yang sama menggerakkan langit yang terlihat maupun IBL β jangan menerangi satu aset dengan environment yang berbeda "cuma buat pratinjau," karena hasilnya akan melenceng.
Β§4.3 Prioritas rigging
| Prioritas | Persyaratan |
|---|---|
| 1 | Sudah di-rig + dianimasikan |
| 2 | Sudah di-rig, belum ada animasi (tambahkan siklus renang) |
| 3 | Belum di-rig, geometri bagus (tambahkan rig + animasi) |
| 4 | Perlu retopologi + rig + animasi |
| 5 | Buat dari nol (Hunyuan3D) |
Β§4.4 Animasi
Siklus renang: 48 frame @ 24fps (2 detik). Jenis gerakan: undulasi tubuh, dayungan sirip pektoral, gelombang sirip dorsal/anal, sinkronisasi sirip ekor (caudal). Jumlah keyframe: sekitar 400β500 keyframe tersebar di 9β10 bone.
Β§4.5 Struktur Armature
Armature standar ikan, 10 bone:
Root β Spine β Spine.001 β Tail β Caudal_Fin
ββ Head
ββ Dorsal_Fin
ββ Anal_Fin
ββ Pectoral_Fin_L
ββ Pectoral_Fin_R
Β§5 β Sistem Koordinat (KRITIS)
Β§5.1 Setup Blender
X = panjang tubuh (kepala-ekor), Y = lebar (lateral), Z = tinggi (punggung-perut).
Β§5.2 Persyaratan Armature
Bone Root WAJIB mengarah ke +Y (kepala di origin, ekor di +0,002 Y) β ini menghasilkan matrix_local identitas, yang menghasilkan rotasi ekspor glTF standar. Semua bone tubuh (Spine, Head, Tail) berada di bidang XZ atau sepanjang sumbu-X. Rotasi objek armature harus (0,0,0) β armature-nya sendiri tidak boleh dirotasi.
Β§5.3 Perilaku Ekspor glTF
Exporter glTF Blender mengubah orientasi Z-up menjadi Y-up dengan menambahkan rotasi β90Β° pada sumbu X hanya pada node ROOT armature, menghasilkan Root rotation: [-0.7071, 0, 0, 0.7071] (ini standar/benar). Exporter juga menukar YβZ pada vertex mesh: Blender X (panjang tubuh) β GLB X (panjang tubuh); Blender Y (lebar) β GLB Z (lebar); Blender Z (tinggi) β GLB Y (tinggi).
Β§5.4 Kesalahan Orientasi yang Umum Terjadi
| Kesalahan | Gejala | Perbaikan |
|---|---|---|
| Bone Root mengarah ke +X | Rotasi root aneh [-0.5,-0.5,-0.5,0.5] | Bangun ulang armature dengan Root mengarah ke +Y |
| Y/Z tertukar pada mesh | Ikan tampak menyamping di viewer | Tukar YβZ pada vertex mesh DAN posisi bone |
| Mesh tidak berpusat di origin | Ikan bergeser dari armature-nya | Terapkan (apply) transform lokasi, pusatkan ulang |
Β§5.5 Checklist Verifikasi (setelah ekspor)
Rotasi Root = [-0.7071, 0, 0, 0.7071]; sumbu X mesh = panjang tubuh (sumbu terpanjang); sumbu Y mesh = tinggi (punggung-perut); sumbu Z mesh = lebar (lateral); tidak ada node tambahan (empty boleh saja kalau memang cuma neutral_bone hasil auto-weight).
Β§6 β Rubrik Penilaian (dari 100)
| Kriteria | Maks | Evaluasi |
|---|---|---|
| Akurasi Anatomi | 35 | Proporsi sesuai spesies, posisi sirip, warna, bentuk tubuh (ramah-game) |
| Kualitas Tekstur | 15 | Resolusi, tampilan hand-painted/PBR-lite yang bersih, akurasi spesies |
| Kualitas Topologi | 20 | Alur edge yang bersih, dominan quad, layout UV bagus, jumlah poli siap-game |
| Optimasi Game | 10 | Dalam rentang 5kβ30k tris, UV efisien, tidak ada geometri sia-sia |
| Ketersediaan Rig | 5 | Sudah di-rig dengan struktur bone yang bisa dipakai |
| Ketersediaan Animasi | 5 | Sudah punya animasi/siklus renang |
| Kualitas Lisensi | 10 | CC0 > CC-BY > RF > Tidak diketahui > NC/ND |
Ambang batas diterima: skor minimal 50/100; lisensi harus termasuk jenis yang diterima; geometri harus dalam rentang LOD0 (5kβ30k tris).
Β§7 β Pipeline 13 Fase
Dikerjakan berurutan untuk setiap spesies ikan:
| Fase | Nama | Deskripsi | Boleh dilewati jika |
|---|---|---|---|
| 01 | Validasi Ilmiah | Data spesies: ukuran, taksonomi, gaya renang, warna | Tidak pernah dilewati |
| 02 | Pencarian Aset | Cari di semua sumber, evaluasi kandidat, pilih pemenang | Tidak pernah dilewati |
| 03 | Download | Ambil file sumber lewat API atau download manual | Tidak pernah dilewati |
| 04 | Verifikasi | Validasi geometri, tekstur, ketentuan lisensi | Tidak pernah dilewati |
| 05 | Akuisisi | Ekstrak, susun ke struktur proyek | Tidak pernah dilewati |
| 06 | Retopologi | Perbaiki topologi jika perlu (ngon, alur edge buruk) | Jika topologi sudah bersih |
| 07 | UV | Perbaiki pemetaan UV jika perlu | Jika UV sudah baik (cakupan >95%) |
| 08 | Tekstur | Bangun ulang material PBR (Principled BSDF) | Tidak pernah dilewati |
| 09 | Rig | Buat armature 10-bone, weight paint | Jika sudah di-rig |
| 10 | Animasi | Buat 4 state animasi | Jika sudah dianimasikan |
| 11 | Poles | Perbaiki rotasi, pusatkan mesh, bersihkan sebelum ekspor | Tidak pernah dilewati |
| 12 | Ekspor | Ekspor 4 file GLB (satu per state) + simpan file Blend | Tidak pernah dilewati |
| 13 | Finalisasi | Wajib: update CHECKPOINT.md/Asset_Candidates.md/Source_Log.md; commit+push | Tidak pernah dilewati |
Β§8 β Struktur File
Β§8.0 Konvensi Penamaan (CP36)
KEPUTUSAN (dari user, 2026-07-16): pakai snake_case untuk SEMUA aset, menggantikan PascalCase lama. Pola: <kategori>_<subjek>[_<varian>][_<NN>].usdz.
| Aset | Nama |
|---|---|
| Permukaan air | pond_water.usdz |
| Dasar kolam | pond_bed.usdz |
| Garis pantai | terrain_shoreline.usdz |
| Batu | rock_shoreline_01.usdz, rock_underwater_01.usdz |
| Pohon | tree_oak_01.usdz |
| Tumbuhan | foliage_grass_01.usdz, foliage_reed_01.usdz |
| Properti | prop_log_01.usdz, prop_pebble_01.usdz |
| Langit | sky_dome.usdz |
| Joran | rod_main.usdz, rod_line.usdz |
| Ikan | marlin_cruise.usdz, catfish_caught.glb, β¦ |
Aturannya: huruf kecil semua, hanya garis bawah (underscore), tanpa spasi/camelCase/PascalCase; varian bernomor pakai 2 digit dengan nol di depan (_01, _02). Aset ikan direncanakan diganti nama dari PascalCase lama (Marlin_Cruise.glb β marlin_cruise.glb) β dicatat sebagai tugas migrasi terpisah; semua referensi silang di dokumen juga perlu diperbarui. (Menurut CLAUDE.md/BUILD_PLAN_ENV.md, penggantian nama ini belum terjadi.)
Pohon folder lengkap yang dimaksudkan (ilustratif β mencerminkan kondisi awal/ideal, misalnya menunjukkan Pond_Small/Medium/Large yang belakangan sudah digantikan):
FishAssets/
βββ AGENTS.md
βββ CHECKPOINT.md
βββ Environment/
β βββ Pond/
β β βββ Pond_Small.glb
β β βββ Pond_Medium.glb
β β βββ Pond_Large.glb
β βββ FishingRod/
β βββ FishingRod.glb
β βββ FishingRod.blend
βββ Fish01_Clownfish/
β βββ Fish01_Clownfish.blend
β βββ Cruise/Clownfish_Cruise.glb (siklus renang 48 frame)
β βββ Bite/Clownfish_Bite.glb (sambaran 24 frame, 2Γ kecepatan)
β βββ Caught/Clownfish_Caught.glb (transisi 72 frame)
β βββ Preview/Clownfish_Preview.glb (idle 48 frame)
β βββ Model/clownfish.glb + download_urls.json
β βββ Textures/
β βββ Documentation/{Asset_Candidates.md, Source_Log.md, Scientific_Validation.md}
βββ Fish02_BlueTang/ (struktur sama)
βββ Fish03_Marlin/ β TERBLOKIR (belum ada sumber CC gratis, saat penulisan)
βββ Fish04_BluefinTuna/ β SELESAI
βββ Fish05_GiantTrevally/ β RUSAK, perlu dibangun ulang
βββ Fish06_MekongGiantCatfish/ β TERBLOKIR
βββ Fish07_YellowfinTuna/ β SELESAI
βββ References/{Images/, Papers/, Videos/}
Β§9 β Setup Material PBR (kode standar Blender)
material.node_tree.nodes["Principled BSDF"].inputs["Base Color"].default_value = (R, G, B, 1.0)
material.node_tree.nodes["Principled BSDF"].inputs["Roughness"].default_value = 0.5
material.node_tree.nodes["Principled BSDF"].inputs["Coat Weight"].default_value = 0.3
material.node_tree.nodes["Principled BSDF"].inputs["Subsurface Weight"].default_value = 0.1
Aturan pemetaan tekstur: Base Color β input Base Color; Roughness β input Roughness (mungkin butuh penyesuaian ColorRamp); Normal β input Normal (set ke Non-Color); AO β Ambient Occlusion atau dikalikan dengan Base Color.
Β§10 β Pengaturan Ekspor (kode contoh)
bpy.ops.export_scene.gltf(
filepath="path/to/export.glb",
use_selection=False,
export_apply=True,
export_animations=True,
export_skins=True,
export_image_format='AUTO',
export_format='GLB'
)
Checklist ekspor: semua transform sudah diterapkan (apply); mesh berpusat di origin; armature di origin dengan Root mengarah ke +Y; tidak ada objek empty tambahan; action animasi sudah ditugaskan (assigned) ke armature; ukuran file <10MB per ikan.
Β§11 β Persyaratan Dokumentasi per spesies ikan
- Asset_Candidates.md: semua kandidat (diterima+ditolak), rincian skor, pilihan akhir + alasannya, tabel status pipeline.
- Source_Log.md: URL sumber asli + lisensi, metode download, semua modifikasi beserta alasannya, log perbaikan.
- Scientific_Validation.md (opsional tapi disarankan): taksonomi/klasifikasi, karakteristik fisik, catatan perilaku renang, detail warna/pola.
- CHECKPOINT.md (level proyek): checkpoint berstempel waktu per fase yang selesai, tabel progres keseluruhan, isu yang diketahui + item tertunda.
Β§12 β Alur Kerja Git
Repo: git@github.com:K-ere-Horee/blender-assets.git. Konvensi commit:
Add Fish0N SpeciesName assets
- Description of what was added
- Key specs (tri count, materials, animation)
- License and attribution
Yang di-commit: file kerja .blend, ekspor .glb, model/tekstur sumber (untuk atribusi), file dokumentasi, AGENTS.md/CHECKPOINT.md. Yang TIDAK di-commit: backup .blend1/.blend2, .DS_Store/Thumbs.db, file temporary.
Β§13 β Isu yang Diketahui & Pelajaran yang Dipetik
- Perubahan API Blender 5.1:
Action.fcurvessudah dihapus β pakaikeyframe_insert()pada pose bone;action.layersadalah sistem layer baru; import OBJ sudah tidak tersedia β pakai import GLB sebagai gantinya. - Download Sketchfab: tool download BlenderMCP rusak; solusinya β baca API key dari preferences, pakai
urllib.requestuntuk memanggil API, download lewat shellcurl. - Sistem koordinat glTF: vertex mesh ditukar YβZ oleh exporter; Root armature mendapat rotasi β90Β° pada sumbu X; bone Root harus mengarah ke +Y untuk ekspor yang benar; Root mengarah ke +X β matrix_local tidak identitas β rotasi salah di GLB.
- Weight Painting: Auto-weights (Bone Heat) sering gagal untuk bone kecil; pakai envelope weights sebagai cadangan, lalu berikan bobot zona anatomi secara manual (berdasarkan jarak-dari-pusat-bone, falloff berbanding terbalik dengan jarak).
- Menganimasikan banyak rantai bone sekaligus (mesh sobek): sebelum menganimasikan beberapa rantai bone secara independen (misalnya bone per-jari sirip dorsal, pasangan sirip pektoral/anal), cek dulu apakah mereka berbagi bobot skin (skin weight) pada vertex mesh yang sama β jangan asumsikan rantai yang namanya berbeda pasti independen secara mekanis hanya karena terlihat berbeda secara semantik. Cek lewat
vertex.groups, cari bobot >0,05 yang menyebar dari dua rantai bone berbeda β karakter hasil import/rig profesional yang kompleks sering mencampur bobot di titik-titik sambungan yang berdekatan. Kalau ada rantai yang berbagi bobot: (a) jaga agar tetap sefase (oscillation phase/frekuensi/sumbu rotasi sama), atau (b) kecilkan amplitudo animasi mendekati nol di area yang berbagi bobot tersebut, biarkan hanya segmen luar yang bobotnya bersih bergerak bebas. Frekuensi/fase/sumbu yang tidak cocok pada vertex yang dibagi bersama akan membuat mesh sobek secara visual (jari sirip lepas, sendi patah salah arah) walaupun amplitudo tiap rantai terlihat baik-baik saja jika dilihat sendiri-sendiri. Selalu cek waras (sanity-check) rig yang dianimasikan dengan render (sudut lebar + close-up di area sirip/sendi, mencakup seluruh rentang frame termasuk amplitudo puncak) sebelum menganggap animasi selesai β rest pose atau satu frame saja bisa terlihat baik padahal gerakannya tetap merobek mesh. - Pembersihan hirarki import Sketchfab: import GLB dari Sketchfab membuat hirarki empty yang dalam (5+ level: Sketchfab_model > fbx > Object_2 > RootNode > ExportRIG); ini membuat transform (skala, rotasi) ikut ter-bake ke dalam matrix dunia armature, sehingga armature bisa menunjukkan matrix_world yang tidak identitas walaupun lokasi/rotasi/skala-nya sendiri sudah identitas. Selalu putuskan rantai parent (
obj.parent = None) sebelum dipakai, lalu terapkan (apply) semua transform baik di armature maupun body. Vertex mesh body bisa saja bergeser dari armature setelah di-append β cek keselarasan dengan membandingkan batas vertex vs posisi kepala bone. Objek duplikat sering muncul kalau memuat dari beberapa file .blend sekaligus β pastikan dulu salinan mana yang harus dipakai sebelum menghapus yang lain. File .blend yang berdiri sendiri sebaiknya hanya berisi tubuh ikan + armature, tanpa empty yang nyasar.
Β§14 β Catatan Integrasi RealityKit
Ditandai DIKOREKSI (CP36, 2026-07-16): game ini BUKAN AR β tidak memakai kamera perangkat; merender scene 3D orang-pertama yang sepenuhnya virtual di iPad/macOS lewat mode non-AR RealityKit. Konsekuensinya: tidak ada deteksi bidang, tidak ada penyesuaian permukaan saat runtime, tidak ada estimasi cahaya ARKit (pencahayaan dibuat sendiri sesuai Β§4.6), langit adalah geometri yang dirender, bukan hasil passthrough kamera.
- Aset lingkungan + joran: hanya format USDZ (satu file per aset, masing-masing diposisikan/diskala/dianimasikan lewat kode). Ikan tetap memakai pasangan GLB + USDZ seperti biasa.
- Skala: 1 unit Blender = 1 meter, scene harus konsisten dengan ikan yang sudah dikirim (grouper 0,6 m β marlin 3,0 m), kolam berukuran sedemikian rupa supaya ikan terlihat meyakinkan.
- Kamera orang-pertama berada di garis pantai, tinggi mata ~1,6 m β buat/pratinjau dari sudut pandang itu, bukan dari tampilan orbit.
- Animasi diputar otomatis kalau sudah dikonfigurasi; lengkungan joran + ketegangan senar digerakkan dari kode (kemiringan perangkat) β ekspos bone-nya, jangan hanya mengandalkan klip yang di-bake.
- Validasi setiap aset dengan
usdcheckersebelum disetujui; pengecekan akhir di Reality Composer Pro.
Item terbuka / TODO / keterbatasan (dari AGENTS.md)
- Β§1.1 dan Β§14 sama-sama menandai spesifikasi lama kolam-AR sebagai sudah mati/digantikan β perubahan arah proyek besar yang perlu diketahui pembaca saat membaca bagian-bagian lama.
- Daftar spesies di Β§2 hanya bersifat historis; roster sebenarnya dicatat di tempat lain (BUILD_PLAN.md/CHECKPOINT.md).
- Migrasi penamaan file ikan dari PascalCaseβsnake_case (Β§8.0) masih jadi tugas terbuka yang belum disentuh.
- Marlin (Fish03) dan Mekong Giant Catfish (Fish06) ditampilkan sebagai "TERBLOKIR" di pohon folder ilustratif β status ini berlaku saat terakhir bagian itu ditulis, sudah digantikan menurut CLAUDE.md (keduanya belakangan selesai).
- Giant Trevally (Fish05) ditampilkan sebagai "RUSAK, perlu dibangun ulang" di pohon folder yang sama.
- Langkah git push disebut "Tidak berlaku β belum ada repo lokal" menurut BUILD_PLAN.md (lihat Dokumen 3), padahal AGENTS Β§12 mendokumentasikan alur kerja git yang lengkap β kedua dokumen ini saling bertentangan di titik ini; dicatat sebagai celah proses, bukan diselesaikan.
1.3 Rencana Pembangunan Ikan β FishAssets/BUILD_PLAN.md (116 baris)
Ini adalah peta jalan kerja untuk membangun roster ikan β hasil saringan dan rangkuman aturan AGENTS.md yang relevan menjadi satu checklist per-ikan, ditambah catatan pembangunan konkret per spesies (UID sumber, cacat yang diketahui, target jumlah poligon). Aturannya: bangun satu ikan sampai tuntas melalui seluruh 13 fase sebelum mulai ikan berikutnya.
Cakupan & Urutan
Roster yang sudah dikonfirmasi (CHECKPOINT.md CP28); Bluefin Tuna (Fish04) sudah selesai. Urutan pembangunan sisanya, dari termudah ke tersulit:
| # | Ikan | Slot | Titik awal |
|---|---|---|---|
| 1 | Yellowfin Tuna (Madidihang) | Fish07 | Sumber CC0 sudah di-download β langsung bangun |
| 2 | Giant Trevally (GT) | Fish05 | Geometri rusak β download ulang sumber CC0 + bangun ulang |
| 3 | Skipjack Tuna | Fish08 | Pencarian aset β bangun |
| 4 | Grouper | Fish09 | Pencarian aset β bangun |
| 5 | Marlin | Fish03 | Sebelumnya terblokir penuh β cari sumber baru atau generate |
Spesifikasi umum yang wajib dipatuhi setiap ikan (ringkasan dari AGENTS.md)
- Pipeline 13-fase (Β§7): 01 Validasi-ilmiah β 02 Pencarian β 03 Download β 04 Verifikasi β 05 Akuisisi β 06 Retopo (lewati jika sudah bersih) β 07 UV (lewati jika >95%) β 08 Tekstur (PBR Principled) β 09 Rig (10-bone, lewati jika sudah di-rig) β 10 Animasi (4 state) β 11 Poles β 12 Ekspor β 13 Finalisasi/dokumentasi.
- Geometri (Β§4.1): LOD0 = 5kβ30k tris. Decimate hasil scan mentah ke rentang ini dengan hati-hati β Trevally sempat hancur karena decimate yang buruk memecah hasil photoscan.
- Tekstur (Β§4.2): 2K lebih disukai, jaga tetap β€2K supaya file ekspor tidak kebesaran (pelajaran dari Fish04).
- Rig (Β§4.5): armature standar 10-bone (RootβSpineβSpine.001βTailβCaudal_Fin, +Head, Dorsal_Fin, Anal_Fin, Pectoral_Fin_L/R). Lewati jika model sudah punya rig yang bisa dipakai.
- 4 state animasi (Β§1.3): Cruise (loop renang), Bite (sambaran cepat ~2Γ), Caught (merontaβtenangβdipajang), Preview (idle). Tuna/trevally/marlin adalah perenang thunniform β jaga badan tetap kaku, dorongan berasal dari batang ekor (peduncle) + sirip ekor bulan sabit (lunate caudal fin), minim undulasi tubuh. Grouper adalah ikan karang yang lebih lambat β gerakan pektoral/tubuh lebih banyak.
- Sistem koordinat (Β§5): Bone Root mengarah ke +Y (kepala di origin, ekor di +Y) β matrix_local identitas β rotasi root glTF yang benar
[-0.7071,0,0,0.7071]. Panjang di sumbu tubuh, tinggi di Z, lebar di X. Terapkan (apply) SEMUA transform; mesh berpusat di origin; tanpa empty yang nyasar. Hasil scan Sketchfab mentah biasanya ter-import dengan rotasi belum di-apply (lokalβ dunia) dan hirarki empty yang dalam β putuskan parent + apply transform dulu (Β§13 pembersihan Sketchfab). - Penjaga anti-sobek mesh (Β§13): cek bobot skin yang dibagi bersama antar-rantai bone sebelum menganimasikan secara independen; jaga area yang berbagi bobot tetap sefase atau kecilkan amplitudo mendekati nol. Cek waras setiap animasi dengan render (sudut lebar + close-up sirip, pada amplitudo puncak).
- Ekspor (Β§10): GLB (
export_animation_mode='ACTIVE_ACTIONS'β satu action per file state, pelajaran dari Fish04) + USDZ (relative_paths=True,export_animation=True,convert_world_material=False, Y-up). Validasi USDZ denganusdchecker. Target <10 MB per file. - Dokumentasi (wajib): update CHECKPOINT.md + Asset_Candidates.md/Source_Log.md/Scientific_Validation.md milik ikan tersebut setelah setiap ikan selesai. Catatan: "Git push saat ini tidak berlaku β belum ada repo lokal."
Catatan infrastruktur (spesifik lingkungan kerja, bukan aturan)
Blender berjalan secara live (GUI) lewat MCP TCP di localhost:9876; dikendalikan dengan helper execute_code berbasis raw-socket (tmp/blend.py). Import glTF butuh temp_override(window/screen/area/region) untuk viewport, kalau tidak akan error di context.object. Download Sketchfab: baca sketchfab_api_key dari preferences addon Blender, ambil lewat urllib (curl kena error sandbox). Id engine render adalah BLENDER_EEVEE (bukan _NEXT).
Rencana per ikan
1. Yellowfin Tuna (Fish07) β SIAP DIBANGUN. Sumber: Sketchfab CC0 ffishAsia (UID d4eeea976932β¦), sudah di-download ke Model/gltf/. 1,39 juta tris, tanpa rig, ~26 m (skala salah β perlu dikoreksi), pose mati dengan mulut terkulai terbuka, rotasi belum di-apply. Fase 01β03 sudah selesai.
- 04/05: sudah di-import; gabungkan tile-tile body, hapus color-chart yang mengambang.
- Pra-11 pembersihan: apply transform (perbaiki rotasi lokalβ dunia), pusatkan ke origin, ubah skala ke panjang β2,0 m (skala yellowfin sungguhan), luruskan pose yang terkulai, tutup/rilekskan rahang.
- 06 Retopo β decimate hati-hati ke LOD0 (~15β25k tris); pastikan tidak pecah setelah decimate (rasio edge batas harus tetap rendah) β ini persis kegagalan yang menghancurkan Trevally.
- 07 UV: UV hasil photoscan sudah ada, dipertahankan kalau masih bisa dipakai, kalau tidak, tekstur yang sudah di-bake masih tetap bisa dipetakan.
- 08 Tekstur: bangun ulang PBR Principled dari baseColor hasil scan, turunkan resolusi ke β€2K.
- 09 Rig: armature standar 10-bone, Root +Y; weight-paint (fallback berbasis zona kalau auto-weight gagal).
- 10 Animasi: 4 state thunniform; verifikasi dengan render sweep (penjaga anti-sobek mesh).
- 12 Ekspor: 4 file GLB + 4 file USDZ ke Cruise/Bite/Caught/Preview; validasi; simpan file .blend.
- 13 Dokumentasi: update Source_Log/Asset_Candidates/Scientific_Validation + CHECKPOINT.
2. Giant Trevally (Fish05) β BANGUN ULANG DARI SUMBER. Aset yang ada sudah tidak bisa diselamatkan (geometri dasarnya pecah, dikonfirmasi dengan armature dinonaktifkan).
- 03 Download ulang: Sketchfab CC0 ffishAsia (UID
e6446df50ba746ed8ce8a3dd66b3b8e8) lewat API Sketchfab β folder Model/ baru (folder sumber lokal lama sudah hilang). - Urutan sama seperti Yellowfin (bersihkan β decimate hati-hati dengan cek pecahan β tekstur β rig β 4 animasi β ekspor β dokumentasi). Pakai ulang Documentation GT yang sudah ada.
- Ganti file .blend dan GLB yang rusak hanya setelah hasil bangun ulang tervalidasi.
3. Skipjack Tuna / Cakalang (Fish08) β PENCARIAN + BANGUN.
- 01 Validasi ilmiah: Katsuwonus pelamis β skala game ~0,8β1 m, punggung biru gelap, perut perak dengan 4β6 garis lurik gelap memanjang di sisi bawah (ciri identifikasi), thunniform.
- 02 Pencarian: Sketchfab CC0/CC-BY dulu (5+ percobaan/sumber, Β§3), skor β₯50 (Β§6), dalam rentang LOD0. Sumber cadangan sesuai Β§3.1.
- 03β13: pipeline standar (kemungkinan besar perlu di-rig dari nol seperti tuna-tuna lainnya).
4. Grouper / Kerapu (Fish09) β PENCARIAN + BANGUN.
- 01 Validasi ilmiah: misalnya Epinephelus sp. β ikan karang bertubuh gempal, mulut besar, corak coklat/zaitun berbintik-bintik; bukan thunniform β renang carangiform/labriform yang lebih lambat, gerakan pektoral + tubuh lebih banyak dalam animasi.
- 02 Pencarian β 03β13: pipeline standar. Peluang bagus untuk menemukan model ikan karang gratis.
5. Marlin (Fish03) β TERSULIT.
- Sebelumnya terblokir total (tidak ditemukan aset CC gratis; dokumentasi ada di Fish03/Documentation).
- 02 Pencarian (diperluas): sisir ulang semua sumber Β§3 dengan lebih banyak percobaan; cek Blue Marlin Makaira nigricans DAN Black/Striped marlin sebagai alternatif. Kalau tetap tidak ada yang layak β fallback Fase-5: buat dari nol (Hunyuan3D β catatan: pernah ada kesalahan billing sebelumnya; atau bikin manual base bill-fish sederhana). Baru setelah itu rig/animasi/ekspor.
Verifikasi (per ikan, sebelum ditandai selesai)
- Render sweep dari 4 state (sudut lebar + close-up sirip/sendi, frame amplitudo puncak) β tidak boleh ada yang sobek.
- Cek GLB: rotasi root
[-0.7071,0,0,0.7071], sumbu mesh benar, satu animasi per state, skin ada, <10 MB (Β§5.5). usdcheckerlolos di setiap USDZ.- Import ulang tiap GLB ke scene bersih dan render (untuk menangkap regresi ekspor).
- Terakhir: user melakukan review di Reality Composer Pro.
Item terbuka / TODO / keterbatasan (dari BUILD_PLAN.md)
- Marlin (Fish03) secara eksplisit ditandai tersulit / tidak ada sumber gratis saat penulisan; fallback scratch-build ditandai dengan catatan "pernah ada kesalahan billing" untuk Hunyuan3D.
- "Git push saat ini tidak berlaku β belum ada repo lokal" β bertentangan langsung dengan alur kerja git di AGENTS.md Β§12; dicatat sebagai inkonsistensi, tidak diselesaikan di dokumen ini.
- Menurut CLAUDE.md (status terkini), kelima ikan dalam rencana ini (Yellowfin, Trevally, Skipjack, Grouper, Marlin) sekarang sudah selesai semua β dokumen ini adalah potret historis/sedang-berjalan, bukan status terkini.
- Catatan-catatan seputar tooling Sketchfab (tool download BlenderMCP yang rusak, error sandbox curl) adalah kendala khusus lingkungan kerja yang perlu diketahui pembangun di masa depan, bukan sesuatu yang sudah diperbaiki secara permanen.
1.4 Rencana Pembangunan Lingkungan β FishAssets/BUILD_PLAN_ENV.md (186 baris)
Ini adalah dokumen pendamping BUILD_PLAN.md, tapi untuk lingkungan + joran pancing, bukan ikan. Isinya mendokumentasikan brief kreatif yang sudah dikonfirmasi untuk scene dermaga/danau orang-pertama (setelah berbelok dari konsep kolam-AR semula), daftar lengkap aset yang harus dikirim beserta tabel progres yang hidup, strategi sourcing, pipeline khusus lingkungan (menggantikan pipeline 13-fase ikan), urutan pembangunan, dan item terbuka. Ditulis 2026-07-16 (CP36), difinalisasi sesuai brief yang dikonfirmasi user (CP36b).
Β§0 β Premis yang Dikonfirmasi
- BUKAN AR β kamera perangkat tidak pernah dipakai; RealityKit merender dunia 3D orang-pertama yang sepenuhnya virtual di iPad/macOS dengan pemain ditempatkan di dalamnya.
- Setting: kolam/danau ikan trofi buatan yang sudah ditebar β besar, dalam, buatan manusia/eksotis, tempat spesies unggulan sengaja diintroduksi. Framing ini membuat masuk akal spesies air tawar + laut lepas hidup di satu badan air (marlin 3,0 m dan catfish Mekong di danau yang sama). Skala waduk, bukan kolam alami kecil β cukup dalam untuk secara visual masuk akal menampung ikan besar.
- Pemain: orang-pertama, tinggi mata 1,6 m, berdiri di dermaga/dermaga kayu yang menjorok ke air; bisa menunduk dan melihat dermaga serta joran mereka sendiri β kehadiran fisik adalah tujuannya.
- Roster (7 ikan β sudah dibangun saat penulisan, jangan buat ikan baru): mekong giant catfish, giant trevally, grouper, bluefin tuna, yellowfin tuna, skipjack tuna, marlin/sailfish. (Clownfish + blue tang di luar roster ini.)
- Input (memengaruhi rigging, bukan geometri): Cast = gestur flick di iPhone-sebagai-kontroler; Fight = kemiringan HP, menggerakkan lengkungan joran + ketegangan senar secara real-time β joran dan senar harus berupa rig yang bisa digerakkan lewat bone, BUKAN klip yang di-bake.
- Alur game: Cruise (berpatroli/menampakkan diri) β Bite (sambaran cepat ~2Γ) β Caught (merontaβtenangβdipajang) β Preview (turntable statis untuk UI koleksi/album).
- Pencahayaan: skybox golden-hour yang di-bake + lampu directional statis. Tidak ada siang-malam dinamis.
- Air: butuh shader real-time (normal animasi, riak/refraksi) β secara eksplisit ini tugas shader/teknis terpisah, BUKAN modeling; bangun mesh-nya siap-shader, shader-nya menyusul.
Tabel digantikan-vs-aktual:
| Digantikan (superseded) | Aktual |
|---|---|
| ARKit / AR passthrough / "dioptimasi untuk AR" | Scene 3D virtual, tanpa kamera |
| "di bawah pencahayaan dinamis ARKit" | Skybox yang di-bake + lampu directional statis |
| AGENTS Β§1.1: 3 ukuran kolam, responsif terhadap permukaan datar yang terdeteksi | Sudah mati β satu danau berskala waduk yang tetap |
| "kolam alami kecil" | Danau ikan trofi buatan, skala waduk, dalam |
Keputusan user: SATU lingkungan yang imersif; snake_case di mana-mana; USDZ saja (lingkungan); Sketchfab dulu, Hunyuan3D hanya kalau tidak ada yang cocok.
Β§0b β Referensi Skala (diusulkan)
| Elemen | Ukuran |
|---|---|
| Badan air yang terlihat | ~80 Γ 60 m |
| Kedalaman dekat dermaga | 8β12 m (masuk akal untuk ikan besar di bawah pemain) |
| Dermaga | ~9 m panjang Γ 2 m lebar, dek ~0,8 m di atas garis air |
| Tinggi mata | 1,6 m berdiri di dermaga |
| Cek skala ikan | 0,6 m grouper β¦ 3,0 m marlin β 1 unit Blender = 1 m |
Β§1 β Daftar Aset yang Harus Dikirim
Setiap aset adalah file .usdz terpisah (sesuai penamaan AGENTS Β§8.0), diposisikan/diskala/dianimasikan secara independen lewat kode. Jangan pernah satu file scene gabungan.
Β§1a β ESENSIAL (dibangun lebih dulu, satu per satu, berurutan)
Progres saat penulisan: 6/6 esensial + 11/11 sekunder + 1 aset penghalus = 18/18 selesai (per 2026-07-17). Pembangunan penuh selesai ditambah satu babak penghalusan, dipicu oleh feedback user "lingkungan keseluruhan terlihat seperti kardus," yang diatasi dengan: (a) HDRI langit di-sourcing ulang di 8K β di-bake ke 4K (sebelumnya 2K); (b) aset baru terrain_horizon_ring.usdz (3.409 tris, dibuat manual + tekstur CC0, cincin bukit+pepohonan yang menjembatani scene inti dengan kubah langit); (c) render verifikasi sekarang memakai pencahayaan Sun+HDRI yang sudah dipasangkan sesuai Β§4.6, bukan lagi pratinjau netral flat. Dua bug ekspor material yang signifikan ditemukan/diperbaiki selama babak ini, dirinci di bagian "REFINEMENT PASS" milik Source_Log.md. Item terbuka yang tersisa dicatat di Β§4b.
Tabel lengkap aset esensial:
| # | File | Kelas | Tris | Tekstur | Status |
|---|---|---|---|---|---|
| 1 | dock_main.usdz | hero | 6β12k | 2K | SELESAI β sourced (CC-BY, PT34), 9.084 tris, 4,09Γ9,0Γ2,86 m, dek +0,80 m, 3,66 MB, usdchecker β |
| 2 | water_surface.usdz | air | 2β6k | β | SELESAI β dibuat manual, 5.280 tris, 80Γ60 m @ z=0, 0,18 MB, usdchecker β; shader = tugas lanjutan terpisah |
| 3 | terrain_underwater.usdz | terrain | 5β10k | 1K | SELESAI β heightfield dibuat manual + tekstur CC0 damp_sand; 8.960 tris; rak β0,65 m (tempat tiang dermaga menancap) β basin β11 m; 2,78 MB, usdchecker β |
| 4 | rod_main.usdz | hero | 8β15k | 2K | SELESAI β sourced (CC-BY, ergin3d.com) + rig kustom; 12.531 tris; RootβHandleβRod_01/02/03βTip; sudah dites bengkoknya dan bersih; 2,33 MB, usdchecker β |
| 5 | rod_line.usdz | hero | <500 | 512 | SELESAI β dibuat manual, 224 tris, rig 6-bone sendiri (AnchorβLine_01..04), independen dari rig joran; tersambung di ekor bone Tip milik joran; 12,3 KB, usdchecker β |
| 6 | sky_dome.usdz | langit | <500 | 1β2K | SELESAI β HDRI CC0 (bell_park_dawn, Poly Haven) di-bake lewat AgX ke JPEG 2K pada kubah buatan manual 368-tris; emission unlit, tanpa lampu yang di-bake; 14,9 KB, usdchecker β |
Catatan urutan: HDRI golden-hour dipilih di awal sebagai referensi pratinjau/validasi supaya setiap aset dinilai di bawah pencahayaan final β tapi aset sky_dome sendiri dikirim di urutan #6 sesuai prioritas user. Ini aman karena pencahayaannya baked/statis dan albedo PBR tidak tergantung pencahayaan.
Β§1b β SEKUNDER β semua 11 selesai (2026-07-17, disetujui user)
| # | File | Tris | Status |
|---|---|---|---|
| 7 | rock_shoreline_01/02/03.usdz | 594 / 876 / 1.484 | sourced (CC-BY), 0,61/0,22/0,65 MB |
| 7 | foliage_grass_01.usdz | 728 | sourced (CC-BY), kartu-alpha, 1,53 MB |
| 7 | foliage_reed_01.usdz | 1.314 | sourced (CC-BY), tanaman cattail, 1,61 MB |
| 8 | tree_01/02/03.usdz | 3.744 / 3.018 / 1.812 | sourced (CC-BY) β cemara/pohon daun lebar/palem, 0,90/1,70/1,12 MB |
| 9 | prop_bucket_01.usdz | 1.054 | sourced (CC-BY), 0,71 MB |
| 9 | prop_tacklebox_01.usdz | 2.003 (di-decimate dari 4.174) | sourced (CC-BY), 0,74 MB |
| 9 | prop_rope_01.usdz | 496 | dibuat manual (tidak ada gulungan tali CC yang cocok), 18,8 KB |
(Catatan: penomoran di tabel sumber mengulang "7" dan "9" pada beberapa baris β direproduksi persis seperti aslinya; jumlah baris totalnya cocok dengan 11 aset sekunder: 3 batu + rumput + reed + 3 pohon + ember + tacklebox + tali = 11.)
Target scene: β²150 ribu tris, β²60 draw call (batu/rumput/pohon di-instance).
Β§1c β Format laporan wajib per aset
Untuk setiap aset, laporkan: sourced vs dibuat manual Β· nama file Β· lokasi penyimpanan Β· penyimpangan dari spesifikasi (jumlah poli, resolusi tekstur, penyederhanaan) Β· hasil usdchecker.
Β§2 β Strategi Sumber
MCP yang benar-benar tersedia (diverifikasi 2026-07-16) β "TANS" dan "WinU1" pada brief tidak benar-benar ada:
| Sumber | Status | Dipakai untuk |
|---|---|---|
| Poly Haven | CC0, tanpa key | Utama β HDRI langit, tekstur PBR terrain/batu/kulit kayu, model batu & kayu tumbang |
| Sketchfab | key sudah diset | Pohon, tumbuhan, joran (CC0/CC-BY saja, AGENTS Β§3.3) |
| Tencent Hunyuan3D | kredensial diset, pernah ada error billing | Pilihan terakhir saja |
| Hyper3D Rodin | tanpa API key | Tidak tersedia |
| Bikin manual di Blender | selalu tersedia | Bidang air, terrain, dasar kolam, rig joran/senar β lebih cepat/bersih daripada sourcing |
Aturan lisensi tetap sama: CC0/Public Domain/CC-BY saja; kalau CC-BY β atribusi wajib dicatat.
Β§3 β Pipeline (varian lingkungan dari Β§7)
Pipeline 13-fase ikan berpusat pada spesies; rubriknya ("Akurasi Anatomi 35") dan Fase 01 "Validasi Ilmiah" tidak relevan untuk sebuah batu. Pipeline lingkungan:
| Fase | Nama | Catatan |
|---|---|---|
| E01 | Desain scene | Layout, garis pandang dari kamera orang-pertama 1,6 m, komposisi |
| E02 | Penguncian pencahayaan | Pilih HDRI dulu (Β§4.6) β semua dibuat di bawah HDRI itu |
| E03 | Pencarian | Poly Haven β Sketchfab β bikin manual; catat semua kandidat |
| E04 | Akuisisi/Verifikasi | Cek lisensi, jumlah tris, resolusi tekstur |
| E05 | Model/Retopo | Capai budget Β§4.1b; detail lewat normal map, bukan geometri |
| E06 | UV | Tidak boleh tumpang tindih; atlas untuk tumbuhan |
| E07 | Tekstur | PBR penuh (albedo/normal/roughness/metallic), tingkatan sesuai Β§4.2b |
| E08 | Rig | Hanya joran + senar |
| E09 | Animasi | Riak air; cast/reel/fight/idle joran; ketegangan senar |
| E10 | Rakit & cek | Scene penuh dari kamera orang-pertama di bawah pencahayaan terkunci |
| E11 | Ekspor | USDZ per aset; usdchecker wajib lolos |
| E12 | Dokumentasi | Environment/Documentation/ + CHECKPOINT (AGENTS Β§0) |
Rubrik penilaian lingkungan (menggantikan Β§6 untuk lingkungan):
| Kriteria | Maks |
|---|---|
| Kecocokan visual dengan gaya semi-realistis golden-hour | 30 |
| Kualitas tekstur / kelengkapan PBR | 20 |
| Kepatuhan topologi & budget (Β§4.1b) | 20 |
| Performa real-time (instancing, draw call) | 15 |
| Kualitas lisensi (CC0 > CC-BY) | 15 |
Ambang batas 50/100; lisensi harus CC0/CC-BY.
Β§4 β Urutan Pembangunan (dikonfirmasi user, CP36b)
Referensi pencahayaan E02 (HDRI) dipilih lebih dulu (hanya untuk pratinjau/validasi, bukan aset yang dikirim). Lalu 6 aset esensial dibangun satu per satu, masing-masing dilaporkan+diverifikasi sebelum lanjut ke berikutnya: 1. dock_main β 2. water_surface (mesh saja) β 3. terrain_underwater β 4. rod_main β 5. rod_line β 6. sky_dome. BERHENTI β aset sekunder (7β9) baru mulai dikerjakan setelah user menyetujui aset-aset esensial.
Β§4b β Tugas lanjutan (BUKAN modeling β dicatat, belum dikerjakan di sini)
| Tugas | Alasan |
|---|---|
| Shader air (normal animasi, riak, refraksi, depth fade) | User sudah menandai secara eksplisit: water_surface.usdz dikirim sebagai geometri siap-shader; shader real-time adalah tugas material RealityKit terpisah |
| Migrasi penggantian nama ikan β snake_case | ~80 file yang sudah dikirim + referensi silang dokumen |
Β§5 β Gaya Seni
(Tidak berubah dari pembukaan Β§4): semi-realistis, cocok dengan ikan-ikan yang sudah realistis; bukan kartun, bukan photoreal yang terlihat aneh (uncanny). Alami, menenangkan, palet golden-hour hangat-desaturasi. Pencahayaan konsisten sesuai Β§4.6.
Β§6 β Verifikasi (per aset, sebelum dianggap "selesai")
Rendernya benar dari kamera orang-pertama 1,6 m di bawah HDRI yang terkunci; jumlah tris sesuai Β§4.1b; tekstur sesuai tingkatan Β§4.2b; map PBR lengkap; metallic=0 pada permukaan alami; usdchecker β Sukses; skala masuk akal dibanding ikan yang sudah dikirim (0,6 m grouper β¦ 3,0 m marlin, 1 unit Blender = 1 m); cek draw-call/tris pada scene yang sudah dirakit.
Β§7 β Item Terbuka
Migrasi penggantian nama ikan (user sudah memutuskan snake_case di mana-mana): ~80 file GLB/USDZ yang sudah dikirim + setiap referensi silang dokumen harus diganti namanya (contoh: Marlin_Cruise.glb β marlin_cruise.glb). Dicatat terpisah β karena ini mengubah-ubah deliverable yang sudah selesai dan tervalidasi, jadi ini tugasnya sendiri, tidak digabung ke pembangunan lingkungan.
Item terbuka / TODO / keterbatasan (dari BUILD_PLAN_ENV.md)
- Shader air secara eksplisit ditunda β belum dibangun di repo ini.
- Migrasi penggantian nama ikan (~80 file) secara eksplisit ditunda, dicatat tapi belum dimulai.
- Dua "bug ekspor material yang signifikan" dari babak penghalusan hanya dirangkum di sini; detail lengkapnya ada di bagian "REFINEMENT PASS" milik Source_Log.md (tidak ikut dibaca untuk tugas ini).
- Penomoran tabel progres aset sekunder (baris berlabel "7" dan "9" yang berulang) tampaknya adalah keanehan penulisan pada dokumen sumbernya sendiri, direproduksi apa adanya di atas.
1.5 Catatan Serah Terima Tim Aplikasi β FishAssets/APP_TEAM_HANDOFF.md (195 baris)
Ini adalah catatan serah terima satu kali pakai, ditulis oleh sesi Claude Code yang mengerjakan fitur preview ikan AR di repo aplikasi terpisah (CtSPoC), ditujukan untuk sesi mana pun di masa depan yang punya akses live ke Blender MCP (hanya bisa diakses dari repo aset ini, bukan dari repo aplikasi). Isinya mendokumentasikan perbaikan akar-masalah yang perlu dilakukan di Blender untuk bug orientasi/normal/tekstur yang memengaruhi ekspor Preview/ beberapa spesies ikan, karena menambal file .usdz yang sudah diekspor (dari sisi repo aplikasi) sudah mentok jalan buntu. File ini secara eksplisit bilang harus dihapus setelah pekerjaan yang dideskripsikan benar-benar selesai β ini catatan tugas sementara, bukan bagian dari dokumentasi permanen repo (per update terakhirnya file ini masih ada karena pekerjaannya belum tuntas).
Kenapa file ini ada
Tim aplikasi sempat mencoba memperbaiki bug orientasi/rendering dengan menambal file .usdz yang sudah diekspor (menambahkan koreksi xformOp:rotateXYZ, membangun ulang material yang hilang dari tekstur file .glb pasangannya). Cara ini gagal secara struktural: rumus koreksi rotasi angka yang sama berhasil untuk sebagian spesies tapi tidak untuk yang lain, membuktikan objek-objek Blender itu sendiri memang tidak konsisten diorientasikan/diekspor satu sama lain β harus diperbaiki di sumber Blender-nya, bukan ditambal per-file ekspor.
- Spesies referensi/template: Mekong Giant Catfish (
Fish06_MekongGiantCatfish) β user sudah mengonfirmasi langsung di perangkat bahwa ini ikan dengan hasil ekspor/orientasi terbaik saat ini di aplikasi. Pakai transform objek Blender-nya, setup material, dan proses ekspornya sebagai template untuk yang lain. - Jangan sentuh Sailfish (
Fish10_Sailfish) β sudah dikonfirmasi benar di perangkat, melalui jalur import berbeda (Sketchfab/FBX) dibanding ikan-ikan Blender-native lainnya, jadi konvensinya memang sudah berbeda dari yang lain β biarkan saja. - Cakupan: hanya ekspor state
Preview/(.glb + .usdz per spesies) β satu-satunya state yang dipakai aplikasi saat ini (layar AR "muncul dan periksa"). Ekspor Cruise/Bite/Caught di luar cakupan tugas ini.
Linimasa status per spesies (dari pengujian AR di perangkat)
- Update 2026-07-20 (CP43): 2 dari 5 spesies bermasalah sudah diperbaiki. Akar masalah isu normal ditemukan dan dikonfirmasi: data custom split-normal basi dari pipeline scan yang menimpa arah hadap wajah (
mesh.has_custom_normals == True); perbaikannya =customdata_custom_splitnormals_clear()lalunormals_make_consistent(inside=False), urutannya harus begitu. Resep itu tidak aman untuk langsung dipakai ke 3 sisanya β malah memperburuk ketiganya secara terukur (lihat CP43 untuk angkanya) karena mesh mereka membawa kontaminasi non-manifold yang lebih berat daripada yang bisa aman diselesaikan cuma dengan recalculate lewat skrip; mereka butuh babak bangun-ulang sungguhan (weld-sebelum-decimate, verifikasi viewport langsung), sama seperti perbaikan pecah Giant Trevally di CP30 aslinya. - Update 2026-07-20 (CP46): Mesh Preview Giant Trevally mendapat babak pembersihan sungguhan β 39 segitiga sampah terisolasi + 30 wajah interior yang terbukti tersembunyi dihapus lewat
select_interior_faces(), jumlah edge non-2-manifold turun dari 165β101. Temuan penting: pola "lubang seperti dimakan ngengat" yang dramatis dan awalnya terlihat seperti gejala yang dilaporkan pada render backface-culled ternyata cuma artefak pencahayaan, bukan cacat sungguhan β dikonfirmasi dengan render material-flat + latar terang yang menunjukkan siluet solid penuh. Follow-up di hari yang sama: screenshot viewport Blender milik user sendiri menunjukkan mesh masih terlihat jelas berduri/sobek di area kepala/insang/dorsal β cacat yang lebih besar dan lebih jelas daripada apa pun yang terungkap dari analisis babak ini, lebih mendekati kelas bug "pecah/hancur" asli di CP30 daripada isu duplikasi-geometri halus yang diperbaiki babak ini. Giant Trevally dikonfirmasi masih rusak β dilewati dulu atas instruksi user, butuh bangun-ulang penuh weld-sebelum-decimate dari scan sumber mentah (seperti CP30), bukan tambalan topologi lokal lagi. - Update 2026-07-21 (CP47): Mesh Preview Skipjack Tuna sudah dibersihkan dan dikonfirmasi solid secara visual, memakai metode debris/wajah-interior yang sama seperti Trevally tapi dijalankan sampai benar-benar konvergen: 1 segitiga sampah terisolasi + 3.180 wajah interior (11,4% dari mesh) dihapus lewat
select_interior_faces(), edge non-manifold turun dari 2.923β798. Berbeda dari Trevally, sudah dicek dulu untuk pecahan skala-besar (tidak ada vertex berduri, hanya 1 pulau mesh sungguhan) dan hasilnya diverifikasi dengan render material-flat + latar terang dari 5 sudut β solid penuh di setiap sudut, tanpa lubang, tanpa siluet berduri. Lebih yakin ini benar-benar sudah diperbaiki dibanding Trevally, tapi belum dikonfirmasi di perangkat. - Update 2026-07-21 (CP48): Mesh Preview Grouper dibersihkan dengan cara yang sama, hasilnya sama bersihnya. Sudah dicek dulu untuk pecahan (tidak ada β kelas kegagalan yang sama-sama bisa ditangani seperti Skipjack), lalu 364 wajah sampah (pulau-pulau kecil terputus) + 1.023 wajah interior dihapus lewat
select_interior_faces(), edge non-manifold turun dari 2.511β479. Diverifikasi solid di 5 sudut dengan tes material-flat + latar terang yang sama. Ini menuntaskan ketiga spesies yang masih rusak dari CP43: Skipjack dan Grouper sudah dibersihkan dan dikonfirmasi solid secara visual (belum dites di perangkat); Giant Trevally tetap benar-benar rusak dan butuh bangun-ulang penuh.
Tabel status per spesies
| Spesies | Folder | Status | Gejala |
|---|---|---|---|
| Mekong Giant Catfish | Fish06_MekongGiantCatfish | Referensi β bagus | tidak ada |
| Sailfish | Fish10_Sailfish | Bagus β jangan disentuh | tidak ada |
| Bluefin Tuna | Fish04_BluefinTuna | Diperbaiki 2026-07-20 (normal 5,23%β0,26% wajah terbalik) | gejala "tekstur kosong" tidak bisa direproduksi di level file juga (teksturnya memang sudah dicat dengan benar) β kemungkinan sudah teratasi, belum dikonfirmasi di perangkat |
| Yellowfin Tuna | Fish07_YellowfinTuna | Diperbaiki 2026-07-20 (normal 12,19%β0,64%) | sebelumnya diduga rusak lewat jalur ekspor yang sama; normal dikonfirmasi+diperbaiki |
| Skipjack Tuna | Fish08_SkipjackTuna | Dibersihkan 2026-07-21 (CP47), dikonfirmasi solid secara visual β 3.181 wajah sampah/interior dihapus (11,4% dari mesh), edge non-manifold 2.923β798, diverifikasi bersih di 5 sudut | belum dikonfirmasi di perangkat β mohon dites ulang |
| Grouper | Fish09_Grouper | Dibersihkan 2026-07-21 (CP48), dikonfirmasi solid secara visual β 1.387 wajah sampah/interior dihapus (5% dari mesh), edge non-manifold 2.511β479, diverifikasi bersih di 5 sudut | belum dikonfirmasi di perangkat β mohon dites ulang |
| Giant Trevally | Fish05_GiantTrevally | Masih rusak, dikonfirmasi visual 2026-07-20 (CP46) β pembersihan sebagian sudah dilakukan (69 wajah sampah/interior dihapus) tapi screenshot viewport menunjukkan geometri yang jelas berduri/sobek di dekat kepala/insang/dorsal; dilewati, butuh bangun-ulang penuh | siluet berduri/hancur dekat kepala/dorsal β lebih mendekati bug pecah asli CP30 daripada isu normal/winding |
| Blue Marlin | Fish03_Marlin | Belum dites di babak ini, diduga OK | berbagi jalur ekspor material-tunggal yang sama dengan Mekong/Sailfish |
Clownfish/Blue Tang (Fish01/Fish02) sudah diketahui memang di luar cakupan aplikasi (tidak punya animasi Preview yang asli, tidak ada ekspor .usdz sama sekali) β di luar cakupan.
Catatan "belum dihapus dulu": per CP48, Skipjack dan Grouper sudah dibersihkan+dikonfirmasi solid di Blender tapi belum dikonfirmasi di perangkat; Giant Trevally dikonfirmasi masih benar-benar rusak. Hapus file ini hanya setelah tim aplikasi mengonfirmasi Skipjack/Grouper sudah terlihat benar di perangkat DAN Giant Trevally sudah menjalani bangun-ulang penuhnya β mana pun yang belakangan.
Detail diagnosis per gejala
- Orientasi (semua spesies yang bermasalah). Investigasi dari sisi aplikasi (mengekstrak
bindTransformsskeleton tiap.usdz, membandingkan joint bernama βDorsal_FinvsAnal_FinvsPectoral_Fin_L/_Rβ terhadap sumbu lokal mesh-nya sendiri) mengonfirmasi semantik sumbu lokal konsisten secara internal per spesies (contoh: Skipjack Tuna: X = kiri-kanan, dikonfirmasi karena Pectoral_Fin_L/R hanya berbeda di X; Y = panjang hidung-ke-ekor; Z = punggung-perut, Dorsal_Fin positif, Anal_Fin negatif). Yang tidak konsisten adalah bagaimana objek tiap spesies diorientasikan/di-parent di scene Blender relatif terhadap Mekong. Satu rumus rotasi post-hoc yang diterapkan seragam ke transformSkelRoothasil ekspor setiap spesies bermasalah (xformOp:rotateXYZ) sudah dicoba berkali-kali dan tidak pernah berhasil untuk lebih dari satu-dua spesies sekaligus β ini mengonfirmasi bahwa perbaikannya harus per-objek di Blender, bukan tambalan pasca-ekspor yang seragam.
Perbaikan: untuk setiap spesies bermasalah, bandingkan rotasi objek armature/mesh-nya saat ini di scene Blender terhadap milik Mekong, lalu orientasikan ulang (sesuaikan rotasi objek, atau terapkan rotasi supaya ter-bake ke data mesh/armature β mana pun yang cocok dengan setup Mekong sendiri) supaya semua spesies berbagi konvensi orientasi akhir yang sama seperti Mekong sebelum diekspor. - Bluefin Tuna: tekstur kosong. Dikonfirmasi bukan masalah material yang hilang β graph material file .usdz yang diekspor secara struktural lengkap (
Principled_BSDF+Material_baseColor.png/Material_normal.png/Material_metallicRoughness.pngyang asli, semuanya tidak kosong saat dibuka langsung). Tekstur base color memakai layout atlas UV bergaya "pulau pecah" (region kecil yang dicat dikelilingi latar belakang abu-abu besar yang tidak dicat β khas pipeline fotogrametri yang dipakai di seluruh ikan-ikan ini). Kemungkinan penyebab terbesar: koordinat UV mesh tidak persis mendarat di pulau-pulau yang dicat untuk sebagian besar permukaan, jadi wajah-wajah itu mengambil sampel dari latar abu-abu kosong.
Perbaikan: periksa layout UV Bluefin Tuna terhadap tekstur baked-nya; bandingkan dengan setup UV Mekong (yang tidak punya masalah ini) untuk menemukan perbedaan strukturalnya. Kemungkinan butuh koreksi UV unwrap dan/atau bake ulang tekstur dengan penempatan pulau yang benar, mengikuti proses yang sama yang menghasilkan hasil bersih Mekong. - Skipjack Tuna / Grouper: "hanya bagian dalam model yang terekspor." Pengecekan forensik sebelumnya pada Skipjack Tuna (cross-product antara arah normal geometris hasil winding-order tiap segitiga vs normal per-vertex yang tercatat, pada file
.usdasumber sebelum diperbaiki) menemukan 96,6% sudut wajah cocok arahnya dan hanya 0,9% yang tidak cocok β bukan mesh yang terbalik secara global, tapi memang ada subset wajah yang lebih kecil dengan normal yang tidak konsisten/terbalik, kemungkinan terkonsentrasi di satu permukaan yang menonjol secara visual β makanya terlihat seperti "melihat bagian dalam model" padahal sebagian besar mesh sebenarnya baik-baik saja.
Perbaikan: di Blender, pilih mesh, masuk Edit Mode, pilih semua, recalculate normal ke arah luar (bpy.ops.mesh.normals_make_consistent(inside=False), yaitu Shift+N) untuk Skipjack Tuna maupun Grouper. Ada baiknya juga dicek Yellowfin Tuna dan Giant Trevally untuk isu yang sama karena mereka berbagi jalur ekspor atlas multi-material yang sama. - Jalur ekspor "atlas" itu sendiri mungkin adalah akar masalah bersama. Skipjack Tuna, Grouper, Yellowfin Tuna, dan Giant Trevally semuanya memakai pola atlas UV multi-material (beberapa
GeomSubset, satu region tekstur per subset β nama material sepertiQ11870_1all_2_tex0/1/2). Jalur ekspor ini sama dengan yang menyebabkan "insiden CP38" yang sudah didokumentasikan sebelumnya (di CLAUDE.md repo ini sendiri) yang diam-diam menghapus seluruh shader saat ekspor .usdz untuk spesies-spesies persis ini (sudah diakali dari sisi aplikasi dengan membangun ulang graph shader dari tekstur embedded milik file .glb pasangannya β sudah diterapkan dan berjalan, jadi material/tekstur saat ini tidak hilang di aplikasi, hanya orientasi dan normal yang masih rusak). Mengingat jalur ini sudah menyebabkan dua cacat ekspor yang berbeda (shader yang hilang, sekarang dicurigai normal terbalik/kemungkinan isu UV), ada baiknya membandingkannya secara struktural dengan jalur ekspor material-tunggal Mekong yang lebih sederhana untuk menemukan satu perbaikan di level lebih atas (setting ekspor atau isu modifier/data) yang bisa mencegah kejadian ini terulang di keempat spesies berpola atlas, daripada memperbaikinya satu-satu.
Pengaturan Ekspor
(Dari AGENTS.md, sudah jadi konvensi yang terdokumentasi):
- glTF/GLB:
export_apply=True, export_animations=True, export_skins=True, export_animation_mode='ACTIVE_ACTIONS' - USDZ:
relative_paths=True, export_animation=True, convert_world_material=False
Ekspor ulang state Preview tiap spesies yang sudah diperbaiki sebagai .glb dan .usdz, menimpa file yang sudah ada di FishAssets/FishNN_Species/Preview/.
Aturan Kerja (sesuai CLAUDE.md/AGENTS.md repo ini)
- Baca CLAUDE.md dan FishAssets/AGENTS.md secara lengkap sebelum mulai.
- Tambahkan entri berstempel tanggal ke CHECKPOINT.md untuk pekerjaan ini β jangan pernah menghapus entri sebelumnya. Dokumentasikan persis apa yang berubah per spesies (penyesuaian orientasi, perbaikan UV/normal, ekspor ulang) dan alasannya.
- Jangan sentuh Sailfish atau apa pun di luar FishAssets/.
- Tugas ini terbatas hanya pada repo aset Blender β repo aplikasi CtSPoC (tempat fitur preview AR dan riwayat penambalan rotasi berada) di luar cakupan; seorang manusia akan men-deploy ulang hasil ekspor yang sudah diperbaiki ke sana secara terpisah dengan menjalankan ulang langkah penyalinan aset dari sisi aplikasi (lihat entri "AR Fish Preview" di CtSPoC/CHECKPOINT.md untuk proses itu β mendokumentasikan konvensi penyalinan byte-per-byte + verifikasi sha256 yang dipakai saat menarik
Preview/*.usdzke dalam aplikasi).
Setelah pekerjaan ini selesai
Setelah diekspor ulang, perbaikan di sisi aplikasi jadi sederhana: hapus seluruhnya tambalan xformOp:rotateXYZ post-hoc milik aplikasi (yang tadinya jadi akal-akalan untuk inkonsistensi sisi Blender yang diperbaiki tugas ini di akarnya) dan salin ulang file Preview/*.usdz yang sudah diperbaiki langsung dari repo ini ke CtSPoC/Rod/Rod/Assets/FishPreview/, diganti namanya supaya cocok dengan id masing-masing spesies (lihat tabel di entri "AR Fish Preview" milik CtSPoC/CHECKPOINT.md untuk pemetaan pasti <Species>_Preview.usdz β <id>.usdz). Tidak perlu ada lagi perhitungan rotasi di sisi aplikasi kalau semua spesies sekarang sudah cocok dengan konvensi orientasi Mekong.
Instruksi terakhir: hapus file ini setelah pekerjaannya selesai β ini catatan tugas satu-kali-pakai, bukan bagian dari kumpulan dokumentasi permanen repo.
Item terbuka / TODO / keterbatasan (dokumen ini pada dasarnya SEMUA berisi item terbuka)
- Giant Trevally (Fish05): dikonfirmasi masih benar-benar rusak per CP46 β geometri berduri/sobek dekat kepala/insang/dorsal, butuh bangun-ulang penuh weld-sebelum-decimate dari scan sumber mentah (seperti perbaikan CP30 aslinya), bukan tambalan topologi lokal lagi. Secara eksplisit dilewati dulu atas instruksi user.
- Skipjack Tuna (Fish08) dan Grouper (Fish09): sudah dibersihkan dan dikonfirmasi solid secara visual di Blender per CP47/CP48, tapi belum dikonfirmasi di perangkat di aplikasi β perlu dites ulang.
- Bluefin Tuna (Fish04): normal sudah diperbaiki, tapi keluhan awal "tekstur kosong" tidak bisa direproduksi di level file β kemungkinan sudah teratasi, tapi belum dikonfirmasi di perangkat; isu layout UV "pulau pecah" yang mendasarinya (region yang dicat dikelilingi latar abu-abu yang tidak dicat) belum benar-benar diperbaiki, baru diduga sebagai penyebabnya.
- Blue Marlin (Fish03): belum dites di babak ini, diduga OK (berbagi jalur ekspor material-tunggal yang lebih sederhana dengan Mekong/Sailfish) β belum diverifikasi.
- Pertanyaan struktural yang lebih luas masih terbuka: apakah jalur ekspor "atlas" multi-material bersama (dipakai Skipjack, Grouper, Yellowfin, Trevally) punya satu perbaikan di level lebih atas (setting ekspor atau isu modifier/data) versus butuh tambalan per-spesies β belum diselidiki.
- File ini sendiri adalah artefak yang akan dihapus: penghapusannya digantungkan pada (a) tim aplikasi mengonfirmasi Skipjack/Grouper sudah terlihat benar di perangkat, DAN (b) Giant Trevally sudah menjalani bangun-ulang penuhnya β mana pun yang belakangan. Per update terakhir file ini, belum ada satu pun kondisi yang terpenuhi, jadi file ini seharusnya masih ada di repo.
- Ketergantungan lintas-repo: perbaikan yang dibuat di sini harus disalin ulang secara manual (dengan verifikasi sha256) ke repo aplikasi CtSPoC yang terpisah oleh seorang manusia β otomatisasi repo ini sendiri tidak menjangkau repo itu.