holodepth

Three.js · Kamera türleri

PerspectiveCamera (perspektif kamera) gerçek dünya görüşünü simüle etmek

Gerçek dünyada göz veya fotoğraf makinesi, uzaklaşan nesneleri daha küçük gösterir; paralel çizgiler uzakta bir noktada birleşir gibi görünür. Bu perspektif hissi, 3B sahnenin “içinde durma” deneyiminin temelidir; mimari gezinti, oyun ve sinematik kamera için beklenen görünüm budur.

Three.js'te bunu varsayılan olarak üreten sınıf PerspectiveCamera'dır: dünya uzayındaki noktaları perspektif kurallarıyla ekrana indirger. Oyun ve ürün vizualizasyonunun büyük çoğunluğu bu türle çalışır; teknik karşılığı OrthographicCamera'dır (ölçek sabit, CAD / 2.5D hissi); OrthographicCamera sayfasında.

Bu sayfa PerspectiveCamera'a özeldir: iz düşüm mantığı, frustum diyagramı, fov / aspect / near / far, playground ve resize. Genel kamera dili (view / projection, Object3D, frustum culling) için Kamera giriş sayfasına dönün; FOV ve kırpma düzlemlerinin kavramsal özeti oradaki teknik kavramlar bölümündedir.

Perspektif İzdüşümün Mantığı (Perspective Projection)

Perspektif izdüşüm, insan gözünün ve fiziksel kameraların dünyayı algılama biçimini matematiksel olarak simüle eder. Bu modelde, kameradan çıkan tüm görüş doğrultuları (rays) tek bir odak noktasında birleşir; dolayısıyla paralel uzanan çizgiler (örneğin uzun bir koridorun duvarları) uzaktaki sonsuz bir kaçış noktasına (vanishing point) doğru birbirine yaklaşır.

Bu sistemin en belirgin özelliği mesafe tabanlı ölçeklemedir: Aynı gerçek boyuta sahip iki nesneden, kameraya yakın olan ekranda devasa görünürken, uzak olan nesne orantısal olarak küçülür. Three.js, bu doğal derinlik ve hacim algısını PerspectiveCamera sınıfı ile uygular. Boyutun mesafeden bağımsız olduğu (nesne ne kadar uzak olursa olsun boyutunun aynı kaldığı) OrthographicCamera (ortografik) izdüşümünden ayrıldığı temel nokta tam olarak budur.

Kullanım Senaryoları:
Derinlik, hacim ve mesafe hissinin kritik olduğu tüm "dünyanın içindeymiş" deneyimlerinde mimari gezintiler, birinci şahıs oyunlar veya sinematik kamera hareketleri perspektif kamera varsayılan ve en doğru tercihtir. Buna karşın, ölçeğin korunması gereken (boyutların ekrana yansırken asla bozulmadığı) teknik çizimler, 2D oyun haritaları veya sadece kullanıcı arayüzü (HUD) öğelerini hizalamak gibi "matematiksel netlik" gerektiren işlerde genellikle ortografik izdüşüm tercih edilir.

Yukarıdaki şema, bu mantığın görüş hacmi (frustum) üzerindeki izdüşümünü özetlemektedir: Kameranın durduğu nokta, lensin genişliği (FOV) ve kırpma düzlemleri (near/far). Bir sonraki bölümde bu teknik parametrelerin canlı önizlemesini ve sahnede yarattıkları matematiksel farkları inceleyeceğiz.

Perspektif · kırpma hacmi

Viewing frustum; perspective clip volume

Görüş frustum’u (kesik piramit): kamera orijinde; near ve far düzlemleri arasındaki hacim, rasterleştirmede asıl "görünür" bölgendir. Three.js PerspectiveCamera ile uyumlu eksenler: Y yukarı, +X sağa, bakış doğrultusu −Z.

Çizim ölçekleri yalnızca anlatım içindir; gerçek near / far değerlerini sahne ölçeğine göre seçersiniz. Üstteki şemada dönüşü duraklatabilir, hız ve yakınlaştırmayı kaydırıcılarla veya fare tekerleği ile oynayabilirsiniz; FOV ile yakın/uzak düzlemler canlı güncellenir. Yakın / uzak dörtgeninin üzerine gelince vurgu artar; Oyun · Mimari · Sinematik ön ayarları tipik FOV aralıklarını dener; Görünümü sıfırla sayfa değerlerine döner. Şemada dikey FOV yayı ve sağ sütunda FOV (°) ile Kamera etiketi sürekli görünür; fare üzerine gelince veya canvas’a odaklanınca yakın/uzak düzlem ve görüş doğrultusu etiketleri sağ sütunda açılır (İngilizce alt satırlarla).

