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
Object3Dyapısıdır:PerspectiveCameraveyaOrthographicCameragibi türler, mesh ve ışıkla aynı transform arayüzünü paylaşır:position,rotation,scale,lookAt. İsterseniz kamerayı sahneyeaddedip parent–child hiyerarşisine alırsınız, isterseniz bağımsız tutup yalnızcarendersatı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,
nearvefardü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.
50–75aralığı 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.innerHeightile canvas boyutuna eşlenir; pencere yeniden boyutlandığında güncellenmezse görüntü basık veya uzar. RenderersetSizeile 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);fargereğ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.