holodepth

Three.js · Kamera

Optik göz ve dijital perspektif

3D dünyada kamera, sadece bir "bakış açısı" değil; uzaydaki veriyi topluca yakalayan ve onu iki boyutlu bir düzleme aktaran optik bir dönüştürücüdür. Dijital bir sahneyi anlamak için önce ışığın bir mercekten nasıl geçtiğini anlamak gerekir.

Fiziksel kameranın anatomisi

Gerçek dünyada kamera, sahneden gelen ışığı mercekten geçirip sensör (veya film) üzerinde toplayan bir optik sistemdir. Three.js'te bunun doğrudan bir camı yoktur; aşağıdaki üç kavram, dijital kamerayı okurken gerçek fotoğrafçılık dilini hatırlatır; matris ve frustum ayrıntıları bir sonraki bölümde kalır.

  • Mercek (lens): Işığın yönünü kırarak odak düzlemine yönlendirir. Daha kısa odak uzaklığı veya daha geniş mercek açısı, sahneyi daha geniş bir görüş alanı (FOV) ile kapsar; telefoto tersine daraltır. Mercek kalitesi kenar keskinliği ve renk sapmasını da etkiler — dijital tarafta bu kusurlar varsayılan olarak yoktur (aşağıdaki gerçek / sanal tabloda).
  • Netlik (focus): Net görüntü, ışığın sensör düzleminde tek bir noktada toplanmasıdır. Odak mesafesi dışında kalan nesneler sensörün önünde veya arkasında kesişir; bu da alan derinliği ve arka plandaki yumuşak "bulanıklık" (bokeh) hissini üretir. Sanal kamerada her şey varsayılan olarak keskin kalır; bulanıklık genelde sonradan eklenir.
  • Zoom (optik vs. dijital):
    • Optik zoom: Mercek veya lens grubunun fiziksel olarak kaymasıyla odak uzaklığı değişir; sensör aynı çözünürlükte daha fazla detay toplar — görüntü kalitesi korunur.
    • Dijital zoom: Kayıt çözünürlüğü değişmeden görüntünün ortası kırpılıp büyütülür; yakınlaşma sağlanır ama piksel başına bilgi azalır, tırtıklanma ve yumuşaklık kaybı görülür.

Three.js ve bilgisayar grafiğinde kamera

Kamera sahneyi değiştirmez; yalnızca hangi kısmın ekrana yansıtılacağını belirler.

Yazılım dünyasında bir kamera nesnesi, fiziksel bir "cam" içermez. Koordinatları ekrana taşımak için projection matrix (perspektif veya ortografik iz düşürme) ile birlikte view matrix kullanılır. View matrix, kameranın sahnedeki konumunu ve baktığı yönü temsil eder; projection + view birlikte, dünya uzayından clip uzayına giden dönüşümün çekirdeğini oluşturur; pratikte tam görüntüleme sisteminin bu iki parçasıdır. Uzaydaki noktaların iki boyutlu düzleme indirgenmesi genel olarak da projection (iz düşürme) diye anılır.

  • Sanal göz: Dijital kamera, dünya uzayındaki ( x, y, z) noktalarını alır ve ekrandaki ( x, y) piksel konumlarına indirger. Yukarıdaki view matrisi “kameranın nereden baktığını”, projection matrisi ise perspektif veya ortografik kuralları uygular; ikisi birlikte her vertex için “bu nokta ekranda nereye düşer?” sorusunu yanıtlar. renderer.render(scene, camera) çağrısında kullanılan tam bu dönüşümdür — sahne verisi değişmez, yalnızca bakış açısı ve iz düşürme kuralı uygulanır.
  • Three.js'te kamera da bir Object3D yapısıdır: PerspectiveCamera veya OrthographicCamera gibi türler, mesh ve ışıkla aynı transform arayüzünü paylaşır: position, rotation, scale, lookAt. İsterseniz kamerayı sahneye add edip parent–child hiyerarşisine alırsınız, isterseniz bağımsız tutup yalnızca render satırında verirsiniz — her iki kalıp da geçerlidir. Üst–alt ilişkisi ve dünya / yerel koordinat ayrımı için Object3D & sahne hiyerarşisi sayfasına bakın; FOV ve kırpma düzlemleri aşağıdaki teknik kavramlar bölümünde kalır.
  • Sensör yerine frustum: Gerçek sensör düzlemi yerine yazılımda frustum vardır: kameradan çıkan, near ve far düzlemleriyle sınırlı kesik bir piramit (veya kutu). Yalnızca bu hacmin içinde kalan geometri “görünür” kabul edilir; dışarıdaki mesh’ler çoğu gerçek zamanlı projede hiç çizilmez — buna frustum culling denir ve draw yükünü azaltır. Bu, yukarıdaki fiziksel mercek modelinden bağımsız, tamamen matematiksel bir görüş hacmidir.