Terimler

  • Kamera (Eye / View Space Origin): Tüm bakış açısının merkezlendiği 3D uzaydaki orijin noktasıdır. Sahnedeki tüm diğer koordinatlar, bu noktanın referans alınmasıyla hesaplanır.
  • Yakın Düzlem (Near Plane): Kameraya en yakın kırpma sınırıdır. Bu düzlemin önünde kalan (kameranın içinden geçen) objeler sahneden elenir; aksi takdirde kameranın "içine giren" nesnelerin parçalanmış ve rahatsız edici görüntüleri oluşurdu.
  • Uzak Düzlem (Far Plane): Kameranın "görebileceği" en uzak sınırdır. Bu düzlemin arkasında kalan yıldızlar, ufuk çizgileri veya dağlar, grafik motorunun işlem yükünü (ve derinlik tamponu kapasitesini) korumak adına kırpılır ve çizilmez.
  • Görüş Doğrultusu (Line of Sight / -Z): Three.js koordinat sisteminde kamera, varsayılan olarak yerel -Z eksenine doğru bakar. Bu, dijital kameranın dünyaya hangi yöne "odaklandığını" belirleyen temel eksendir.

Perspective Effect Playground

Bu WebGL önizlemesi kameranın görüşünü gösterir; sahne ve kamera konumu sabittir; oynanan tek şey PerspectiveCamera’nın FOV, near ve far değerleri. Uzun koridor, zeminde paralel ızgara çizgileri ve yinelenen sütunlar: FOV yükseldikçe yan duvarlar ve ızgara hızlı “içeri kapanır” (geniş açı); düşürdükçe sahne daha düzleşmiş (telefoto) görünür. Near’ı büyütünce yakın kırpma belirginleşir; far’ı küçültünce uzak uçlar kesilir; z-fighting riski için near’ı aşırı küçültme. Aşağıdaki senaryo kartları aynı FOV fikrini üstteki şemadaki Oyun · Mimari · Sinematik örnekleriyle bağlar; kart seçince hem açı hem neden birlikte gelir.

Perspective Effect Playground · koridor · WebGL

Kart bir senaryo seçer (FOV + neden); FOV sürgüsünü elle oynatırsan seçim özel moda döner (yeniden kart seçene kadar).

Kamera konumu sabit; yalnızca projeksiyon parametreleri güncellenir. Zemindeki GridHelper çizgileri perspektifte tek bir uzak noktada toplanıyor gibi görünür; FOV ile bu “kapanma” hızını karşılaştır. Ortadaki vurgulu küp ve yan sütunlar aynı ölçekte kalır; near / far ile hangi derinlik bandının rasterleştirildiğini hisset. Üstteki 2D frustum şeması ile aynı kavramları burada 3B uzayda deniyorsun. Koridor + ızgara: paralel çizgiler, derinlik ve distorsiyonu tek bakışta kıyaslamak için uygun bir “laboratuvar” zemini.


Üstteki Perspective Effect Playground (diagram-perspective-playground.js, data-material-demo="perspective-playground") ile aynı sayıları ön harita tabloda topladık. Sürgüler ve senaryo kartlarıyla değişenler HUD satırında; kalan satırlar dosyadaki sahne sabitleridir. Tür sütunu: ekrandaki kontroller ile kaynak koddaki sabitleri ayırır.

Bu demo’da kontrol edilenler

  • FOV (°) → dikey bakış açısı; sürgü veya senaryo kartı
  • Near → yakın kırpma düzlemi
  • Far → uzak kırpma düzlemi
  • Senaryo kartları → Oyun (80°) · Mimari (50°) · Sinematik (35°); FOV sürgüsünü elle oynatınca Custom çipine döner

Bunlar neyi etkiliyor? FOV, near ve far birlikte perspektif frustumunu; yani kameranın gördüğü kesik piramit hacmini; belirler. Rasterleştiricide ekrana düşen her şey, önce bu hacim içinde "görünür mü?" sorusuna göre hesaplanır; sürgü oynayınca değişen şey doğrudan bu hacimdir.

Kısa mental model: Near büyüdükçe kameraya çok yakın nesneler ve zemin kesilir (önünüz boşalıyormuş gibi). Far küçüldükçe uzaktaki koridor ucu ve sütunlar yok olur (sis + kırpma). İkisini birlikte düşünün: görünür dünya bandı daralıyor.

