Vector Mantığı
Vektörler; konum, yön, hız ve kuvvet gibi kavramları aynı matematik altında birleştirir.
3D web’de "bir şeyin nereye baktığı" veya "ne kadar hızlı gittiği" çoğu zaman Vector3
ile ifade edilir.
Bu sayfada konum–yön ayrımını, normalize sezgisini, toplama/çıkarma ile hareket
mantığını ve dot product ile açı/aydınlatma ilişkisini kısa ama sağlam bir çekirdeğe
oturtacaksın.
Vektör Nedir? Konum vs. Yön
3D programlamada vektörler sadece "bir noktayı işaretlemek" için kullanılmaz.
Bir merminin gidiş yönü, bir karakterin hızı, bir yüzeyin ışığa bakışı; hepsi vektörlerle ifade edilir.
Bu yüzden Three.js tarafında Vector3 sınıfı, en sık elinin gideceği araçlardan biridir.
Bir vektörü doğru okumak için iki farklı gözlük tak: bazen vektör bir konum (adres), bazen bir yön taşır.
Bu ikisini ayırdığında 3D düşünce çok hızlanır.
Buradaki incelik şudur: aynı \((x,y,z)\) sayıları hem bir "nokta" hem de bir "ok" gibi görünebilir. Farkı belirleyen şey, bu vektörü
hangi referansa göre okuduğundur. Konum "orijine göre nerede?", yön ise hangi tarafa ne kadar?" sorusunu cevaplar.
Displacement sezgisi: İki konum arasındaki fark \((B - A)\), artık bir konum değil; yer değiştirme vektörüdür.
Yani konumdan yön üretmenin en temiz yolu çıkarma işlemidir. Bu sezgi, takip ( seek ), bakış yönü ( look-at ) ve ray hesaplarının temelidir.
Konum (Position) Olarak VektörKonum olarak vektör, orijinden \((0,0,0)\) başlayıp bir noktada biten bir ok gibidir: uzaydaki bir adresi temsil eder.
"Bu obje nerede?" sorusunun cevabı çoğu zaman bir konum vektörüdür.
Three.js’te bu genelde mesh.position üzerinden görünür: position, sahnedeki dönüşüm zincirinde bir "yer" bilgisidir.
Bu yüzden position değerini değiştirmek, objeyi taşır; ama tek başına "yön" üretmez.
Yön / Hız (Direction / Velocity) Olarak VektörYön vektörü ise "nerede olduğun"dan bağımsızdır: sadece nereye ve ne kadar güçlü gittiğini anlatır.
Bu yüzden hız, ivme veya kamera bakışı gibi kavramlar vektörlerle temsil edilir.
Burada yapılan en yaygın hata şudur: bir yön vektörünü "konum gibi" kullanmak.
Örneğin: Normalize edilmiş bir yönü doğrudan position’a atarsan, objeyi hedefe götürmez; onu sadece orijine yakın bir noktaya "zıplatırsın".
Doğru model çoğu zaman position += direction * speed gibi bir birikimli harekettir.
Mini sezgi: Konum vektörü "yer" taşır; yön vektörü "değişim" taşır.
Bu ayrım; hareket, takip ve raycaster gibi sistemlerde kafa karışıklığını azaltır.
Pratik bağ: Bu sayfadaki ayrım, Koordinat Sistemleri içindeki local/world mantığıyla birleşir: yön vektörü çoğu zaman bir uzayda tanımlanır; ama davranış world uzayında sonuç üretir.
"Yanlış yöne gidiyor" hatalarının önemli bir kısmı, uzayların karışmasından doğar.
Boy ve Normalizasyon Magnitude
Bir vektörün boyu (magnitude), onun "şiddetini" anlatır.
Hız vektörünün boyu hızın büyüklüğü; kuvvet vektörünün boyu uygulanan itki gibi okunabilir.
Bu yüzden magnitude, 3D’de "kontrol düğmesi" gibi çalışır: yön sabitken boyu artırırsan daha hızlı gidersin; boyu düşürürsen daha yumuşak hareket edersin.
Aynı fikir, kamera hareketi, takip davranışı ve fizik benzeri itki senaryolarında tekrar tekrar karşına çıkar.
Ama çoğu zaman sadece yön gerekir. İşte bu noktada birim vektör kavramı girer: boyu tam 1 olan vektör.
En sık hata: Bir hedefe doğru hareket ettirirken \((hedef - konum)\) vektörünü normalize etmeden kullanmak.
Mesafe büyükken vektörün boyu büyür ve obje "uzakken hızlı, yaklaşınca yavaş" davranır.
Sabit hız istiyorsan önce yönü normalize edip sonra hız katsayısı ile çarparsın.
Normalizasyon = Yönü Koru, Boyu 1 YapNormalizasyon, bir vektörün yönünü değiştirmeden boyunu 1’e indirir.
Böylece "sadece yön" bilgisini elde edersin ve büyüklüğü ayrı bir parametre olarak kontrol edebilirsin ( hız = yön × hız_sayısı ).
Three.js’te bu pratikte şöyle okunur: v.length() boyu verir, v.normalize() ise vektörü birim vektöre çevirir.
Sonrasında istediğin şiddeti multiplyScalar() ile geri eklersin , böylece yön ve hız/kuvvet kontrolünü birbirinden ayırmış olursun.
Neden önemli? Işık hesaplamalarında, kamera yönünde, yüzey normallerinde; "ne kadar uzun?" değil "nereye bakıyor?" kritiktir.
Bu yüzden dot product gibi işlemlerde normalize edilmiş vektörlerle çalışmak daha doğru sonuç verir.
Dot product notu: Eğer vektörler normalize değilse dot sonucu sadece "açı"yı değil, iki vektörün boylarını da içine katar.
Yani 1/0/-1 gibi sezgisel sınırlar bozulur yani açı sezgisi istiyorsan önce normalize et.
Mini uyarı: Sıfır uzunluklu vektör normalize edilemez.
Bu durum çoğu zaman "iki nokta aynı" gibi bir edge-case’ten gelir.
Bu edge-case pratikte "hedef konum = mevcut konum" gibi bir durumdur.
Böyle anlarda normalize yerine önce boy kontrolü yapıp (length \(\approx 0\)), hareketi durdurmak veya varsayılan bir yön seçmek daha güvenlidir.
Temel Operasyonlar Toplama ve Çıkarma
Toplama \((A + B)\) çoğu zaman "hareket" demektir: bir konuma hız vektörü eklersen yeni konumu bulursun , bu, update döngüsünün en temel ritmidir.
Bu ritmi "kare bağımlı" değil "zaman bağımlı" kurmak istersen, hız vektörünü deltaTime ile çarparsın: \(\text{pos} \leftarrow \text{pos} + \text{vel} \cdot dt\).
Böylece FPS değişse bile hareket daha tutarlı kalır; 3D web’de akıcılık ve kontrol hissi için bu küçük ayrım kritiktir.
Çıkarma \((B - A)\) ise en "sihirli" işlemlerden biridir: \(A\)’dan \(B\)’ye bakan bir yön vektörü üretir.
Bu sayede bir kamerayı hedefe baktırmak, bir düşmanı oyuncuya yönlendirmek veya bir ray’i belirli bir noktaya çevirmek mümkün olur.
Çıkarma işleminin bir diğer gücü de "ne kadar uzaktayım?" bilgisini taşımasıdır: \((B - A)\) vektörünün boyu, iki nokta arasındaki mesafedir.
Bu yüzden aynı vektör, hem yön hem mesafe bilgisini birlikte taşır; önce normalize edip yön alır, sonra length ile mesafeyi okursun.
Three.js pratikleri: Bu işlemler genelde add(), sub() ve özellikle "hızlı entegrasyon" için addScaledVector() ile okunur: konumu güncellerken "hız × dt" ifadesini tek adımda uygularsın.
Mini pratik: Eğer hedefe doğru sabit hızla gitmek istiyorsan, önce \((hedef - konum)\) ile yönü bulur, sonra normalize edip hızla çarparsın, böylece mesafe büyüse bile hız kontrolün bozulmaz.
Takip davranışı (steering) sezgisi: Çoğu "takip et" sistemi aslında iki hız arasındaki farkı hesaplar: \(\text{desiredVel} - \text{currentVel}\).
Yani hedefe bakan yönü bulur, "istediğin hız"a çevirir ve aradaki farkı bir ivme/itki gibi uygular.
Bu yaklaşım, ani zıplamalar yerine daha doğal hareket üretir.
Dot Product Açı ve Aydınlatma
Dot product, iki vektörün ne kadar aynı yöne baktığını ölçer.
Normalize edilmiş iki vektör için sonuç sezgiseldir: 1 aynı yön, 0 dik \((90^\circ)\), -1 zıt yön.
Bu sezginin matematik karşılığı şudur: normalize iki vektör için dot sonucu \(\cos(\theta)\) değeridir.
Yani dot, açıyı doğrudan "skor"a çevirir: açı küçükse skor büyük, açı büyüdükçe skor küçüktür.
Bu yüzden dot product, trigonometrik hesap yapmadan "yakın mı, uzak mı?" gibi açısal kararlar vermeyi kolaylaştırır.
Pratik not: Hesaplamalarda dot değeri bazen sayısal hatalarla \([-1, 1]\) dışına taşabilir. Eğer açıya çevireceksen (ör. \(\arccos\)), çoğu zaman dot’u bu aralığa clamp etmek gerekir.
Bu bilgi 3D’de sürekli kullanılır: bir kameranın hedefe ne kadar dönük olduğu, bir karakterin "görüş konisinin" içinde olup olmadığı, veya güneş ışığının bir yüzeyi ne kadar aydınlattığığı gibi durumların hepsi açı sezgisini kullanır ve hepsinin merkezinde açı sezgisi vardır.
Örneğin: Görüş konisi (FOV) mantığı basittir: karakterin baktığı yön vektörü ile "hedefe giden yön" vektörünün dot’u, belli bir eşikten büyükse hedef görüş alanındadır.
Böylece "gördü mü, görmedi mi?" gibi kararları tek karşılaştırmaya indirirsin.
Derin Not: Işık Şiddeti = Normal • Işık Yönü"Güneş bu yüzeyi ne kadar aydınlatmalı?" sorusu, yüzeyin normal vektörü ile ışığın yön vektörü arasındaki dot product ile cevaplanır.
Dot değeri büyüdükçe ( yüzey ışığa daha dönük oldukça ) aydınlık artar; dikleşince azalır.
Dot’un negatif olması, yüzeyin ışığa arkasını döndüğü anlamına gelir; pratikte bu durumda katkı çoğu modelde 0’a kırpılır.
Bu davranış, temel Lambert aydınlatma sezgisinin çekirdeğidir.
Kamera örneği: Kamera yönü ile "kameradan objeye giden yön" arasındaki dot da benzer okunur: dot büyüdükçe obje kameranın ön hattına yakındır; dot 0’a yaklaşınca kenara kayar; dot negatife düşerse kameranın arkasına geçmiştir.
İçerik Odağı: Dot product’un gerçek gücü, açı'yı trigonometrik hesaplara boğmadan pratik bir skora çevirmesidir. Bu sayede 3D davranışları basit karşılaştırmalarla yönetebilirsin.
Bu yüzden dot product, "ileri seviye matematik" gibi görünse bile, pratikte 3D davranış tasarımının en sade araçlarından biridir: küçük bir dot kontrolü, sahnede çok karmaşık görünen kararları stabil hale getirir.
Vektörlerin Mekanik Gücü
Vektörlerin sadece sayılar olmadığını bizzat görün. Çıkarma işlemiyle bir hedefi nasıl takip edeceğinizi ve Dot Product ile ışığın bir yüzeye çarptığı andaki şiddetini canlı olarak manipüle edin.
Yön vektörünü üret, normalize et, büyüklüğü kontrol et; dot ile açı/ışık şiddeti sezgisini tek ekranda hisset.