Holodepth • Bilim temelleri • Fizik
Sahnenin dinamiği
Bir mesh havada asılı kalıyorsa bu bir bug değil: Three.js fizik simüle etmez; her karede transform yazar. Dinamik yerçekimi, hız, çarpışma tepkisi senin (veya bir motorun) zaman adımında eklediğin katmandır.
Bu sayfa Rapier/Cannon API sözlüğü değildir. Soru: “durma” ile “düşme” sahneye nereden girer? Cevap: kuvvet → ivme → hız → konum zinciri ve bunu kimin yazdığı.
Okuma sözleşmesi: burada fizik sahne dilinde anlatılır. Yerleşim matematiği için Sahnenin hesabı; motor / çarpışma derinliği için Fizik entegrasyonu, Temel fizik (Canvas).
Canlı demo: Rest or Fall
Aynı mesh, iki dünya. Kinematic modda yalnızca
position yazılır küre asılı kalır.
Dynamic modda her karede
v ← v − g·Δt,
y ← y + v·Δt
uygulanır; zeminde zıplama sönümü vardır. Bu bir fizik motoru değil;
dinamiğin sahneye “nasıl eklendiğinin” pedagojik modeli.
Bilim · Fizik · CANLI
Aynı gövde · kinematic transform vs Euler yerçekimi · g kaydırıcısı
Mod: kinematic Three.js yalnızca transform yazar; yerçekimi yok.
Neden çekirdekte fizik yok?
Three.js bir render ve sahne grafiği kütüphanesidir: mesh’leri, kameraları, ışıkları ve materyalleri yönetir. Fizik ise ayrı bir problem sınıfıdır kısıtlar, çarpışma manifold’ları, uyku halleri, sabit zaman adımı. Bunları çekirdeğe gömmek hem paket boyutunu hem de “yanlış varsayılan” riskini artırır.
Sonuç: mesh.position.y = 2 yazdığında obje “oraya konur”;
yerçekimi kendiliğinden işlemez. Matematik sayfasındaki transform hesabı
tamamlanmıştır; dinamik henüz başlamamıştır. Bu ayrım bilinçli bir mimari
karardır bug değil.
Sahne sezgisi
“Neden düşmüyor?” sorusunun cevabı çoğu zaman motor eksikliği değil, hiç kimsenin hız yazmamasıdır. Rest or Fall’da kinematic moda dönmek bunu anında gösterir.
Kuvvet, kütle ve ivme
Klasik nokta kütle modeli: F = m · a → a = F / m. Yerçekiminde (yaklaşık) F = m · g olduğundan a = g (aşağı yönlü). Demo’daki g kaydırıcısı bu ivmenin büyüklüğüdür; kütleyi ayrıca taşımıyoruz çünkü serbest düşüşte kütle sadeleşir.
Hız ve konum
İvme hızı değiştirir; hız konumu değiştirir:
v(t+Δt) ≈ v(t) + a·Δt
x(t+Δt) ≈ x(t) + v·Δt
Bu, sürekli diferansiyel denklemin ayrık (discrete) yaklaşımıdır. Sahnede “fizik” dediğimiz şey çoğu zaman bu iki satırın (ve çarpışma düzeltmelerinin) her karede tekrarlanmasıdır ister sen yaz, ister motor.
- Kuvvet F: yönlü bir “itme” (vektör); birden fazla kuvvet toplanır.
- Kütle m: aynı kuvvete ne kadar ivme düşeceğini ölçekler.
- İvme a: hızın değişim oranı.
Entegrasyon: Euler sezgisi
Bölüm 3’teki a → v → x zinciri sürekli zamanda yazılır. Ekran ise kare kare ilerler. Entegrasyon, o sürekliliği küçük Δt dilimlerine bölüp her dilimde hız ve konumu güncellemektir. Rest or Fall’un dinamik modu bunun en sade pedagojik örneğidir motor değil, “zaman adımında ne hesaplanır?” cevabı.
Her karede iki satır
Demo, yerçekiminde a = −g (Y aşağı) varsayar. Bir karede kabaca şu sıra işler:
- Hızı güncelle: v ← v + a·Δt (demo’da v ← v − g·Δt).
- Konumu yeni hızla ilerlet: y ← y + v·Δt.
- Sonra (isteğe bağlı) zemin kontrolü: penetrasyon varsa konumu düzelt, hızı yansıt / söndür.
Önce v, sonra x bu sıra literatürde sıkça semi-implicit Euler (veya symplectic Euler) diye anılır. Önce konumu eski hızla yazıp sonra hızı güncellemek (explicit Euler) aynı aileden ama farklı kararlılık davranışına sahiptir. İkisinin de ortak fikri aynıdır: türevi sonlu farkla yaklaşmak.
Küçük örnek
g = 10,
Δt = 0.016
(~60 FPS), başlangıç
v = 0.
İlk karede
v ≈ −0.16,
y
biraz düşer. Birkaç kare sonra
|v|
büyür “ivme birikti” hissi budur. Kinematic modda bu satırlar
hiç çalışmaz; yalnızca
position.y = 2.2
yazılır.
Bu şema ne değildir?
Euler entegrasyonu anlaşılır ve ucuz; bu yüzden demoda var. Büyük Δt, sert yaylar veya yüksek restitution ile enerji şişebilir veya çözelti “patlar”. Oyun motorları bu yüzden Verlet, RK4, kısıt çözücüler veya sabit alt-adımlar kullanır. Fikir yine aynıdır sürekli hareketi dilimlere bölmek ama hata ve kararlılık bütçesi farklıdır.
Zaman adımının kendisi (değişken kare süresi vs fixed timestep) bir sonraki nabız bölümünde; burada yalnızca şunu tut: entegrasyon formülü ile Δt politikası ayrı kararlardır.
Matematik köprüsü
Konumu yazmak (transform) ile hızı entegre etmek farklı işlerdir. İlki Sahnenin hesabı’nda; ikincisi burada. İkisi de ℝ³ vektörleriyle konuşur; soruları farklıdır: “nerede?” vs “nasıl değişiyor?”.
Entegrasyondan sonra: tepki ayrı katman
Zemin temasında demo hızı yansıtır ve söndürür (v ← −e·v benzeri). Bu satır Euler’in parçası değildir; entegrasyon bittikten sonra uygulanan bir tepki kuralıdır “impulse / restitution” fikrinin tek satırlık karikatürü.
Gerçek motor aynı anda contact manifold, sürtünme konisi ve çoğu zaman birden fazla kısıt çözer. O köprü Çarpışma ve tepki bölümünde; burada önemli ayrım: hareketi ilerletmek (entegrasyon) ile teması düzeltmek (tepki) aynı cümlede karışmamalıdır.
Kinematic ≠ dinamik
Motor jargonunda kinematic gövde: sen (veya animasyon) konumu dayatırsın; dünya ona tepki verir ama o “kütleli tepki” üretmez. Dynamic gövde: kuvvetler / çarpışmalar hızı yazar; konum entegrasyondan gelir. Three.js çekirdeğinde her mesh varsayılan olarak “kinematic gibi”dir çünkü hiç kimse hız tutmaz.
İki dünya
| Kinematic (varsayılan sahne) | Dinamik (eklenen katman) | |
|---|---|---|
| Kim yazar? | Sen / animasyon / kamera kontrolü | Entegrasyon veya fizik motoru |
| Durum | x (konum / oryantasyon) | x, v (+ bazen ω) |
| Kütle / kuvvet | Yok | Var (basit veya motor) |
| Çarpışma | İsteğe bağlı ray / AABB testi | Contact + tepki |
| Holodepth derin sayfa | Sahnenin hesabı | Çarpışma mantığı |
Zaman adımı ve sabit nabız
Demo’daki Δt kare süresidir (rAF aralığı). FPS düşerse aynı g ile daha büyük adımlar atılır; zıplama “daha çılgın” görünür. Oyunlarda bu yüzden fixed timestep tercih edilir: fizik 1/60 s (veya benzeri) dilimlerde ilerler; render ayrı hızda interpolasyon yapabilir.
Clock ve rAF ne sağlar?
Three.js Clock / requestAnimationFrame yalnızca
zamanı ölçer. Entegrasyon politikası değişken
Δt,
sabit adım, max alt-adım sayısı sana (veya motora) aittir.
“Fizik bozuldu” şikâyetinin önemli bir kısmı yanlış kuvvet değil,
kontrolsüz zaman adımıdır.
İleri okuma: Delta time, requestAnimationFrame.
Çarpışma ve tepki (köprü)
Serbest düşüş (entegrasyon) tek başına yetmez. Cisim zeminle veya başka bir gövdeyle örtüşünce iki ayrı iş çıkar: tespit (“değdiler mi?”) ve tepki (“şimdi ne yapalım?”). Rest or Fall zemini bu ikisini tek satırda karikatürize eder; gerçek boru hattı daha katmanlıdır.
Tespit ≠ tepki
Tespit, geometrik bir sorudur: iki şekil kesişiyor mu, ne kadar penetrasyon var, temas noktası / normal nedir? Tepki ise dinamik bir sorudur: hızı nasıl değiştiririm, konumu nasıl düzelteyim, enerji / sürtünme nasıl işlesin? Euler bölümündeki v ← −e·v ikinci gruba aittir önce “zeminin altındayım” bilgisi gelir, sonra yansıtma.
Demo’daki sade yol
Rest or Fall: y − r < 0 ise konumu zemine yasla, hızı yansıt ve söndür. Bu, geniş/dar faz ayrımı yapmaz; tek düzlem, tek küre. Pedagojik amaç: tepkinin entegrasyondan sonra geldiğini göstermek.
Geniş faz → dar faz → impulse
Ölçek büyüyünce motorlar işi üçe böler:
- Geniş faz (broad phase): ucuz kaba filtre AABB, sweep, spatial hash. “Kesinlikle değmez” çiftleri erken eleyerek maliyeti düşürür.
- Dar faz (narrow phase): kalan çiftlerde gerçek şekil testi (küre–küre, kutu–üçgen, convex…). Penetrasyon derinliği ve contact normal burada çıkar.
- Impulse / kısıt çözümü: hızları (ve gerekirse konumları) fiziksel tepkiye göre düzeltir. Restitution, sürtünme, uyku hali burada devreye girer.
Bu sayfa o boru hattını kodlamaz; sözleşmeyi kurar. Derinlik: Çarpışma mantığı, AABB.
Raycaster ≠ fizik ışını
Three.js Raycaster çoğunlukla seçim / picking
içindir: “bu piksel hangi meshe değiyor?”
Fizik motorundaki ray cast ise sıklıkla aynı geometri fikrini
sorgu olarak kullanır: yer testi, görüş hattı, projectile.
Ortak dil “ışın × şekil”; amaç farklıdır biri etkileşim UI’si, diğeri
dünya sorgusu.
Ayrıntılı ayrım: Raycaster vs fizik ışını. Görünen mesh ile collider şeklinin aynı olmak zorunda olmadığı ise Sahnenin şekli köprüsünün işidir.
Sürtünme ve damping
Entegrasyon hızı üretir; çarpışma tepkisi hızı anlık değiştirebilir. Sürtünme ve damping ise hızı zamanla yer “neden bir süre sonra duruyor / kayma hissi azalıyor?” sorusunun cevabıdır.
Sürtünme sezgisi
Klasik sürtünme, temasta hıza (veya kayma eğilimine) karşı kuvvet üretir; mekanik enerjiyi ısıya (veya sayısal sönüme) çevirir. Statik sürtünme “henüz kaymıyorsa tut”; kinetik sürtünme “kayarken yavaşlat” ayrımı oyunlarda sıkça basitleştirilir veya tek bir parametreye indirgenir.
Rest or Fall demosunda yatay sürtünme yoktur yalnızca düşey restitution karikatürü. Gerçek zeminde kayma, yuvarlanma ve açısal hız (ω) ayrı kanallardır; motor bunları contact manifold üzerinde çözer.
Dijital damping: kontrol edilebilir sönüm
Oyunlarda sıkça görülen yol: v ← v · (1 − d) (veya v ← v · e−λ·Δt benzeri üstel sönüm). Bu, Newton sürtünme yasası değildir; tasarım parametresidir “ne kadar çabuk dursun?” sorusuna doğrudan cevap verir.
Sahne sezgisi
d = 0 → hız korunur (sürtünmesiz kayma hissi). d büyüdükçe her karede daha çok “öldürülür”; çok büyük d veya kötü Δt ile hareket yapışkan veya FPS’e bağımlı hissedilir. Yine: formül ile zaman adımı politikası ayrıdır.
OrbitControls ve motor damping
Three.js OrbitControls damping’i aynı aileden gelir: kamera
“hızını” her karede biraz azaltır; bırakınca yumuşak durur.
Fizik motorlarındaki linear / angular damping de gövde hızlarını benzer
şekilde söndürür. Akrabalık sayısal sönüm fikrindedir
bu, çekirdek Three.js’in yerçekimi veya sürtünme simüle ettiği anlamına
gelmez.
Uygulama yüzeyi: Damping. Motor tarafında sürtünme / restitution parametreleri ise çarpışma ve entegrasyon sayfalarına aittir; bu köprü yalnızca “hız neden zamanla ölür?” sezgisini kurar.
Sık karışan noktalar
- “Three.js fizik yapmalı.” Hayır. Render + sahne grafiği; dinamik opt-in katmandır.
- “Transform = fizik.” Hayır. Transform yerleşim yazar; fizik hız/ivme entegre eder Sahnenin hesabı.
- “Mesh şekli = dinamik gövde.” Hayır. Görünen geometri ile çarpışma şekli (collider) ayrı sözleşmelerdir Sahnenin şekli.
- “Δt’yi umursama.” Hayır. Değişken kare süresi, aynı g ile farklı yörüngeler üretir; sabit adım düşün.