diagram-perspective-playground.js Sayfa Demosu Sabitleri (perspective-camera.html playground)
Sahne / rol Parametre Değer Tür
Ortak · renderer Ton / gölge / temiz renk ACESFilmicToneMapping, exposure 1.05 · PCFSoftShadowMap · setClearColor(0x070b14) 🔒 Sabit
Renk uzayı / piksel oranı SRGBColorSpace (destekleniyorsa) · min(devicePixelRatio, 2) 🔒 Sabit
antialias / alpha true / false 🔒 Sabit
Ortak · sahne background + sis 0x070b14 · Fog(0x070b14, 14, 68) 🔒 Sabit
Işıklar + gölge AmbientLight 0x8aa0c0, yoğunluk 0.04 🔒 Sabit
HemisphereLight Gökyüzü 0x8aa8d0 · zemin 0x0a0e16 · yoğunluk 0.16 🔒 Sabit
DirectionalLight (güneş) 0xfff2ea · 1.22; konum (−4.5, 14, 10) · gölge haritası 1024², bias −0.00015, normalBias 0.02; gölge ortho ±26, near 1, far 72 🔒 Sabit
Zemin PlaneGeometry / materyal 16×96, renk 0x141a24, roughness 0.88, metalness 0.04; konum (0, 0, −30), gölge alır 🔒 Sabit
Izgara GridHelper Boy 88, bölüm 44, renkler 0x3d5570 / 0x1a2434; konum (0, 0.018, −30), opacity 0.55 🔒 Sabit
Koridor duvarları BoxGeometry 0.1×3.2×78; x = ±3.45, y = 1.6, z = −30 🔒 Sabit
Sütunlar 22 çift kutu Başlangıç z0 = 2.2, adım zStep = 2.85; taban 0.26², yükseklik 2.75 + (i%4)×0.12, x = ±2.38 🔒 Sabit
Odak küpü MeshStandardMaterial + kutu Renk 0xffd4a8, emissive 0x5c3010 yoğunluk 0.32; boy 0.95×1.65×0.95, merkez yaklaşık (0, 0.825, −14) 🔒 Sabit
Sahne kamerası PerspectiveCamera ctor Başlangıç FOV 55, aspect 1 (ilk kare; sonra viewport), near 0.1, far 75 🔒 Sabit
Poz / bakış position (0, 1.58, 5.4) · lookAt(0, 1.42, −36)OrbitControls yok 🔒 Sabit
Kod · clamp syncCameraFromDom FOV 18…110 · near 0.02…4 · far 12…140; near < far0.05 🔒 Sabit (kod)
Senaryo → FOV FOV_BY_SCENARIO game: 80 · arch: 50 · cinematic: 35 🔒 Sabit (kod)
HUD · aralıklar (perspective-camera.html) Range input FOV 22…105 · near 0.02…2.2 · far 14…125 🔒 Sabit (HTML)
HUD başlangıç FOV / near / far 55 / 0.1 / 75 🔄 Dinamik (HUD)
HUD FOV, near, far, senaryo kartları Kullanıcı seçimi; readout + insight + mod çipi güncellenir 🔄 Dinamik (HUD)

Kurulum parametreleri: dört silahşör

Bir PerspectiveCamera örneği oluştururken verdiğiniz dört değer, kameranın görüş hacmini (frustum) matematiksel olarak tanımlar (şema). Aynı parametreleri 3B uzayda denemek için Perspective Effect Playground’a bakın.