Gerçek kamera vs. sanal kamera: farklar

Dijital kameralar kusursuzdur, ancak bu kusursuzluk bazen "yapay" görünmelerine neden olur:

Özellik Gerçek kamera Sanal (Three.js) kamera
Bozulma (distortion) Mercek kenarlarında doğal bükülmeler oluşur. Matematiksel olarak mükemmeldir; bozulma için ekstra shader gerekir.
Derinlik (depth of field) Arka plan kendiliğinden bulanıklaşır. Her yer jilet gibi nettir; bulanıklık (post-processing) ile eklenir.
Işık patlaması (lens flare) Işığın mercek içinde sekmesiyle oluşur. Bir yapay efekttir, elle eklenmelidir.
Odak uzaklığı Mercek değiştikçe fiziksel olarak değişir. Sadece FOV değerini değiştirmek yeterlidir.

Teknik kavramlar: zoom ve netlik

Aşağıdaki üç parametre çoğunlukla PerspectiveCamera kurulumunda verilir; projection matrisinin sayısal girdileridir. Optik zoom veya mercek değiştirmek gibi fiziksel bir işlem değildir; değerleri kodda güncellersiniz. Ayrıntılı API ve örnekler PerspectiveCamera sayfasında.

  • FOV (görüş alanı): Kameranın dikey (veya tanıma göre yatay) açı cinsinden ne kadar geniş bir konik “gördüğünü” ifade eder — derece cinsinden verilir (ör. 5075 aralığı sık kullanılır). FOV azaldıkça görüş daralır, nesneler ekranda büyür; bu, optik zoom olmadan elde edilen dijital yakınlaşma etkisidir (fiziksel anatomi bölümündeki dijital zoom ile aynı fikir, burada tek bir sayıyla yapılır). Çok geniş FOV “balık gözü”ne, çok dar FOV telefoto hissine yaklaşır; perspektif bozulma hissi değişir.
  • Aspect ratio (en–boy oranı): Çizim alanının genişlik / yükseklik oranıdır; projection matrisinin daireleri yuvarlak, kareleri kare tutması buna bağlıdır. Genelde window.innerWidth / window.innerHeight ile canvas boyutuna eşlenir; pencere yeniden boyutlandığında güncellenmezse görüntü basık veya uzar. Renderer setSize ile birlikte kameranın aspect’ini senkron tutmak standart pratiktir.
  • Near & far (kırpma düzlemleri): Gerçek dünyada uzak yıldızlar görülebilir; GPU’da ise derinlik tamponu sınırlı çözünürlükle çalışır — bu yüzden “şu mesafeden önce” (near) ve “şu mesafeden sonra” (far) düzlemleri tanımlanır. Frustum’un ön ve arka yüzleridir (frustum maddesine bakın). near çok küçükse derinlik hassasiyeti bozulur (titreme, z-fighting); far gereğinden büyükse yakın alandaki ayrım kötüleşir. Sahneye göre mümkün olan en dar aralığı seçmek iyi bir başlangıçtır.

Holodepth notu: Neden her şey net?

Gerçek hayatta gözümüz tek bir noktaya odaklanır. Three.js kamerasında varsayılan olarak her şey (yakın veya uzak) aynı netliktedir. Bu, bilgisayarın pikselleri çizerken derinlik farkı gözetmeksizin hepsini aynı netlik algoritmasıyla işlemesinden kaynaklanır. Eğer "sinematik" bir hava istiyorsan, depth of field (alan derinliği) efektlerini öğrenmen gerekecektir.