Derinlemesine Case Study & Teknik Breakdown

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.

Organ Information System

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.

🎯 Ana Öğrenme Hedefim: Three.js ve React Three Fiber (R3F) ile WebGL grafik boru hattını (graphics pipeline), kamera kontrollerini ve re-render optimizasyonunu derinlemesine öğrenmek.

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ı.

Çözüm Kod Parçacığı
// ❌ 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