Üstteki koridor demosunda bu dört değişkenin etkisini teoriye dokmadan görürsünüz: FOV arttıkça yan duvarlar ve ızgara hızla içeri kapanır (geniş açı hissi); near büyüdükçe kameraya çok yakın yüzeyler kesilir; far küçüldükçe koridorun sonu ve uzak sütunlar görünmez hale gelir. Aspect bu demoda viewport en/boy oranına kilitlenir; pencereyi genişletince sahne basık veya uzun kalmaz.

  • FOV (field of view): Three.js'te varsayılan olarak dikey bakış açısıdır (derece). Açı büyüdükçe daha geniş bir koni görürsünüz sahne “yakınlaşmış” gibi hissedilir; bu, kamerayı fiziksel olarak kaydırmadan elde edilen dijital zoom etkisidir. Pratik aralık çoğu projede 45°–75° civarıdır: 5060° nötr, 70°+ geniş açı (kenarlarda belirgin distorsiyon, balık gözü), 35°–45° telefoto / sinematik sıkışıklık. Değeri kodda veya playground sürgüsünde değiştirdikten sonra camera.updateProjectionMatrix() çağrılmazsa ekrana yansımaz.
  • Aspect (en–boy oranı): Görüntü alanının genişlik / yükseklik oranıdır; dairelerin yuvarlak, insan figürlerinin orantılı kalması buna bağlıdır. Canvas penceresi yeniden boyutlandığında camera.aspect güncellenmezse küreler elips, zemin ızgarası dikdörtgen görünür tam ekran uygulamalarda resize olayında renderer.setSize ile birlikte aspect’i senkron tutmak standarttır. İlk kurulumda geçici olarak 1 verip ilk resize’ta gerçek oranı yazmak yaygın bir kalıptır (aşağıdaki örnek kodda da böyledir).
  • Near (yakın kırpma): Kameranın görmeye başladığı en yakın düzlem; frustum piramidinin ön yüzüdür. Bu düzlemden daha yakındaki geometri çizilmez (kamera içinde kalmış gibi kesilir). Başlangıç için 0.1 sık kullanılır; sahne birimlerinize göre ölçekleyin. near gereğinden küçük (ör. 0.001) seçilirse derinlik tamponu hassasiyeti dağılır yüzeylerde titreme ve z-fighting artar. Çok büyük near ise kameraya yakın duvar veya zemin aniden kaybolur; playground’da near sürgüsü bunu gösterir.
  • Far (uzak kırpma): Görüşün kesildiği uzak düzlem; frustum’un arka yüzü. Bu mesafeden ötesi çizilmez (gökyüzü kutusu veya sis ile gizlenir). Infinity teoride mümkün olsa da derinlik aralığı GPU’da sınırlı çözünürlükle paylaşılır; near ile far arasındaki fark ne kadar genişse, yakın derinlikteki ayrım o kadar kötüleşir. Sahne boyutuna uygun üst sınır (ör. birimler metre ise 5002000) genelde 1e6 veya sonsuzdan iyidir hem performans hem görsel tutarlılık için. Koridor demosunda uzak kesiti göstermek için far bilinçli olarak sıkı tutulmuştur; üretim sahnenizde genelde daha geniş seçersiniz.

Aşağıdaki kurucu satırı, bölüm 1’deki Perspective Effect Playground başlangıcıyla (diagram-perspective-playground.js ve üstteki tablo) hizalıdır. Genel örneklerde far sıkça daha büyük seçilir; koridor demosunda uzak uç kesilmesini görmek için 75 civarı bilinçli sıkı tutulmuştur.

// diagram-perspective-playground.js  başlangıç (aspect ilk resize’ta viewport’tan yazılır)
const camera = new THREE.PerspectiveCamera(
  55, // FOV (°)  HTML sürgü başlangıcı; kod içi clamp 18…110
  1, // aspect  ilk ctor; resize() ile w / h güncellenir
  0.1, // near  başlangıç; clamp 0.02…4
  75 // far  başlangıç; clamp 12…140
);
// syncCameraFromDom: .fov / .near / .far yazıldıktan sonra mutlaka:
// camera.updateProjectionMatrix();  yoksa yeni clip / açı ekrana yansımaz

Ne zaman kullanılır, ne zaman değil?

Ne zaman kullanılır? Kısaca: izleyici sahneyin içinde veya gerçek bir kamera kadrajıyla bakıyorsa; ölçülerin ekranda “yakınlaşıp uzaklaşması” isteniyorsa; PerspectiveCamera doğru varsayılandır.

  • Oyunlar ve etkileşimli 3D: Birinci veya üçüncü şahıs gezinti, araç simülasyonu ve VR gibi deneyimlerde kullanıcı, dünyayı gerçekçi bir perspektif algısıyla deneyimler. Koridor derinliği, kapı aralıkları ve nesnelerin birbirine olan uzaklıkları ancak bu izdüşüm sayesinde sezgisel olarak anlaşılabilir. Kamera hareketi ve FOV değerleri ile oyuncuya "gerilim" veya "geniş açı" gibi mekansal hisler aktarılabilir; bu teknik parametrelerin detayları, önceki frustum ve kurulum bölümlerinde açıklanmıştır.
  • 3D Sahne, Ürün ve Mimari: Konfigüratörler, mobilya tasarım araçları, iç mekan turları veya dış cephe gezintileri gibi projelerdir. Kullanıcının bir mekânın derinliğini ve nesnelerin ölçek hissini doğru kavraması, ikna edici bir deneyim için kritiktir. Statik bir görsel yerine kullanıcıya "gezilebilir bir sahne" sunmak istiyorsanız, perspektif kamera en doğal ve güvenilir tercihtir.
  • Gerçekçi Derinlik ve Perspektif Algısı: Ön plan ile arka planı birbirinden ayırmak, kaçış çizgileriyle yönlendirme yapmak veya "büyük bir salon" hissi yaratmak gibi sinematik veya dramatik kareler için perspektif kamera vazgeçilmezdir. Eğer sahnenizin "kartpostal gibi" düz, ölçekleri her noktada birebir aynı ve hatasız kalması gerekiyorsa, bu durumda "kullanılmaz" listesindeki ortografik kamera tercihlerini incelemeniz önerilir.

