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.
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.
| 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ı | 2× 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 < far − 0.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:50–60° 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 sonracamera.updateProjectionMatrix()çağrılmazsa ekrana yansımaz. - Aspect (en–boy oranı): Görüntü alanının
genişlik / yükseklikoranıdır; dairelerin yuvarlak, insan figürlerinin orantılı kalması buna bağlıdır. Canvas penceresi yeniden boyutlandığındacamera.aspectgüncellenmezse küreler elips, zemin ızgarası dikdörtgen görünür tam ekran uygulamalardaresizeolayındarenderer.setSizeile birlikte aspect’i senkron tutmak standarttır. İlk kurulumda geçici olarak1verip ilkresize’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.1sık kullanılır; sahne birimlerinize göre ölçekleyin.neargereğinden küçük (ör.0.001) seçilirse derinlik tamponu hassasiyeti dağılır yüzeylerde titreme ve z-fighting artar. Çok büyüknearise 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).
Infinityteoride mümkün olsa da derinlik aralığı GPU’da sınırlı çözünürlükle paylaşılır;nearilefararası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 ise500–2000) genelde1e6veya sonsuzdan iyidir hem performans hem görsel tutarlılık için. Koridor demosunda uzak kesiti göstermek içinfarbilinç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.