Organ Information System
3D İnteraktif Organ Görselleştirme & Anatomi Rehberi
Tıp ve biyoloji alanında anatomi eğitimi genellikle 2D statik görseller üzerinden yürütülmektedir. Bu projede, tarayıcıda kurulum gerektirmeden çalışan, 60 FPS hızında akıcı ve etkileşimli bir 3D anatomi görselleştirme platformu geliştirmeyi hedefledim.

1. Problem, Bağlam & Öğrenme Hedefi
Tıp ve biyoloji alanında anatomi eğitimi genellikle 2D statik görseller üzerinden yürütülmektedir. Bu projede, tarayıcıda kurulum gerektirmeden çalışan, 60 FPS hızında akıcı ve etkileşimli bir 3D anatomi görselleştirme platformu geliştirmeyi hedefledim.
2. Teknik Kararlar & Trade-off'lar
Three.js yerine React Three Fiber (R3F) Tercihi
Neden Seçtim: Bileşen tabanlı deklaratif React yapısını Three.js ile birleştirmek, state yönetimi ve UI bileşenleriyle senkronizasyonu kolaylaştırdı.
Karşılaşılan Trade-off: Three.js doğrudan imperatif çağrılara kıyasla R3F ekstra bir soyutlama katmanı getirir; bu nedenle render loop performansına dikkat edilmesi gerekti.
Draco Compression ile Model Boyutu Optimizasyonu
Neden Seçtim: GLTF/GLB modellerinin boyutu 15MB seviyelerindeydi. Draco algoritmasıyla modeller sıkıştırılarak 3.5MB seviyesine indirildi.
Karşılaşılan Trade-off: İstemci tarafında ilk açılışta modelleri açmak (decompress) için küçük bir CPU maliyeti oluştu ancak network yükleme süresi %75 azaldı.
3. Karşılaşılan Gerçek Zorluk & Çözüm
Gerçek Zamanlı Animasyonda React State Kilitlenmesi ve Çözümü
Karşılaşılan Problem: Organ modeli döndürülürken veya ışık açısı güncellenirken her frame'de `useState` tetiklenmesi, tüm React DOM ağacının saniyede 60 kez re-render olmasına ve FPS'in 18-20 seviyelerine çakılmasına yol açıyordu.
Uygulanan Çözüm: React state yerine `useRef` ve R3F'in `useFrame` hook'u kullanılarak doğrudan GPU matrislerine ve Mesh referanslarına müdahale edildi. React DOM render döngüsü Three.js animasyon döngüsünden tamamen izole edildi ve 60 FPS akıcılık sağlandı.
// ❌ Kötü: Her frame'de useState tetiklemek
// useFrame(() => setRotation(r => r + 0.01))
// ✅ Çözüm: Doğrudan Mesh referansına müdahale
useFrame((state, delta) => {
if (meshRef.current) {
meshRef.current.rotation.y += delta * 0.5
}
})Mimari & Kullanılan Teknolojiler
- Next.js App Router ile statik sayfa kabuğu ve SSR
- Dynamic import (`ssr: false`) ile WebGL Canvas yüklemesi
- @react-three/drei ile OrbitControls, Environment ve Float yardımcıları
- Tailwind CSS ile responsive 3D kontrol paneli
Öğrenilenler & Sonuç
- WebGL sahnelerinde garbage collection ve memory leak önleme teknikleri
- Declarative 3D ile React ekosisteminin uyumu
- Lighthouse performans skorunu WebGL ile 90+ seviyesinde tutma