Hızlı karşılaştırma: PerspectiveCamera uzaklaştıkça küçülen, yaklaştıkça büyüyen çizgilerle gerçek dünyaya benzer bir görünüm verir. OrthographicCamera ise paralel izdüşümle ölçü ve oranların daha "düz" ve okunaklı kalmasını sağlar; derinlik hâlâ vardır ama perspektif distorsiyonu yoktur.

Ne zaman kullanılmaz? Dünya sahnesi için perspektif doğru olsa bile, ekran uzayında sabit ölçek veya paralel çizgilerin bozulmaması şart ise tek bir PerspectiveCamera ile her şeyi çözmeye çalışmayın; ayrı kamera katmanı veya farklı kamera türü gerekir.

  • UI / HUD ve Overlay Bileşenleri: Can barı, minimap, menü öğeleri veya imleç gibi arayüz elemanları, kameranın hareketinden bağımsız olarak her zaman sabit boyutta ve piksel hassasiyetinde görünmelidir. Perspektif kamerasıyla çizilen bir düzlem, kameraya yaklaştıkça büyür veya uzaklaştıkça küçülür; bu da arayüzün tutarsız görünmesine yol açar. Bu nedenle HUD veya arayüz tasarımları, projelerin çoğunda CSS/HTML katmanlarında ya da ikinci bir OrthographicCamera (Ortografik Kamera) kullanılarak render edilir. Böylece oyun dünyası perspektif derinliğini korurken, arayüz tamamen ekranın sabit koordinat düzlemine kilitlenmiş olur.
  • Teknik Çizim, CAD ve İzometrik Düzlem: Ölçü çizgileri, yapısal kesitler, kat planları, fabrika yerleşim şemaları veya strateji oyunlarındaki harita görünümleri gibi uygulamalarda, paralel kenarların korunması ve mesafe ölçümlerinin hatasız okunabilmesi şarttır. Perspektif izdüşümde uzak köşeler daralarak küçülür ve duvarlar eğimli görünür; bu optik yanılsama ölçülerin doğruluğunu bozar. Bu tür teknik gereksinimlerde, mesafeden bağımsız olarak paralel çizgileri koruyan ortografik (veya izometrik) izdüşüm tercih edilir. Detaylı teknikler için Ortografik Kamera sayfasını inceleyebilirsiniz.

Özet: yukarıdaki iki grupta amaç distorsiyonsuz, ölçülü veya ekrana kilitli görünümdür. Kamera türleri ve frustum bağlamı için Kamera Giriş sayfasına dönebilirsiniz.

Dinamik yönetim: updateProjectionMatrix

Gerçek bir web projesinde kamera statik değildir. Pencere yeniden boyutlandığında aspect güncellenmelidir; yalnızca özelliği değiştirmek yetmez; camera.updateProjectionMatrix() ile projeksiyon matrisi yeniden hesaplanmalıdır. Aynı çağrı, kodla .fov / .near / .far değiştirdiğinizde de zorunludur; atlanırsa kamera özellikleri güncellenmiş olsa bile görüntü eski projeksiyonda kalır. Çıktı boyutunu güncellemek için Renderer tarafında da setSize çağrısı gerekir. Tam sayfa yerine bir konteyner içinde canvas kullanıyorsanız (ör. bölüm 1 playground), ResizeObserver ile o konteynerin boyutunu izlemek yaygın bir kalıptır.

// diagram-perspective-playground.js  ResizeObserver + viewport (tam pencere değil)
function resize() {
  const w = viewportEl.clientWidth || 640;
  const h = viewportEl.clientHeight || 360;
  renderer.setSize(w, h, false);
  camera.aspect = w / Math.max(h, 1);
  camera.updateProjectionMatrix();
  // FOV, near, far veya aspect değişince zorunlu  yoksa projeksiyon / görüntü güncellenmez
}

const ro = new ResizeObserver(() => {
  resize();
  syncCameraFromDom(); // FOV/near/far sürgüleriyle projeksiyonu tazele
});
ro.observe(viewportEl);

Teknik Tablo: Perspektif Kamera Özellikleri

Özellik / Metot Kavramsal Açıklama Kullanım İpucu / Tipik Değer
.fov Görüş alanı (Field of View); dikey açı derecesi. Doğal insan görüşü için 50–75 derece aralığı idealdir.
.zoom Görüşü yazılımsal olarak yakınlaştıran çarpan katsayısı. Varsayılan 1; artırıldığında perspektif bozulmadan yakınlaşma sağlar.
.focus Stereoskopik (VR) veya alan derinliği efektleri için odak mesafesi. Örn: 10 birim; kameranın neye "odaklandığını" belirtir.
.filmGauge Fiziksel film şeridi genişliğini (mm) simüle eden parametre. Örn: 35 (standart sinematik film genişliği simülasyonu).
setViewOffset() Frustum'u kaydırarak asimetrik görünüm oluşturma metodu. Çoklu monitör veya dev ekran duvarları (video wall) için kullanılır.

FOV: senaryoya göre pratik aralıklar

Görsel Senaryo ve Deneyim Önerilen FOV (Derece)
FPS ve Hızlı Aksiyon: Dinamik hareket hissi ve geniş çevresel görüş gerektiren oyun mekanikleri. 75 – 90°
Mimari ve Ürün Vitrini: Mekânın ölçeğini doğru yansıtan, yormayan ve doğal görünen standart vitrin açısı. 45 – 60°
Sinematik ve Tele-Objektif: Detay odaklı, perspektifi yassılaştıran ve dramatik derinlik sağlayan odaklanmış kareler. 35 – 50°

Uygulama: İdeal Kamera Pozisyonlama ve Kontrol

Three.js kamerasını bir Object3D olarak düşünmelisiniz. Sahneye ilk eklendiğinde varsayılan olarak (0, 0, 0) koordinatında, yani tam merkezde oluşur. İçerideki objeleri görüntülemek için kamerayı genellikle sahnenin dışına doğru "geri çekmeniz" ve hedefe kilitlenmesini sağlamanız gerekir.

Aşağıdaki yapı, bölüm 1'de yer alan Perspective Effect Playground örneğindeki kamera kurulumunun birebir aynısını içerir. Bu spesifik örnekte kamera sabittir ve herhangi bir fare etkileşimi (OrbitControls) içermez.

// Koridor demosu için kamera kurulumu (sabit konum)
const camera = new THREE.PerspectiveCamera(55, 1, 0.1, 75);

// Kamerayı sahnenin dışına yerleştir ve koridorun içine doğru kilitlen
camera.position.set(0, 1.58, 5.4);
camera.lookAt(0, 1.42, -36);

// resize() olayında aspect oranı pencere boyutuna göre güncellenmelidir

Kullanıcının kamerayı fareyle döndürmesi veya yakınlaşıp uzaklaşması gereken etkileşimli sahnelerde OrbitControls standardı kullanılır. Bu eklenti, kamera ve renderer nesneleri oluşturulduktan sonra onlara bağlanır; ancak en önemli nokta, animasyon döngüsünün her karesinde güncellenmesidir.

import { OrbitControls } from 'three/addons/controls/OrbitControls.js';

// Kamera kontrolcüsünü bağla
const controls = new OrbitControls(camera, renderer.domElement);

function animate() {
  requestAnimationFrame(animate);
  // Kontrollerdeki güncellemeleri (dönüş/zoom) her karede uygula
  controls.update();
  renderer.render(scene, camera);
}

Holodepth Uzman Notu: Z-Fighting (Derinlik Titremesi)

Kameranın near değerini aşırı küçük (ör. 0.00001), far değerini ise aşırı büyük (ör. 999999) ayarlamak derinlik tamponunun (Z-buffer) hassasiyetini öldürür. Bu durum, üst üste binen yüzeylerin birbirine girip titremesiyle sonuçlanan Z-fighting sorununa yol açar.

Altın Kural: far / near oranını mümkün olduğunca küçük tutun. Örneğin 1000 / 0.1 = 10,000 oranı çoğu web projesi için güvenli bir sınırdır. Bu oranın çok üzerine çıkmadan önce sahnenizin ölçeğini daha makul sınırlara çekip çekemeyeceğinizi sorgulayın.